在Prolog中引入谓词

在Prolog中引入谓词,prolog,Prolog,我们从一个空数据库开始,并给出以下命令 assert(q(a,b)),assertz(q(1,2)),asserta(q(foo,blug))。 数据库现在包含什么 执行以下命令后会发生什么 retract(q(1,2)),assertz((p(X):-h(X))。 最后,执行以下命令后会发生什么 retract(q(,))失败。 我的尝试 我在Prolog中介绍了以下命令 assert(q(a,b))。 assertz(q(1,2))。 asserta(q(foo,blug))。 但是它标记了

我们从一个空数据库开始,并给出以下命令

assert(q(a,b)),assertz(q(1,2)),asserta(q(foo,blug))。

数据库现在包含什么

执行以下命令后会发生什么

retract(q(1,2)),assertz((p(X):-h(X))。

最后,执行以下命令后会发生什么

retract(q(,))失败。

我的尝试

我在Prolog中介绍了以下命令

assert(q(a,b))。

assertz(q(1,2))。

asserta(q(foo,blug))。

但是它标记了一个错误,即
q
应该是
1
参数,而不是
2

谁能帮帮我吗?我怎样才能解决这个问题?任何形式的帮助都将不胜感激


提前谢谢。

通过阅读理论,我们可以得出以下结论

关于第一个问题,

q(foo,blug)。

q(a,b)。

q(1,2)。

关于第二个问题

q(foo,blug)。

q(a,b)。

p(A):-h(A)。


对于第三个问题,我认为删除了所有谓词
q
。我不知道这里的'fail'是什么动作。

retract(q(,))中的
fail
,fail。
使其循环,直到数据库中不再剩下
q/2
s

它的工作原理是,Prolog想要证明它所给出的目标;因此,当我们的目标以明确的
失败
结束时,
失败
总是失败,因此总体目标也失败;但是Prolog想要证明它,所以继续尝试证明它,所以它“重试”任何未完成目标的选择点,这些选择点仍然在
失败的“上面”

简单地说,它重试
retract(q(,))目标

每个
retract(q(,))
目标从我们的数据知识库中提取一个
q/2
实例。因此,对于这个由故障驱动的循环,它们都被删除了,最终的结果仍然是一个故障

在纯粹的环境中,只有这个结果才重要——目标的失败或成功。但是
assert
retract
——这类谓词之所以被调用是因为它们的副作用,而不是因为它们的成功或失败。它们的副作用是,它们会影响我们数据库的状态

事实上,通常情况下,故障驱动的循环

retract(q(_,_)),fail ; true.

达到同样的效果,但成功(而不是失败),表明成功达到了预期效果。

我无法重现这个错误。如果我在
swipl
中运行它,它会工作。@WillemVanOnsem真的吗?我不知道我使用的是什么版本,但它标记了一个错误。另外,我在笔记中的定义是,它只有1个参数。你确定你没有弄错查询中的括号吗?我复制了你的查询,结果成功了(我没有验证事实是否在“解释器数据库”中,但没有错误)。@WillemVanOnsem什么查询?我甚至不允许查询,因为它甚至不编译。这3个断言将出现在文本编辑器中,不是吗?啊,我是在Prolog的
swipl
中以交互方式完成的。但在文件中,将
asserta
等作为“裸体表达式”是没有意义的。因为
asserta(exp)
等于文件头中的
exp
。您只能在谓词体中执行这些操作。请随意修改我的答案。非常感谢@willness的帮助,不客气。我已经将我的编辑移到了它自己的答案中,正如我当初应该做的那样。:)@哦,好吧。你知道SLDNF森林吗?不知道。但是在你发帖时,肯定会有人回答你的问题。:)顺便说一句,谢谢你的指针。啊,我看到你已经要求并删除了它(谷歌为我找到了它)。你在那里展示的是什么书?