definite clause grammars

Post on 21-Mar-2016

33 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

Definite Clause Grammars. t.k.prasad@wright.edu http://www.knoesis.org/tkprasad/. Review : Difference Lists. Represent list L as a difference of two lists L1 and L2 E.g., consider L = [a,b,c] and various L1-L2 combinations given below. Review: Append using Difference Lists. - PowerPoint PPT Presentation

TRANSCRIPT

cs7120 (Prasad) L21-DCG 1

Definite Clause Grammars

t.k.prasad@wright.eduhttp://www.knoesis.org/tkprasad/

Review : Difference Lists • Represent list L as a difference of two lists

L1 and L2– E.g., consider L = [a,b,c] and various L1-L2

combinations given below.

cs7120 (Prasad) L21-DCG 2

L1 L2[a,b,c|T] T

[a,b,c,d|T] [d|T]

Review: Append using Difference Lists

append(X-Y, Y-Z, X-Z).• Ordinary append complexity = O(length of first list)• Difference list append complexity = O(1)

cs7120 (Prasad) L21-DCG 3

X

Y

Z

X-Y

Y-Z

Y

Z

Z

X-Z

Running append goal

cs7120 (Prasad) L21-DCG 4

DCGs

• Mechanize attribute grammar formalism (a generalization of CFG)– Executable specification

• Use difference lists for efficiency

• Translation from DCGs to Prolog clauses is automatic

cs7120 (Prasad) L21-DCG 5

Sample Applications of DCGs

• Coding recursive descent backtracking parser

• Encoding and checking context-sensitive constraints

• Simple NLP

• In general, enabling syntax directed translation

• E.g., VHDL Parser-Pretty Printer

cs7120 (Prasad) L21-DCG 6

DCG Example : Syntaxsentence --> noun_phrase, verb_phrase.noun_phrase --> determiner, noun.verb_phrase --> verb, noun_phrase.determiner --> [a].determiner --> [the].determiner --> [many].noun --> [president].noun --> [cat].noun --> [cats].verb --> [has].verb --> [have].

cs7120 (Prasad) L21-DCG 7

DCG to Ordinary Prolog Syntaxsentence(S,R) :-

noun_phrase(S,T), verb_phrase(T,R).noun_phrase(S,T) :- determiner(S,N), noun(N,T).verb_phrase(T,R) :- verb(T,N), noun_phrase(N,R).determiner([a|R],R).determiner([the|R],R).determiner([many|R],R).noun([president|R],R).noun([cat|R],R).noun([cats|R],R).verb([has|R],R).verb([have|R],R).

cs7120 (Prasad) L21-DCG 8

Queries?- sentence([the, president, has, a, cat], []).

?- sentence([the, cats, have, a, president], []).

?- sentence([a, cats, has, the, cat, president], [president]).

?- sentence([a, cats, has, the, cat, President], [President]).

• Each non-terminal takes two lists as arguments. • In difference list representation, they together

stand for a single list.

cs7120 (Prasad) L21-DCG 9

DCG Example: Number Agreement

sentence --> noun_phrase(N),verb_phrase(N).noun_phrase(N) --> determiner(N), noun(N).verb_phrase(N) --> verb(N), noun_phrase(_).

determiner(sgular) --> [a].determiner(_) --> [the].determiner(plural) --> [many].

noun(sgular) --> [president].noun(sgular) --> [cat].noun(plural) --> [cats].verb(sgular) --> [has].verb(plural) --> [have].

cs7120 (Prasad) L21-DCG 10

Extension: AST plus Number agreement

sentence(s(NP,VP)) --> noun_phrase(N, NP),verb_phrase(N, VP).

noun_phrase(N, np(D,NT)) --> determiner(N, D), noun(N, NT).

verb_phrase(N, vp(V,NP)) --> verb(N, V), noun_phrase(_, NP).

determiner(sgular, dt(a)) --> [a].

determiner(_, dt(the)) --> [the].

determiner(plural, dt(many)) --> [many].

noun(sgular, n(president)) --> [president].

noun(sgular, n(cat)) --> [cat].

noun(plural, n(cats)) --> [cats].

