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)):–