我对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)
程序TRUE
强制头部前导的失败likes(mary,X)
和强加回溯避免了执行程序中其他规则的可能性(答案是真的,因为蛇也是动物)
我的问题是:在我看来,Prolog 的这种使用超出了逻辑和声明范式,并且在某种程度上属于某种程序范式
因为:
- 我必须强加 2 谓词的顺序(所以在某种程度上我是说:如果第一个失败,请尝试第二个)。
- 但我更想说的是:如果第一个规则匹配(X 它是一条蛇),则执行强制失败并且不强制回溯。
在我看来,这似乎更接近于程序意义,而不是经典逻辑意义......
是那个吗?是不是在这些情况下,Prolog 使用程序行为来克服逻辑的限制?