我对否定作为 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是一条蛇,规定切断,以避免回溯并迫使谓词的失败。
这样,如果蛇(X)为真 ,程序强制失败也是头prediate 喜欢(玛丽,X),并实行回溯避免执行程序中的其他规则(这个答案真的可能性,因为蛇也是动物)
我的问题是: 看来我这使用的Prolog从逻辑和声明的范例并以某种方式落在某种程序范例下降外
因为:
- 我施以2谓词的顺序(所以在某些方面,我都会说:如果第一个失败,请尝试第二个)。
- 但更我说的是:如果第一个规则匹配(X是一条蛇),然后执行强制故障,并规定没有回溯。
这似乎对我来说更接近一个程序意义,一个经典的逻辑意义...
是那个吗? 它是在这些情况下,Prolog使用一个程序的行为,克服了逻辑的限制?