在Prolog中引入谓词

时间:2018-09-22 01:51:03

标签: prolog

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

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

有人可以帮我吗?我怎样才能解决这个问题?任何帮助将不胜感激

谢谢。

2 个答案:

答案 0 :(得分:1)

fail中的retract(q(_,_)),fail.使其循环,直到数据库中不再剩余q/2

工作原理是,Prolog希望证明其目标;因此,当我们的目标以明确的fail结尾时,fail始终会失败,因此总体目标也会失败;但是Prolog 想要证明,因此继续尝试证明它,因此它“重试” fail上方仍然存在的任何出色目标的选择点。

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

每个retract(q(_,_))目标从我们的数据知识库中撤消q/2一个实例。因此,通过这个失败驱动的循环,它们全部被删除,最终结果仍然是失败。

在纯粹的设置中,只有这个结果才有价值-目标的失败或成功。但是,assertretract类谓词是因为它们的副作用而不是它们的成功或失败而被称为。它们的方面效果是,它们会影响我们数据库的状态。

实际上,通常,故障驱动的循环看起来像

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'在这里的作用是什么。