prolog语言中的逻辑

时间:2017-07-07 08:28:08

标签: prolog

我在prolog中有一个问题是代码:

sound(time1).
sound(time2).

sun(time3).

relax(X):-
    not(sound(X)),
    !,
    sun(X).
relax(_):-
    sun(_).

现在我正在跑步 - relax(T)。当我跑relax(F)时,我才会成真。为什么会这样?

还有一个问题,为什么relax(time4)。也变得虚假?我想我错过了什么。 非常感谢!

1 个答案:

答案 0 :(得分:2)

relax(T)relax(F)都给出相同结果的事实是正常的:大写标识符是变量。所以两个查询在语义上是相同的:您使用未接地的变量进行查询。

现在为什么我们得到true.?如果您查询relax(T),Prolog将首先调用relax(X)的第一个子句。

第一个子句的主体以not(sound(X))开头。所以我们实际上是在查询not(sound(T))否定为有限失败原则并不满足:Prolog将致力于证明"证明" sound(T),如果失败(找不到满足该查询的方法)。

现在Prolog查询sound(T),并且此查询已满足:实际上,sound(time1)满足此查询,因为Prolog原因现在T = time1。结果not(sound(T))false,因此Prolog回溯。

现在Prolog将尝试下一个条款:relax(_) :- sun(_). _是"通配符"或者"不在乎"变量。此外,如果在同一子句中使用多个_,那些相关。所以你基本上说:一切都是relax/1,因为至少有一个sun/1。所以现在Prolog将查询sun(_)。此查询成功:sun(time3)是有效的候选者,因为_ = time3。这意味着relax(_)成功。我们没有更改变量T(或F),因此Prolog只能说查询是true

现在,如果我们查询relax(time4),那就是另一个故事。 Prolog将首先尝试满足relax/1的第一个条款。这是通过调用not(sound(time4))再次完成的。但请注意 time4是常量。在Prolog中所有常量都不同:因此time1time4无法统一。

所以现在Prolog首先旨在将sound(time1)sound/1的第一个条款)与sound(time4)统一起来,但由于time1time4不同, 。接下来,它旨在将sound(time2)sound/1的第二个条款)与sound(time4)统一起来,但再次没有运气。现在不再有sound/1的条款了。所以Prolog放弃并认为not(sound(time4))是真的。

这意味着Prolog将在relax/1的第一个条款的主体中继续存在。下一个语句是!,即" cut "在Prolog。这意味着,对于这个分支点,Prolog应该不再考虑剩余的条款。因此,从现在开始,忽略relax/1的第二个条款。接下来遇到sun(X)。所以现在Prolog将致电sun(time4)并致力于满足这一要求。它旨在统一sun/1sun(time3)的第一个(也是唯一的)条款。但如前所述,time3time4并不统一。结果就是失败了。由于Prolog无法接受relax/1的第二个子句(由于剪切(!)),因此它已用尽所有选项,并确定查询relax(time4)为{{1} }。