在尝试在Prolog中实现一个非常简单的无约束语法时,我遇到了无限递归问题。
以下是我的规则:(vp -> 动词短语,np -> 名词短语,ap -> 形容词短语,pp -> 介词短语)
verb(S) :- member(S, [put, pickup, stack, unstack]).
det(S) :- member(S, [the]).
adj(S) :- member(S, [big, small, green, red, yellow, blue]).
noun(S) :- member(S, [block, table]).
prep(S) :- member(S, [on, from]).
vp([V|R]) :- verb(V), pp(PP), np(NP), append(NP, PP, R).
np([D, N]) :- det(D), noun(N).
np([D|R]) :- det(D), ap(AP), noun(N), append(AP, [N], R).
ap([A]) :- adj(A).
ap([A|R]) :- adj(A), ap(R).
pp([P|R]) :- prep(P), np(R).
我遇到的问题是,关于ap的规则可能会产生任意长的形容词字符串,所以在尝试满足查询时,我会卡在尝试这些无限可能性上。
例如,以下查询永远不会产生S = [放, 红色, 块, 在, 绿色, 块, 上],因为它将首先扩展左侧的形容词短语“红色”到无限可能性,然后才会在右侧进行尝试。
?- vp(S)
S = [put, the, red, green, block, on, the, block] ;