我对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).
Run Code Online (Sandbox Code Playgroud)
在Prolog我不能简单地这样说:"玛丽爱每一个动物,而不是蛇" ,我要制定它是这样的:"如果X是一条蛇,然后玛丽不爱它.否则,如果X它是一种动物,玛丽喜欢它"
根据规则,先例程序正是这样做的:
likes(mary,X) :- snake(X),
!,
fail.
Run Code Online (Sandbox Code Playgroud)
Prolog检查X是否为蛇是真的,强制切割以避免回溯并强制谓词失败.
这样,如果蛇(X)是TRUE程序强制失败也是头prediate的喜欢(玛丽,X)和实行回溯避免执行程序中的其他规则(这个答案真的可能性,因为蛇也是动物)
我的问题是:看来我这使用的Prolog从逻辑和声明的范例并以某种方式落在某种程序范例下降外
因为:
在我看来,这更接近程序性意义,即经典的逻辑意义......
是那个吗?是不是在这些情况下,Prolog使用程序行为来克服逻辑的限制?
我不同意"逻辑的局限性".
同样的
likes(mary,X) :- not(snake(X)) , animal(X).
Run Code Online (Sandbox Code Playgroud)
因为Prolog使用深度优先搜索,所以可以用更短的方式表达某些东西,然后依赖于深度优先搜索回溯算法.
x :- a, !, b.
x :- c.
x :- d.
Run Code Online (Sandbox Code Playgroud)
是相同的
x :- a, b.
x :- not(a), c.
x :- not(a), d.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
293 次 |
| 最近记录: |