Swi prolog错误:显示真实但不虚假

时间:2013-11-18 17:44:45

标签: prolog iso-prolog

刚刚在我的W8机器上安装了SWI-Prolog,它发出错误。

这是错误:

ERROR: toplevel: Undefined procedure: mark/0 (DWIM could not correct goal)

假设我的prolog源文件包含一个事实:

 Prolog source...

 it_is_monday.   //The fact

所以我编译缓冲区,得到:

.../documents/prolog/prologSource compiled 0.00 sec, 2 clauses

现在我输入

it_is_monday. 

预期输出为true。但是当我输入时说,

some_other_statement.

我收到上面发布的错误而不是false。谁能告诉我这里发生了什么?

解决方案:不同的prolog版本。

3 个答案:

答案 0 :(得分:4)

有一个标准的Prolog标志unknown,默认情况下在SWI-Prolog和其他现代Prolog编译器中设置为error,这意味着调用未知谓词的尝试将导致异常。可以将此标志设置(使用标准set_prolog_flag/2谓词)而不是fail来获取您似乎期望的行为,但这不可取,因为它可能会使调试更难。例如。谓词名称中的简单拼写错误将导致失败,在复杂的程序中,难以追踪,而谓词存在错误会在现场查明罪魁祸首。

答案 1 :(得分:2)

您收到错误

ERROR: toplevel: Undefined procedure: mark/0 (DWIM could not correct goal)

因为您还没有定义您尝试执行的过程。 (这就是为什么它说undefined

如果您通过编辑.pl文件并进行编写来定义它 some_other_statement.

然后再次运行它,你会得到

1 ?- some_other_statement.
true.

在Prolog中,您需要定义要执行的每个过程。

当您尝试执行未定义的过程时,过程的名称将显示在错误中。因此,如果您尚未定义some_other_statement.,则错误将为:

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

请注意,我收到的错误会显示some_other_statement/0

编辑:如果您想收到false消息,则必须定义some_other_statement(1).之类的内容,然后执行some_other_statement(12).之类的查询

2 ?- some_other_statement(12).
false.

答案 2 :(得分:-1)

如果你想从中收到假,你可以添加指令

:- dynamic(some_other_statement/0).

在文件的开头,所以当你执行查询时

?- some_other_statement.

你会得到假的