我使用SICStus Prolog 4.0.8编写了一个用英语解析句子并返回语法树的程序,以及根据编程语法判断句子是否正确的是/否。这里有一个例子(句子是拉里和卡罗尔会见他们的老邻居保罗和莉莲):
s(s(N, V)) --> np(N), vp(V).
np(np1(N1, C, N2)) --> pn(N1), conj(C), pn(N2).
np(np2(D, A, N)) --> det(D), adj(A), cn(N).
app(app(N1, N2)) --> np2(N1), np1(N2).
vp(vp1(V, A)) --> tv(V), app(A).如果我像这样运行代码,它会抱怨np2/3没有定义,但是如果我把数字放在括号前面,那么它就没有定义np/3。我唯一的解决方案是将这两个谓词放入其中,如下所示:
s(s(N, V)) --> np(N), vp(V).
np(np1(N1, C, N2)) --> pn(N1), conj(C), pn(N2).
np(np2(D, A, N)) --> det(D), adj(A), cn(N).
app(app(N1, N2)) --> np2(N1), np1(N2).
vp(vp1(V, A)) --> tv(V), app(A).
np1(np1(N1, C, N2)) --> pn(N1), conj(C), pn(N2).
np2(np2(D, A, N)) --> det(D), adj(A), cn(N).
vp1(vp1(V, A)) --> tv(V), app(A).然后编译并成功执行。造成这种行为的原因是什么?
发布于 2021-12-21 16:25:06
在代码的第一个版本中,子句
np(np1(N1, C, N2)) --> pn(N1), conj(C), pn(N2).定义谓词np/3 (并调用谓词pn/3)。然而,该条款
app(app(N1, N2)) --> np2(N1), np1(N2).调用谓词np2/3和np1/3,它们没有定义。这就是运行时错误的原因。
在代码的第二版中,还定义了谓词np2/3和np1/3,因此没有错误。
,问题是什么?,我认为您把np/3和pn/3 (它们是谓词)与np1/3和np2/3 (它们是表示语法树节点的术语)混淆了。
np( np1(N1, C, N2) ) --> pn(N1), conj(C), pn(N2).
^ ^ ^
| | |
| | +--- predicate being called (must be defined)
| |
| +----------------------- term representing a syntax tree node (this is not a predicate)
|
+---------------------------- predicate being definedhttps://stackoverflow.com/questions/70435850
复制相似问题