我正在阅读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)
| ?-
另一方面,如果我将它写入文件并运行参考文件,它似乎工作正常......
我是否只允许在稍后查阅文件的文件中定义谓词?我不能只在编辑器中做到这一点吗?
答案 0 :(得分:10)
在repl中创建谓词有点烦人。你可以做到
| ?- ['user'].
woman(mia).
^D
即咨询用户输入,或
| ?- assertz(woman(mia)).
断言。两个尴尬的IMO - 可能有更好的方式,但是,我只是不知道它。通常,使用脚本更容易。
答案 1 :(得分:7)
您应该将woman(mia).
输入到文件中以将其断言为事实。如果你把它写入解释器,它被视为一个查询,而不是一个事实。
您在顶层输入的术语是作为查询的进程,而 出现在加载到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
,而不是写入文件(如后面的常见问题解答中所述)。