verb(sgular, v(has)) --> [has].

verb(plural, v(have)) --> [have].

cs7120 (Prasad) L21-DCG 11

Queries?- sentence(T,[the, president, has, a, cat], []).

T = s(np(dt(the), n(president)), vp(v(has), np(dt(a), n(cat)))) ;

?- sentence(T,[the, cats, have, a, president|X], X).

?- sentence(T,[a, cats, has, the, cat, preside], [preside]).

• Each non-terminal takes two lists as arguments for input sentences, and additional arguments for the static semantics (e.g., number and AST).

• Number disagreement causes the last query to fail.

cs7120 (Prasad) L21-DCG 12

Prefix Expression DCG

expr --> [if], expr, [then], expr,

[else], expr.

expr --> [’+’], expr, expr.

expr --> [’*’], expr, expr.

expr --> [m].

expr --> [n].

expr --> [a].

expr --> [b].

cs7120 (Prasad) L21-DCG 13

Queries

?-expr([’*’, m, n], []).

?-expr([m, ’*’, n], []).

?-expr([’*’, m, ’+’, ’a’, n, n], [n]).

?-expr([if, a, then, m, else, n], []).

?-expr([if, a, then, a, else, ’*’, m, n], []).

cs7120 (Prasad) L21-DCG 14

Prefix Expression DCG : Type Checking Version

tExpr(T) --> [if], tExpr(bool), [then], tExpr(T),

[else], tExpr(T).

tExpr(T) --> [’+’], tExpr(T), tExpr(T).

tExpr(T) --> [’*’], tExpr(T), tExpr(T).

tExpr(int) --> [m].

tExpr(int) --> [n].

tExpr(bool) --> [a].

tExpr(bool) --> [b].

• Assume that + and * are overloaded for int and bool.

cs7120 (Prasad) L21-DCG 15

Queries

?-tExpr(T,[’*’, m, n], []).

?-tExpr(T,[m, ’*’, n], []).

?-tExpr(T,[’*’, m, ’+’, ’a’, n, n], [n]).

?-tExpr(T,[if, a, then, m, else, n], []).

T = int ;

?-tExpr(T,[if, a, then, b, else, ’*’, m, n], []).

cs7120 (Prasad) L21-DCG 16

Prefix Expression DCG : Type Checking and Evaluation Version

evalExpr(V) --> etExpr(V,_).

etExpr(V,T) --> [if], etExpr(B,bool), [then],

etExpr(V1,T), [else], etExpr(V2,T),

{B==true -> V = V1 ; V = V2}.

etExpr(V,bool) --> [’+’],

etExpr(V1,bool), etExpr(V2,bool),

{or(V1,V2,V)}.

etExpr(V,int) --> [’+’],

etExpr(V1,int), etExpr(V2,int),

{V is V1 + V2}.

cs7120 (Prasad) L21-DCG 17

(cont’d)

etExpr(V,bool) --> [’*’],

etExpr(V1,bool), etExpr(V2,bool),

{and(V1,V2,V)}.

etExpr(V,bool) --> [’*’],

etExpr(V1,int), etExpr(V2,int),

{V is V1 * V2}.

etExpr(V,int) --> [m], {value(m,V)}.

etExpr(V,int) --> [n], {value(n,V)}.

etExpr(V,bool) --> [a], {value(a,V)}.

etExpr(V,bool) --> [b], {value(b,V)}.

cs7120 (Prasad) L21-DCG 18

(cont’d)

value(m,10). value(n,5).value(a,true).value(b,false).

and(true,true,true). and(true,false,false).and(false,true,false).

and(false,false,false).

or(true,true,true). or(true,false,true).or(false,true,true). or(false,false,false).

cs7120 (Prasad) L21-DCG 19

Prefix Expression DCG : AST Version

treeExpr(V) --> trExpr(V,_).

trExpr(cond(B,V1,V2),T) -->

[if], trExpr(B,bool), [then], trExpr(V1,T),

[else], trExpr(V2,T).

trExpr(or(V1,V2),bool) --> [’+’],

trExpr(V1,bool), trExpr(V2,bool).

trExpr(plus(V1,V2),int) --> [’+’],

