prolog SWI中未定义的过程错误

时间:2014-11-15 23:02:44

标签: prolog prolog-toplevel

首次在Windows 8上运行prolog SWI

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

hello.
a.
b.

当我在prolog-SWI中加载它(咨询)并使用该程序时,我在输出中出现了这个错误:

12 ?- b.
true.

13 ?- a.
true.

14 ?- c.
ERROR: toplevel: Undefined procedure: c/0 (DWIM could not correct goal)

现在,如果这是一个简单的错误,因为c从未在程序中声明为事实那么这很好,但是在查看了在线示例和我在Prolog类中找到的示例后,这些示例回复当事实在程序中时yes,而no当事实在程序中时true。如果是的话,我会回复no,如果不是,我会回答这个长错误。

请参阅此example

的链接

有雾的回复{{1}}。

1 个答案:

答案 0 :(得分:4)

SWI的顶级外壳略有不同,受到Prolog IV外壳的启发。这个想法是你再次回到可执行查询的答案。因此true.而不是yesfalse.而不是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)

等约束时,它会更有用
?- use_module(library(clpfd)).
true.

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

另一个问题是许多系统中的常见默认行为:如果没有子句而没有提及特定谓词,系统会假定您输入了错误的名称并相应地给出了错误。 如果您真的坚持(不要!),您可以使用set_prolog_flag(unknown, fail).将行为时间转换到20世纪70年代后期,但最好立即使用set_prolog_flag(unknown, error)将其切换回来。