|
|
pl:prolog:pllib:grammar2clauses [2019/06/27 15:50] |
pl:prolog:pllib:grammar2clauses [2019/06/27 15:50] (aktualna) |
| ====== Grammar2clauses ====== |
| {{tag>rules DCG}} |
| ===== Description ===== |
| Translating grammar rules to Prolog clauses |
| |
| **Source**: The Art of Prolog |
| ===== Download ===== |
| Program source code: {{grammar2clauses.pl}} |
| ===== Listing ===== |
| <code prolog> |
| /* |
| translate(Grammar,Program) :- |
| Program is the Prolog equivalent of the context-free |
| grammar Grammar. |
| */ |
| |
| :- op(40,xfx,\). |
| |
| translate([Rule|Rules],[Clause|Clauses]) :- |
| translate_rule(Rule,Clause), |
| translate(Rules,Clauses). |
| translate([ ],[ ]). |
| |
| /* |
| translate_rule(GrammarRule,PrologClause) :- |
| PrologClause is the Prolog equivalent of the grammar |
| rule GrammarRule. |
| */ |
| translate_rule((Lhs --> Rhs),(Head :- Body)) :- |
| translate_head(Lhs,Head,Xs\Ys), |
| translate_body(Rhs,Body,Xs\Ys),!. |
| |
| translate_head(A,A1,Xs) :- |
| translate_goal(A,A1,Xs). |
| |
| translate_body((A,B),(A1,B1),Xs\Ys) :- |
| !, translate_body(A,A1,Xs\Xs1), translate_body(B,B1,Xs1\Ys). |
| translate_body(A,A1,Xs) :- |
| translate_goal(A,A1,Xs). |
| |
| translate_goal(A,A1,DList) :- |
| nonterminal(A), functor(A1,A,1), arg(1,A1,DList). |
| translate_goal(Terms,connect(Terms,S),S) :- |
| terminals(Terms). |
| |
| non_terminal(A) :- atom(A). |
| |
| terminals(Xs) :- list(Xs). |
| |
| list([]). |
| list([X|Xs]) :- list(Xs). |
| |
| % Program 18.9: Translating grammar rules to Prolog clauses |
| </code> |
| ===== Comments ===== |
| |