在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森林吗?不知道。但是在你发帖时,肯定会有人回答你的问题。:)顺便说一句,谢谢你的指针。啊,我看到你已经要求并删除了它(谷歌为我找到了它)。你在那里展示的是什么书?