我有一个关于否定即失败在 Prolog 语言中:
这是一个理论性多于实践性的问题,因为我清楚这个例子是如何工作的。
所以我有以下 Prolog 程序:
/* Fatti che specificano quali esseri sono degli animali: */
animal(cat).
animal(dog).
animal(frog).
animal(horse).
animal(viper).
animal(boa).
animal(python).
/* Fatti che specificano quali esseri sono dei serpenti: */
snake(viper).
snake(boa).
snake(python).
/* X è un serpente, fallisce ed impedisce il backtracking quindi
il predicato likes(mary,X) risulta essere falso: */
likes(mary,X) :- snake(X),
!,
fail.
/* Se X è un animale allora a mary piace: */
likes(mary, X) :- animal(X).
在 Prolog 中我不能简单地说:“玛丽喜欢所有动物,但不喜欢蛇”我必须这样表述:“如果X是蛇,那么玛丽不喜欢它。否则,如果X是动物,玛丽就会喜欢它”
前面的程序正是按照以下规则执行此操作:
likes(mary,X) :- snake(X),
!,
fail.
Prolog 检查 X 是否确实是一条蛇,施加切割以避免回溯并强制谓词失败。
这样如果snake(X)
is TRUE
该程序也迫使头部发生故障likes(mary,X)
并施加回溯避免了执行程序中其他规则的可能性(答案为真,因为蛇也是动物)
我的问题是:在我看来,Prolog 的这种使用不属于逻辑和声明范式,并且在某种程度上属于某种程序范式
Because:
- 我必须强加 2 个谓词的顺序(所以在某种程度上我是说:如果第一个失败,请尝试第二个)。
- 但我更想说的是:如果第一个规则匹配(X 是一条蛇),则执行强制失败并且不强制回溯。
在我看来,这更接近于程序意义,而不是经典逻辑意义......
是那个吗?是不是在这些情况下,Prolog 使用过程行为来克服逻辑的限制?