我使用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方言。
答案 0 :(得分:3)
assert/1
不是标准谓词,尽管有几个实现提供它。对于Jekejeke Prolog来说,情况似乎并非如此。请改用asserta/1
或assertz/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
再见