3

首次在 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雾的回复。

4

1 回答 1

4

SWI 有一个稍微不同的顶层 shell,其灵感来自Prolog IV的 shell。这个想法是你再次得到一个可执行查询的答案。因此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.

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

于 2014-11-15T23:11:54.340 回答