在SICStus Prolog / SWI-Prolog REPL中定义谓词

时间:2011-09-06 18:44:01

标签: prolog prolog-toplevel prolog-assert

我正在阅读http://cs.union.edu/~striegnk/learn-prolog-now/html/node3.html#subsec.l1.kb1, 但是我在运行以下谓词时遇到了麻烦:

SICStus 4.0.1 (x86-win32-nt-4): Tue May 15 21:17:49 WEST 2007
| ?- woman(mia).
! Existence error in user:woman/1
! procedure user:woman/1 does not exist
! goal:  user:woman(mia)
| ?- 

另一方面,如果我将它写入文件并运行参考文件,它似乎工作正常......

我是否只允许在稍后查阅文件的文件中定义谓词?我不能只在编辑器中做到这一点吗?

2 个答案:

答案 0 :(得分:10)

在repl中创建谓词有点烦人。你可以做到

| ?- ['user'].
woman(mia).
^D

即咨询用户输入,或

| ?- assertz(woman(mia)).

断言。两个尴尬的IMO - 可能有更好的方式,但是,我只是不知道它。通常,使用脚本更容易。

答案 1 :(得分:7)

您应该将woman(mia).输入到文件中以将其断言为事实。如果你把它写入解释器,它被视为一个查询,而不是一个事实。

来自SWI Prolog FAQ

  

您在顶层输入的术语是作为查询的进程,而   出现在加载到Prolog中的文件中的术语将被处理为   一套规则和事实。如果文本如下所示,则这是一条规则。

carnivore(X) :- animal(X), eats_meat(X).
     

尝试在顶层输入此内容会导致以下错误。为什么?   因为规则是一个术语:-(头部,身体),因为顶部   将术语解释为查询。这个名字没有谓词: -   和两个论点。

?- carnivore(X) :- animal(X), eats_meat(X). ERROR: Undefined
procedure: (:-)/2 ERROR:   Rules must be loaded from a file ERROR:  
See FAQ at http://www.swi-prolog.org/FAQ/ToplevelMode.txt
     

这不是傻瓜吗?好吧,不。假设我们有一个术语   eats_meat(rataplan)。如果它出现在文件中,则说明了这一事实   rataplan吃肉。如果它出现在顶层,它会询问Prolog   试着证明rataplan是否吃肉。

     

如果文字为

:- use_module(library(clpfd)).
     

这是一个指令。指令与查询类似,但不是   要求toplevel做某事,他们要求编译器做   一些东西。与规则和事实一样,这些术语属于文件。

您也可以在顶层使用assert,而不是写入文件(如后面的常见问题解答中所述)。