我们从一个空的数据库开始,并给出以下命令
assert(q(a,b)),assertz(q(1,2)),asserta(q(foo,blug)).
数据库现在包含什么?
以下命令后会发生什么?
retract(q(1,2)),assertz((p(X):-h(X))).
最后,执行以下命令后会发生什么?
retract(q(_,_)),fail.
MyAttempt
我在Prolog中引入了以下命令
assert(q(a,b)).
assertz(q(1,2)).
asserta(q(foo,blug)).
但是它标记了一个错误,指出q
应该是1
参数,而不是2
。
有人可以帮我吗?我怎样才能解决这个问题?任何帮助将不胜感激
谢谢。
答案 0 :(得分:1)
fail
中的retract(q(_,_)),fail.
使其循环,直到数据库中不再剩余q/2
。
工作原理是,Prolog希望证明其目标;因此,当我们的目标以明确的fail
结尾时,fail
始终会失败,因此总体目标也会失败;但是Prolog 想要证明,因此继续尝试证明它,因此它“重试” fail
上方仍然存在的任何出色目标的选择点。
简单地说,它会重试retract(q(_,_))
目标。
每个retract(q(_,_))
目标从我们的数据知识库中撤消q/2
的一个实例。因此,通过这个失败驱动的循环,它们全部被删除,最终结果仍然是失败。
在纯粹的设置中,只有这个结果才有价值-目标的失败或成功。但是,assert
和retract
类谓词是因为它们的副作用而不是它们的成功或失败而被称为。它们的方面效果是,它们会影响我们数据库的状态。
实际上,通常,故障驱动的循环看起来像
retract(q(_,_)),fail ; true.
达到相同的效果,但成功(而不是失败),可以信号传达成功达到预期的效果。
答案 1 :(得分:0)
通过阅读理论,我们可以得出以下结论。
第一个问题,
q(foo,blug).
q(a,b).
q(1,2).
第二个问题,
q(foo,blug).
q(a,b).
p(A):-h(A).
对于第三个问题,我认为删除所有谓词{{1}}。我不知道',fail'在这里的作用是什么。