【问题标题】:Unable to create Fact in Jekejeke Prolog无法在 Jekejeke Prolog 中创建 Fact
【发布时间】:2015-02-09 09:58:29
【问题描述】:

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

likes(wallace, grommit).

从教程中,我明白了。

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

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

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

【问题讨论】:

  • Jekejeke 是对的。请参阅this answer 为什么。

标签: prolog iso-prolog prolog-assert jekejeke


【解决方案1】:

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

【讨论】:

  • 我需要用它们来断言一个事实吗?到目前为止,七种语言教程已经跳过了这一点,如果你这样做了
  • 取决于你的意思是“断言一个事实”。谓词定义通常在您编译和加载的源文件中定义。在运行时为 动态 谓词添加子句时使用断言谓词。
  • 谢谢 - 认为这是有道理的。
【解决方案2】:

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

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

但最终用户有多种选择:

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 来代替咨询/1。

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

顶级:

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

再见

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-12-20
  • 2020-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-19
相关资源
最近更新 更多