4

我正在使用七周内的七种语言 Prolog 教程并尝试使用 Android Jekejeke 运行时运行一些示例。例如,如果我添加

likes(wallace, grommit).

从教程中,我明白了。

Error: Undefined, private or package local predicate likes/2

我尝试使用断言,如如何在 SWI-Prolog 中创建事实?,但后来它说那assert是未定义的,而不是喜欢。

大概我错过了一些关于运行时如何工作的基本知识,或者它的 prolog.it 方言。

4

2 回答 2

5

assert/1不是标准谓词,尽管有几个实现提供了它。Jekejeke Prolog 似乎并非如此。改用 theasserta/1assertz/1标准谓词。第一个断言一个子句作为谓词的第一个。后者断言一个子句作为谓词的最后一个。

于 2015-02-09T10:13:42.787 回答
0

这是一个常见的错误。即有一个假设,即事实可以通过键入直接输入到顶层。

解释器发出错误,因为他理解作为查询输入的内容并且查询中的谓词尚未定义。

但最终用户有多种选择:

1) 第一个选项使用 assertz/1 或 asserta/1:
顶层用于执行目标。您需要一个指示解释器执行断言的目标。使用 asserta/1 或 assertz/1:

顶层:

?- assertz(likes(foo, bar)).

请注意,已经用作静态谓词的谓词,即已通过方法 2) 或 3) 添加的谓词不能再被断言。然后使用 dynamic/1 指令。

不支持内置的 assert/1,因为它不是 ISO 核心标准的一部分,通常对 assertz/1 是多余的。

2)第二种选择使用文件并查阅它:
将事实和规则放入文件中。并通过内建的咨询/1 进行咨询。

文件 baz.p:

likes(foo, bar).

顶层:

?- consult('baz.p').

您也可以使用 ensure_loaded/1 或 use_module/1 来代替咨询/1。

3)第三个选项直接从控制台咨询:
直接在顶层输入事实和规则。通过文件结尾的击键完成事实和规则的输入。

顶层:

?- [user].
likes(foo, bar).
^D

再见

于 2015-10-06T12:56:03.223 回答