Prolog中的失败是一种程序行为吗?

And*_*ili 2 prolog

我对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从逻辑和声明的范例并以某种方式落在某种程序范例下降外

因为:

  1. 我必须强加一个2谓词的顺序(所以在某种程度上我说:如果第一个失败,请尝试第二个).
  2. 但更多我说的是:如果第一条规则匹配(X它是一条蛇)则执行强制失败并且不进行回溯.

在我看来,这更接近程序性意义,即经典的逻辑意义......

是那个吗?是不是在这些情况下,Prolog使用程序行为来克服逻辑的限制?

Use*_*ser 5

我不同意"逻辑的局限性".

同样的

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)

  • 考虑把它写成`喜欢(玛丽,X): - 动物(X),\ +蛇(X).`,并回想起`(\ +)/ 1`(这是一个ISO标准谓词,而`不是/ 1`不是)如果它的论证是基础的话是合理的.通过这个定义,您甚至可以询问最常见的查询`? - likes(X,Y).`并获得正确的结果. (5认同)