否定作为Prolog的失败是一个程序性的行为?(Negation as failure in Pro

2019-08-20 08:09发布

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

因为:

  1. 我施以2谓词的顺序(所以在某些方面,我都会说:如果第一个失败,请尝试第二个)。
  2. 但更我说的是:如果第一个规则匹配(X是一条蛇),然后执行强制故障,并规定没有回溯。

这似乎对我来说更接近一个程序意义,一个经典的逻辑意义...

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

Answer 1:

我不同意“逻辑的局限性”。

同样是

likes(mary,X) :- not(snake(X)) , animal(X).

由于Prolog使用深度优先搜索一些东西可以在更短的方式,则取决于深度优先搜索回溯算法上表示。

x :- a, !, b.
x :- c.
x :- d.

是相同的

x :- a, b.
x :- not(a), c.
x :- not(a), d.


Answer 2:

程序,利用切割(!)的是大部分的时间不仅在其终止在其意义的目标和条款顺序敏感,所以他们往往不声明。

否定作为不合格(\ +)以一定的方式切割ecapsulates。 它的定义,甚至实现大多数Prolog的系统如下:

\+ X :- X, !, fail.
\+ _ .

虽然提示的逻辑意义,因此declarativity中,否定为失败仍然是目标排序敏感。 下面是一个例子。 假设我们有以下数据库:

p(a).
q(b,c).

然后下面的查询产生X = A作为溶液:

?- p(X), \+ q(X,Y).
X = a.

但是,如果一起(,)/ 2开关侧的参数,可以得到不同的结果:

?- \+ q(X,Y), p(X).
false.

人机工程学,否定为失败不声明本身。 对于一个存在量词的论据基础项流程,否定为失败sneeks。 所以形式的查询:

 ?- A(X), \+ B(X,Y).

基本上已经它量化新鲜的变量Y中的否定里面的含义:

 ?- A(X), ~ exists Y B(X,Y).

因此,在其中一起进行切换,所述一组新鲜变量在否定为失败改变上述例子中,这就是为什么得到不同的解决方案。

再见



文章来源: Negation as failure in Prolog is a procedural behavior?
标签: prolog