Logic Programming

Shared by: HC121103185645
Categories
Tags
-
Stats
views:
0
posted:
11/3/2012
language:
Luxembourgish
pages:
31
Document Sample
scope of work template
							           Definite Clause Grammars

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


cs774 (Prasad)                 L10DCG               1
            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.


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

cs774 (Prasad)                 L10DCG                  2
      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)
                        X-Z

X                    X-Y                    Y

                           Y      Y-Z                  Z

                                           Z           Z

    cs774 (Prasad)             L10DCG                        3
                        DCGs
• Mechanize attribute grammar formalism (a
  generalization of CFG)
      – Executable specification
• Use difference lists for efficiency

• Translation from DCGs to Prolog clauses is
  automatic
cs774 (Prasad)            L10DCG               4
     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
cs774 (Prasad)                 L10DCG            5
                 DCG Example : Syntax
sentence --> 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].
cs774 (Prasad)           L10DCG          6
  DCG to Ordinary Prolog Syntax
sentence(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).


cs774 (Prasad)        L10DCG                       7
                       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.

cs774 (Prasad)              L10DCG                           8
      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].


cs774 (Prasad)              L10DCG            9
 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].

cs774 (Prasad)              L10DCG                             10
                                     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, AST, etc).
• Number disagreement causes the last query to fail.

cs774 (Prasad)                              L10DCG                                   11
                 Prefix Expression DCG
expr --> [if], expr, [then], expr,

                   [else], expr.

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

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

expr --> [m].

expr --> [n].

expr --> [a].

expr --> [b].
cs774 (Prasad)             L10DCG        12
                   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], []).




cs774 (Prasad)        L10DCG                     13
   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.

cs774 (Prasad)                  L10DCG                   14
                   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], []).



cs774 (Prasad)        L10DCG                    15
                   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}.

cs774 (Prasad)               L10DCG                     16
                         (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)}.


cs774 (Prasad)              L10DCG                   17
                       (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).




cs774 (Prasad)           L10DCG                       18
             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).



cs774 (Prasad)              L10DCG                     19
                            (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].




cs774 (Prasad)               L10DCG                  20
         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

cs774 (Prasad)                     L10DCG                                   21
       Variation on Expression Grammars
       Inefficient
                                  Unsuitable Grammar
Backtracking Parser Exists


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

cs774 (Prasad)           L10DCG                        22
             RELATIONSHIP TO
           ATTRIBUTE GRAMMARS



cs774 (Prasad)    L10DCG        23
                       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
CS784 (Prasad)                        L167AG                             24
• Attributes           A(X)
     – Synthesized     S(X)
     – Inherited        I(X)
• Attribute 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) )

cs774 (Prasad)             L10DCG                    25
                   Information Flow
             inherited                         computed

                                               available
            synthesized




                          ...            ...




cs774 (Prasad)                  L10DCG                     26
• Synthesized Attributes
          Pass information up the parse tree
• Inherited 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.
cs774 (Prasad)         L10DCG                      27
                 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).
CS784 (Prasad)           L167AG                        28
   <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 |
CS784 (Prasad)          L167AG                  29
                 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)
cs774 (Prasad)                 L10DCG                 30
                 Attribute Computation Rules
        <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)

cs774 (Prasad)                 L10DCG                   31

						
Related docs
Other docs by HC121103185645
Revised Schedule VI
Views: 30  |  Downloads: 0
b Cockpit Voice
Views: 13  |  Downloads: 0
01 3L Preface Sep2010
Views: 1  |  Downloads: 0
CE 208 Rev 8 FAA MMEL
Views: 242  |  Downloads: 0
f146e7 bffd0d73db90faaf79c9461e63fc077c
Views: 0  |  Downloads: 0
Elegant Newsletter
Views: 5  |  Downloads: 0
JOB DESCRIPTION
Views: 1  |  Downloads: 0
Dear EDI Trading Partner,
Views: 4  |  Downloads: 0