7

我正在阅读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)
| ?- 

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

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

4

2 回答 2

12

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

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

即咨询用户输入,或

| ?- assertz(woman(mia)).

断言它。两者都尴尬 IMO - 可能有更好的方法,但我只是不知道。一般来说,使用脚本更容易。

于 2011-09-06T18:50:59.010 回答
8

您应该输入woman(mia).文件以将其断言为事实。如果您将其写入解释器,则将其视为查询,而不是事实。

来自SWI Prolog 常见问题解答

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

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

尝试在顶层输入它会导致以下错误。为什么?因为规则是一个术语 :-(Head, Body),并且因为顶层将术语解释为查询。没有名称为 :- 和两个参数的谓词。

?- 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)).

这是一个指令。指令类似于查询,但它们不是要求顶层做某事,而是要求编译器做某事。像规则和事实一样,这些术语属于文件。

除了写入文件之外,您还可以assert在顶层使用(如后面的常见问题解答中所述)。

于 2011-09-06T18:52:21.730 回答