prolog SWI中未定义的过程错误

prolog SWI中未定义的过程错误,prolog,prolog-toplevel,Prolog,Prolog Toplevel,首次在windows 8上运行prologSWI 这是我的程序(.pl)文件,非常基本,只有3个事实:(我是一个完整的prolog初学者) 当我在prolog SWI中加载它(consult)并使用该程序时,我的输出中出现以下错误: 12 ?- b. true. 13 ?- a. true. 14 ?- c. ERROR: toplevel: Undefined procedure: c/0 (DWIM could not correct goal) 现在,如果这是一个简单的错误,因为c从

首次在windows 8上运行prologSWI

这是我的程序(.pl)文件,非常基本,只有3个事实:(我是一个完整的prolog初学者)

当我在prolog SWI中加载它(consult)并使用该程序时,我的输出中出现以下错误:

12 ?- b.
true.

13 ?- a.
true.

14 ?- c.
ERROR: toplevel: Undefined procedure: c/0 (DWIM could not correct goal)
现在,如果这是一个简单的错误,因为
c
从未在程序中作为事实陈述过,那么这很好,但是在查看在线示例和我在这些示例的Prolog类中找到的示例后,当事实在程序中时,回答
yes
,当事实不在程序中时,回答
no
。如果是,我的回答是
true
,如果不是,我的回答是长错误

有关详细信息,请参阅此链接


对于foggy,哪里是回复
no

SWI的顶级外壳稍有不同,灵感来自于的外壳。这样做的目的是让您再次返回一个可执行查询作为答案。因此
true.
而不是
yes
false.
而不是
no
。如果要将答案“粘贴回”到下一个查询中,这一点特别有用

?- append(Xs,Ys,[1,4,7]).
Xs = [],
Ys = [1, 4, 7] ;
Xs = [1],
Ys = [4, 7] ;
Xs = [1, 4],
Ys = [7] ;
Xs = [1, 4, 7],
Ys = [] ;
false.
当您使用诸如
library(clpfd)
之类的约束时,它甚至更有用:

?-使用_模块(库(clpfd))。
对。
?-X>3,X>Y,abs(X)<100。
4..99中的X,
X#>=Y,
在inf..99中为Y。
另一个问题是许多系统中常见的默认行为:如果没有子句,也没有提及特定谓词,则系统会假定您键入了错误的名称,并相应地给出一个错误。 如果你真的坚持(不要!),你可以使用
set\u prolog\u标志(未知,失败)切换到70年代末的行为时间。
但是最好立即使用
set\u prolog\u标志(未知,错误)

?- append(Xs,Ys,[1,4,7]).
Xs = [],
Ys = [1, 4, 7] ;
Xs = [1],
Ys = [4, 7] ;
Xs = [1, 4],
Ys = [7] ;
Xs = [1, 4, 7],
Ys = [] ;
false.
?- use_module(library(clpfd)).
true.

?- X #> 3, X#>=Y,abs(X) #< 100.
X in 4..99,
X#>=Y,
Y in inf..99.