首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我需要复制我的Prolog谓词才能使我的程序工作?

为什么我需要复制我的Prolog谓词才能使我的程序工作?
EN

Stack Overflow用户
提问于 2021-12-21 12:57:24
回答 1查看 55关注 0票数 1

我使用SICStus Prolog 4.0.8编写了一个用英语解析句子并返回语法树的程序,以及根据编程语法判断句子是否正确的是/否。这里有一个例子(句子是拉里和卡罗尔会见他们的老邻居保罗和莉莲):

代码语言:javascript
复制
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。我唯一的解决方案是将这两个谓词放入其中,如下所示:

代码语言:javascript
复制
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).

然后编译并成功执行。造成这种行为的原因是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-21 16:25:06

在代码的第一个版本中,子句

代码语言:javascript
复制
np(np1(N1, C, N2)) --> pn(N1), conj(C), pn(N2).

定义谓词np/3 (并调用谓词pn/3)。然而,该条款

代码语言:javascript
复制
app(app(N1, N2)) --> np2(N1), np1(N2).

调用谓词np2/3np1/3,它们没有定义。这就是运行时错误的原因。

在代码的第二版中,还定义了谓词np2/3np1/3,因此没有错误。

,问题是什么?,我认为您把np/3pn/3 (它们是谓词)与np1/3np2/3 (它们是表示语法树节点的术语)混淆了。

代码语言:javascript
复制
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 defined
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70435850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档