0

刚刚在我的 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.

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

解决方案:不同的序言版本。

4

3 回答 3

4

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

于 2013-11-18T18:52:11.937 回答
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.
于 2013-11-18T18:07:17.257 回答
-1

如果您想从中接收 false ,您可以添加指令

:- dynamic(some_other_statement/0).

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

?- some_other_statement.

你会得到错误的

于 2014-05-23T03:34:01.897 回答