问题标签 [prolog-assert]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
prolog - 咨询一个原子
consult/1
可以使用或轻松查阅 Prolog 文件[filename].
。
假设我将 Prolog 代码生成为原子。我可以在谓词中将该代码写入文件然后查阅它,并从该代码中查询谓词,例如
我将如何做同样的事情但不将X
(代码)写入文件?我没有运气assert
将术语作为输入,而在这里我在原子中有完整的代码。
prolog - Prolog - 在最后一个事实时停止重复
我有一个这样的事实清单:
我需要找到集合 h 的最大值,查询需要如下所示:
显然,现在有很多方法可以做到这一点。但目前我正在寻找一种使用动态谓词和失败谓词的方法。我猜我可能不得不使用重复?不幸的是,重复谓词和动态谓词都让我感到困惑。
我在想这样的事情:
我自己看到的问题之一是重复循环不会停止。如果我能以某种方式知道它是集合中的最后一个元素,我可能会使用 cut,但我不确定如何使用。
prolog - 带有变量名的 Prolog 规则断言
我尝试在 SWI-Prolog 中自动声明一些规则:
这工作得很好,但是 rulesDB.pl 中的断言结果不使用FG,SG,FS,SS,X
它们被替换为它们的内存位置(?)的变量的名称,这看起来像:
是否可以改用变量的名称?
此外,我想防止生成规则的重复。因此我尝试Rule = (Head :- Body), \+Rule,
了,但这给了我一个Undefined procedure: (:-)/2
. 谁能告诉我我的代码有什么问题?
提前致谢!
prolog - 具有递增分量的动态 Prolog 谓词
我有一个由一组规则组成的知识库,当某些条件发生时,每个规则的头部都会执行复杂术语的断言或撤回。
我怎样才能确保Id
每增加一次
assert(term(Id,A,B,C))
?
prolog - 撤回/1定义中的短语不清楚
这对我来说有些事情retract/1
没有意义。
根据 ISO/IEC 13211-1:1995:
8.9.3 收回/1
8.9.3.1 说明
retract(Clause)
如果数据库包含至少一个带有与Clause
结合的子句的动态过程,则为真Head :- Body
。在程序
retract(Clause)
上,执行如下:a) 如果
Clause
与 结合':-'(Head, Body)
,则进行到 8.9.3.1 c,b) Else
Head
与Clause
和true
结合Body
,c) 依次搜索数据库中的每个动态用户定义过程,并创建一个包含所有术语的列表L
clause(H, B)
,使得 1) 数据库包含一个子句,其头部可以转换为术语H
(7.6.3),其主体可以被转换为一个项B
(7.6.4),并且 2)H
与 一致Head
,并且 3)B
与 一致Body
。d) 如果找到非空列表,则进行到 8.9.3.1 f,
e) 否则目标失败。
f) 选择列表L的第一个元素,从数据库中删除与其对应的子句,目标成功。
g) 如果列表L的所有元素都已被选择,则目标失败。
h) Else 选择列表L中尚未选择的第一个元素,如果存在,则从数据库中删除与其对应的子句,目标成功。
retract(Clause)
是可以重新执行的。回溯时,继续 8.9.3.1 g。[...]
“如果它存在”?重新执行后怎么可能不存在了?
数据库更新语义表明“它”始终存在:
7.5.4 逻辑数据库更新
由于执行目标而发生的数据库中的任何更改(例如,当子目标的激活器是对
assertz/1
or的调用时retract/1
)应仅影响随后开始执行的激活。此更改不应影响当前正在执行的任何激活。注意——因此数据库在目标执行期间被冻结,并且定义谓词的子句列表在其执行时是固定的(见 7.7.7 e)。
下面,我尝试在重新执行之前使用retract(f(3))
to make 子句消失:f(3)
retract(f(X))
...但是,唉,我失败了:SICStus Prolog、GNU Prolog 和 SWI-Prolog 给出了相同的(以上)答案。
那么为什么在这种情况下使用“如果它存在”这个短语呢?对我来说这是多余的。和令人费解的......请帮助!
prolog - 在 Prolog 中,断言和撤回可能导致查询失败的一些原因是什么?
我将 Logic De Morgan 规则应用于集合的所有节点。每当我断言/撤回与指定格式匹配的节点时,查询似乎就停在那里并返回 no。虽然这不会导致应用德摩根规则一次出现问题,但当我尝试多次应用它时会导致问题,因为它会立即使查询失败。我已经做了相当多的测试,所以我相当确定问题出在哪里,但随时推荐我可能错过的东西。--------- De Morgan Rule: -(AVB) -> - A & -B____ 显示为 not(or(A,B) -> and(not(A),not(B))。new_node_name 只是为调整后的节点生成新标签。
相应的分支应该调整,但查询仍将返回 no