Domains. Multexp(TOKL,TOKL,EXP)
TOKL = STRING*
EXP=var(STRING);
Plus(EXP,EXP);
Mult(EXP,EXP)
PREDICATES
Run
Tokl(STRING,TOKL)
S_exp(TOKL,TOKL,EXP)
Multexp(TOKL,TOKL,EXP)
Multexp1(TOKL,TOKL,EXP,EXP)
Plusexp(TOKL,TOKL,EXP)
Plusexp1(TOKL,TOKL,EXP,EXP)
Elmexp(TOKL,TOKL,EXP)
GOAL
Run.
CLAUSES
run:– makewindow(1,2,7,"",0,0,25,80),
Readln(STR),tokl(STR,TOKL),
S_exp(TOKL,_,EXP), write(EXP),nl.
tokl(STR,[TOK|TOKL]):–
Fronttoken(STR,TOK,STR1),
Tokl(STR1,TOKL).
tokl(_,[]).
s_exp(IL,OL,EXP):–plusexp(IL,OL,EXP).
plusexp(IL,OL,EXP2):–
Multexp(IL,OL1,EXP1),
Plusexp1(OL1,OL,EXP1,EXP2).
plusexp1(["+"|IL],OL,EXP1,EXP3):–
Multexp(IL,OL1,EXP2),
Plusexp1(OL1,OL, plus(EXP1,EXP2),EXP3).
Plusexp1(IL,IL,EXP,EXP).
multexp(IL,OL,EXP2):–
Elmexp(IL,OL1,EXP1),
Multexp1(OL1,OL,EXP1,EXP2).
multexp1(["*"|IL],OL,EXP1,EXP3):–
Elmexp(IL,OL1,EXP2),
Multexp1(OL1,OL, mult(EXP1,EXP2),EXP3).
Multexp1(IL,IL,EXP,EXP).
elmexp([NAME|IL],IL, var(NAME)).
25. Еще один пример анализатора, строящего дерево синтаксического разбора для простого английского выражения. Предложение, подлежащее разбору, должно соответствовать следующей грамматике:
<SENTENCE> ::= <NOUN PHRASE> <VERB PHRASE>
<NOUN PHRASE> ::=<DETERMINER> <noun> <RELATIONAL CLAUSE>
<DETERMINER> ::= < > | <determiner>
<RELATIONAL CLAUSE> ::= < > | <relative> <VERB PHRASE>
<VERB PHRASE> ::= <verb> | <NOUN PHRASE>
Программа на Прологе:
DATABASE %Слова , которые должны быть распознаны
det( STRING ) % Определитель
noun( STRING ) % Существительное
rel( STRING ) % Предлог
verb( STRING ) % Глагол
DOMAINS % Описание грамматики
DETERM = none ; determ( STRING )
NOUNP = nounp( DETERM, STRING, RELCL)
RELCL = none ; relcl( STRING, VERBP )
SENTENCE = sent( NOUNP, VERBP )
VERBP = verb( STRING ) ; verbp( STRING, NOUNP )
TOKL = STRING*
PREDICATES
Is_det( STRING )
Is_noun( STRING )
Is_rel( STRING )
Is_verb( STRING )
S_determ( TOKL, TOKL, DETERM )
S_nounp( TOKL, TOKL, NOUNP )
S_relcl( TOKL, TOKL, RELCL )
S_sentence( TOKL, TOKL, SENTENCE )
S_verbp( TOKL, TOKL, VERBP )
Tokl( STRING, TOKL )
Tom(TOKL)
Run1
Run2(STRING)
Sen_an
GOAL makewindow(1,6,0,"",0,0,25,80),
sen_an.
CLAUSES
sen_an:– write("Try: every man that lives loves a woman"),
readln(LIN), LIN >< "" ,
Tokl(LIN,TOKL),
S_sentence( TOKL, _, SENT),
write("PROLOG OBJECT=",SENT," "),
readchar(_),clearwindow,!.
tokl(STR,[TOK|TOKL]) :–
Fronttoken(STR,TOK,STR1),
Tokl(STR1,TOKL).
tokl(_,[ ]).
s_sentence(TOKL,TOKL2,sent(NOUNP,VERBP)):–
S_nounp(TOKL,TOKL1,NOUNP),
S_verbp(TOKL1,TOKL2,VERBP),
TOKL2=[ ],!.
s_sentence(_,_,_):–write(">> Sentence not recognized \n"),fail.
% Группа подлежащего
s_nounp(TOKL,TOKL2,nounp(DETERM,NOUN,RELCL)):–
s_determ(TOKL,[NOUN|TOKL1],DETERM),
Is_noun(NOUN),
s_relcl(TOKL1,TOKL2,RELCL).
% Определитель
s_determ([DETERM|TOKL],TOKL,determ(DETERM)):–