无法在Jekejeke Prolog中创建事实

时间:2015-02-09 09:58:30

标签: prolog iso-prolog prolog-assert jekejeke

我使用Seven Languages七周Prolog教程并尝试使用Android Jekejeke Runtime运行一些示例。 例如,如果我添加

likes(wallace, grommit).
从教程开始,我得到了。

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

我尝试使用assert,如How to create a fact in SWI-Prolog?中所述,但后来它说assert未定义,而不是喜欢。

据推测,我遗漏了一些关于运行时如何工作的基本内容,或者它的prolog.it方言。

2 个答案:

答案 0 :(得分:3)

assert/1不是标准谓词,尽管有几个实现提供它。对于Jekejeke Prolog来说,情况似乎并非如此。请改用asserta/1assertz/1标准谓词。第一个声明一个子句作为谓词的第一个。后者断言一个子句作为谓词的最后一个。

答案 1 :(得分:1)

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

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

但最终用户有多种选择:

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

顶层:

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

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

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

2)第二个选项使用文件并查阅:
将事实和规则放入文件中。并通过consult / 1内置咨询。

文件baz.p:

likes(foo, bar).

顶层:

?- consult('baz.p').

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

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

顶层:

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

再见