刚刚在我的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版本。
答案 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.
你会得到假的