问题描述
我是使用 prolog 的新手,我正在尝试以这种方式解析和翻译文本:
?- go.
|: All boys run.
s(np(det(all),noun(boys)),vp(verb(run)))
S = all(_4326,boy(_4326)->run(_4326))
但是我遇到了一个错误:我运行 go.
来获取翻译,我收到以下错误:
go.
|: All boys run
**ERROR: Stream user_input:242:4 Syntax error: Operator expected**
这是我的代码。
% Tokenizer
go1(Out):-
read(X),name(X,L),tokenize(L,Out).
tokenize([],[]):- !.
tokenize(L,[Word|Out]):- L\==[],Rest,WordChs),name(Word,tokenize(Rest,[],[]):- !.
tokenize([46|_],[]):- !.
tokenize([32|T],T,[]):- !.
tokenize([H|T],[H|List]):-
tokenize(T,List).
% Main predicate
go :-
%go1(X),readln(X,_,lowercase),reset_gensym,sentence(P,X,[]),translator(P,R),write(R).
%Operator's deFinition
:- op(600,xfy,=>).
:- op(500,&).
%Grammar + Parser
sentence(sentence(NP,VP)) --> noun_phrase(Num,NP),verb_phrase(Num,VP).
%test cases
% All boys run
% All boys like all watermelons that contain some divine flavor
% Some boy eats some apple
% Some government conscripts some pacifist people
% All government that conscripts pacifist people are evil
noun_phrase(Num,np(DET,N)) --> determiner(Num,DET),noun(Num,N).
noun_phrase(Num,np(ADJ,N)) --> adjective(ADJ),ADJ,adjective(ADJ),N,RCL)) --> determiner(Num,N),relative_clause(Num,RCL).
noun_phrase(Num,np(N)) --> noun(Num,N).
verb_phrase(Num,vp(V)) --> verb(Num,itrans,V).
verb_phrase(Num,vp(V,NP)) --> verb(Num,trans,V),noun_phrase(_,NP).
verb_phrase(Num,vp(BV,ADJ)) --> beVerb(Num,BV),adjective(ADJ).
relative_clause(Num,rcl(REL,VP)) --> rel(REL),VP).
relative_clause(Num,NP,V)) --> rel(REL),noun_phrase(Num,verb(Num,V).
adjective(adj(good)) --> [good].
adjective(adj(evil)) --> [evil].
adjective(adj(big)) --> [big].
adjective(adj(divine)) --> [divine].
adjective(adj(pacifist)) --> [pacifist].
adjective(adj(nice)) --> [nice].
is_det(plural,all).
is_det(singular,a).
is_det(_,the).
is_det(_,some).
determiner(Num,determiner(D)) --> [D],{is_det(Num,D)}.
is_noun(plural,boys).
is_noun(singular,boy).
is_noun(plural,girls).
is_noun(singular,girl).
is_noun(plural,people).
is_noun(singular,person).
is_noun(plural,apples).
is_noun(singular,apple).
is_noun(plural,watermelons).
is_noun(singular,watermelon).
is_noun(plural,rabbits).
is_noun(plural,carrots).
is_noun(plural,evil).
is_noun(plural,governments).
is_noun(singular,government).
is_noun(singular,flavor).
noun(Num,noun(N)) --> [N],{is_noun(Num,N)}.
is_verb(plural,like).
is_verb(singular,likes).
is_verb(plural,eat).
is_verb(singular,eats).
is_verb(plural,run).
is_verb(singular,runs).
is_verb(plural,contain).
is_verb(singular,contains).
is_verb(plural,conscript).
is_verb(singular,conscripts).
verb(Num,Tp,v(V)) --> [V],{is_verb(Num,V)}.
beVerb(plural,bv(tastes)) --> [taste].
beVerb(plural,bv(iss)) --> [are].
beVerb(singular,bv(iss)) --> [iss].
beVerb(singular,bv(sounds)) --> [sounds].
rel(rel(that)) --> [that].
% Rules for translator
translator(sentence(NP,VP),F) :-
% genera un unico atomo de la X y lo unifica en Var
gensym(x,Var),np(Var,T),vp(Var,VP,F).
% Translation of noun phrase
np(Var,R) :-
n(Var,P1),det(DET,P1,R).
np(Var,R) :-
adj(Var,n(Var,P2),P2,RCL),rcl(Var,RCL,np(N),R).
rcl(Var,rcl(_,R) :- vp(Var,R).
% This predicate add an implication or conjuction between F1 and F2
q_join(all,V,F1,F2,all(V,F1 => F2)).
q_join(exists,exists(V,F1 & F2)).
% Translation of verb phrase
vp(Var,P,vp(V),R) :-
P =.. [Q,V1,F1],v(Var,C),q_join(Q,C,R).
vp(Var,vp(bv(BVERB),adj(ADJ)),C =.. [BVERB,Var,ADJ],R) :-
P =.. [Q1,gensym(x,X),np(X,T =.. [Q2,V2,F2],q_join(Q2,R1),q_join(Q1,R1,R).
% Terminals symbols,they create functors
det(determiner(all),R) :-
P =.. [_,F],R =.. [all,!.
det(determiner(_),P).
n(Var,noun(N),exists(Var,P)) :- P =.. [N,Var].
n(Var,A,(P & A))) :- P =.. [N,Var].
v(Var,v(V),P) :- P =.. [V,Var].
v(V1,Var].
adj(Var,adj(ADJ),P) :- P =.. [ADJ,Var].
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)