trExpr(V1,int), trExpr(V2,int).

cs7120 (Prasad) L21-DCG 20

(cont’d)

trExpr(and(V1,V2),bool) --> [’*’],

trExpr(V1,bool), trExpr(V2,bool).

trExpr(mul(V1,V2),int) --> [’*’],

trExpr(V1,int), trExpr(V2,int).

trExpr(m,int) --> [m].

trExpr(n,int) --> [n].

trExpr(a,bool) --> [a].

trExpr(b,bool) --> [b].

cs7120 (Prasad) L21-DCG 21

Other Compiler Operations• From parse tree and type information, one

can:– compute (stack) storage requirements for

variables and for expression evaluation– generate assembly code (with coercion

instructions if necessary)– transform/simplify expression

• Ref: http://www.cs.wright.edu/~tkprasad/papers/Attribute-Grammars.pdf

cs7120 (Prasad) L21-DCG 22

Variation on Expression GrammarsInefficient

Backtracking Parser Exists

E -> T + E | T T -> F * T | F F -> (E) | x | y

Unsuitable Grammar

E -> E + E | E * E | x | y

cs7120 (Prasad) L21-DCG 23

RELATIONSHIP TO ATTRIBUTE GRAMMARS

4

5

Attribute Grammars

• Formalism for specifying semantics based on context-free grammars (BNF) Static semantics (context-sensitive aspects)

Type checking and type inference Compatibility between procedure definition and call

Dynamic semantics

• Associate attributes with terminals and non-terminals

• Associate attribute computation rules with productions

cs7120 (Prasad) L21-DCG 26

• AttributesAttributes A(X)– Synthesized S(X)– Inherited I(X)

• Attribute computation rulesAttribute computation rules (Semantic functions)

X0 -> X1 X2 … Xn

S(X0) = f( I(X0), A(X1), A(X2), …, A(Xn) )I(Xj) = Gj( I(X0), A(X1), A(X2), …, A(Xj-1)) for all j in 1..n P( A(X0), A(X1), A(X2), …, A(Xn) )

cs7120 (Prasad) L21-DCG 27

Information Flowinherited

synthesized

computedcomputed

availableavailable

cs7120 (Prasad) L21-DCG 28

• Synthesized AttributesSynthesized Attributes Pass information up the parse tree

• Inherited AttributesInherited Attributes Pass information down the parse tree or

from left siblings to the right siblings• Attribute values assumed to be available from the

context.• Attribute values computed using the semantic rules

provided. The constraints on the attribute evaluation rules

permit top-down left-to-right (one-pass) traversal of the parse tree to compute the meaning.

cs7120 (Prasad) L21-DCG 29

An Extended Example• Distinct identifiers in a straight-line program.BNF<exp> ::= <var> | <exp> + <exp><stm> ::= <var> := <exp> | <stm> ; <stm>

Attributes <var> id <exp> ids <stm> ids num

• Semantics specified in terms of sets (of identifiers).

cs7120 (Prasad) L21-DCG 30

<exp> ::= <var><exp>.ids = { <var>.id } <exp> ::= <exp1> + <exp2><exp>.ids = <exp>.ids U <exp>.ids <stm> ::= <var> := <exp><stm>.ids ={ <var>.id } U <exp>.ids<stm>.num = | <stm>.ids | <stm> ::= <stm1> ; <stm2><stm>.ids = <stm1>.ids U <stm2>.ids<stm>.num = | <stm>.ids |

cs7120 (Prasad) L21-DCG 31

Alternative Semantics using lists• Attributes

envi : list of vars in preceding context envo : list of vars for following context dnum : number of new variables

<exp> ::= <var><exp>.envo = if member(<var>.id,<exp>.envi) then <exp>.envi else cons(<var>.id,<exp>.envi)

cs7120 (Prasad) L21-DCG 32

<exp> ::= <exp1> + <exp2>

envi envi envi envo envo envo dnum dnum dnum

<exp1>.envi = <exp>.envi <exp2>.envi = <exp1>.envo <exp>.envo = <exp2>.envo <exp>.dnum = length(<exp>.envo)

Attribute Computation Rules

top related