我对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中,我不能简单地说出这样的话:“Mary喜欢每一只动物,但不喜欢这些动物” 而且我必须以这种方式表达它:“如果X是蛇,那么玛丽不喜欢它。否则,如果它是动物,玛丽就喜欢它了”
先前的程序完全按照以下规则执行:
likes(mary,X) :- snake(X),
!,
fail.
Prolog检查X是否为蛇,强制切割以避免回溯并强制谓词失败。
通过这种方式,如果 snake(X) TRUE ,程序会强制头部的故障发生偏离喜欢(mary,X)强加回溯避免了在程序中执行其他规则的可能性(因为蛇也是动物而回答为真)
我的问题是:我觉得Prolog的这种用法不属于逻辑和陈述范式,在某种程度上属于某种程序范式
由于:
在我看来,这更接近程序性意义,即经典的逻辑意义......
是吗?是不是在这些情况下,Prolog使用程序行为来克服逻辑的限制?答案 0 :(得分:5)
我不同意逻辑的限制。
同样是
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.
答案 1 :(得分:0)
大多数情况下,使用剪切(!)的程序 对他们的目标和条款的排序敏感 意义而不仅仅是他们的终止,所以他们是 通常不是陈述性的。
否定为失败(\ +)以某种方式进行封锁 那个切口。它由大多数Prolog定义甚至实现 系统如下:
\+ X :- X, !, fail.
\+ _ .
虽然它暗示了逻辑意义并因此暗示了宣告性, 否定因为失败仍然对秩序敏感 目标。这是一个例子。假设我们有以下内容 数据库:
p(a).
q(b,c).
然后以下查询生成X = a作为解决方案:
?- p(X), \+ q(X,Y).
X = a.
但是如果连接(,)/ 2切换侧的参数, 获得了不同的结果:
?- \+ q(X,Y), p(X).
false.
因为失败本身并不是声明的否定。对于 论证的基本论点,作为失败的否定 在存在量词中。所以形式的查询:
?- A(X), \+ B(X,Y).
基本上具有量化新鲜的含义 否定内的变量Y:
?- A(X), ~ exists Y B(X,Y).
所以在上面的例子中,连接被切换, 随着失败的变化,在否定中的一组新变量,那就是 为什么会得到不同的解决方案。
再见