带有序言错误的自然语言处理

问题描述

我是使用 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 (将#修改为@)