此刻我有循环回问题noun_phrase
从np2
。 我在想,如果有人能帮助我循环回noun_phrase
。 下面是一些代码:
noun_phrase([X|T],(det(X), NP2),Rem):-
det(X),
np2(T,NP2,Rem).
np2([H|T],np2(adj(H),Rest),NP) :-
adj(H),
np2(T,Rest,Rem),
noun_phrase(NP,Rem,_).
我想从环np2
回noun_phrase
。 我认为对于代码np2
是错误的,因为我只是破解它在一起。
直接在Prolog的编码语法是一个相当繁琐的过程。 是的,你可以做到这一点,但如果你刚开始学习Prolog的你是不是在最好的位置。 事实上,花了许多科学年内想出一个特别有效的编码 - 当这种编码被理解,Prolog的诞生!
你需要的是什么文法- 明确的条款文法 DCG 。 不要试图了解他们在序言(现在)的编码,只是习惯将它们与phrase/2
!
这是计划3.11 序言和自然语言分析费尔南多CN佩雷拉和Stuart M. Shieber。 佩雷拉设计的我们今天使用的DCG规则很有风格。 这本书是最被低估的Prologbooks之一。 而且它是免费的!
s(s(NP,VP)) --> np(NP), vp(VP).
np(np(Det,N,Rel)) -->
det(Det),
n(N),
optrel(Rel).
np(np(PN)) --> pn(PN).
vp(vp(TV,NP)) --> tv(TV), np(NP).
vp(vp(IV)) --> iv(IV).
optrel(rel(epsilon)) --> [].
optrel(rel(that,VP)) --> [that], vp(VP).
pn(pn(terry)) --> [terry].
pn(pn(shrdlu)) --> [shrdlu].
iv(iv(halts)) --> [halts].
det(det(a)) --> [a].
n(n(program)) --> [program].
tv(tv(writes)) --> [writes].
如果你想表示的字典,因为在Prolog事实,代替使用
n(n(program)) --> [program].
宁
n(n(W)) --> [W],{noun(W)}.
noun(program).
所以,让我们使用它:
?- phrase(s(P), Xs).
P = s(np(det(a),n(program),rel(epsilon)),vp(tv(writes),np(det(a),n(program),rel(epsilon)))),
Xs = [a,program,writes,a,program] ;
P = s(np(det(a),n(program),rel(epsilon)),vp(tv(writes),np(det(a),n(program),rel(that,vp(tv(writes),np(det(a),n(program),rel(epsilon))))))),
Xs = [a,program,writes,a,program,that,writes,a,program] ...
什么是自我指涉的话语! 但现在,所有的句子了长度是一个比较有启发性:
?- length(Xs, N), phrase(s(P), Xs).
Xs = [terry,halts],
N = 2,
P = s(np(pn(terry)),vp(iv(halts))) ;
Xs = [shrdlu,halts],
N = 2,
P = s(np(pn(shrdlu)),vp(iv(halts))) ;
Xs = [a,program,halts],
N = 3,
P = s(np(det(a),n(program),rel(epsilon)),vp(iv(halts))) ;
Xs = [terry,writes,terry],
N = 3,
P = s(np(pn(terry)),vp(tv(writes),np(pn(terry)))) ;
Xs = [terry,writes,shrdlu],
N = 3,
P = s(np(pn(terry)),vp(tv(writes),np(pn(shrdlu)))) ;
Xs = [shrdlu,writes,terry],
N = 3,
P = s(np(pn(shrdlu)),vp(tv(writes),np(pn(terry)))) ...