我在prolog中有一个问题是代码:
sound(time1).
sound(time2).
sun(time3).
relax(X):-
not(sound(X)),
!,
sun(X).
relax(_):-
sun(_).
现在我正在跑步 - relax(T)
。当我跑relax(F)
时,我才会成真。为什么会这样?
还有一个问题,为什么relax(time4)
。也变得虚假?我想我错过了什么。
非常感谢!
答案 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中所有常量都不同:因此time1
和time4
无法统一。
所以现在Prolog首先旨在将sound(time1)
(sound/1
的第一个条款)与sound(time4)
统一起来,但由于time1
和time4
不同, 。接下来,它旨在将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/1
:sun(time3)
的第一个(也是唯一的)条款。但如前所述,time3
和time4
并不统一。结果就是失败了。由于Prolog无法接受relax/1
的第二个子句(由于剪切(!
)),因此它已用尽所有选项,并确定查询relax(time4)
为{{1} }。