2013-04-09 19 views
2

我认为我认为我对Prolog中的而不是谓词的声明性视图有点混淆。关于在Prolog中声明性解释非谓词的一些问题

我有我可以实现简单地以这种方式断言:

not(P) :- P, !, fail; 
      true. 

其中P是一个谓语,而不是P为FALSE如果P是真时真如果P是假的。

阅读的Bratko书我能读:

如果目标则成功不是(目标)失败,否则不(目标)成功

好吧,也许我在做多试图解释这段代码片段的问题,但似乎我超越了陈述范式和逻辑,进入某种程序范式

在我看来,这是一种形式如果{}否则{}实现由切口和失败作谓语......我这样阅读:

P是一个布尔谓词只能是:TRUE或FALSE

如果P为TRUE,那么强制失败(所以不是(P)就是FALSE)并且避免回溯而没有其他响应。

ELSE P为FALSE而不是P为TRUE。

我不知道如果我的解释是错误的,如果我缺少的推理,或者如果我在做与愚氓问题太大的问题的东西...

+5

既然你问了[昨天一个非常类似的问题](http://stackoverflow.com/q/15883938/487781),你接受了一个答案,或许是时候停下来,并理解你的理解。您对** not/1 **或** \ +/1 **(ISO)metapredicates的“程序性”解释似乎是正确的和不常见的。你引用Bratko的话。是的,它可以作为if-then-else编程的一种形式。有一个原因是否定 - 作为失败被执行,而不是试图提供一个纯粹的逻辑否定语义。请缩小你真正想要的答案。 – hardmath 2013-04-09 16:41:03

+1

@hardmath:我已经尝试了几次,但他忽略了它。有时候我会举报,但这是无望的。 – false 2013-04-09 18:27:15

+2

我们可以以完全重复的方式关闭。 – 2013-04-09 18:30:09

回答

4

我没有太多的添加到@hardmath说(+1),但它会用我更多的话来说,所以它不是一个评论。

首先,你在程序和声明之间看到了一种艰难的二分法,但还有其他的方式来看待事物,而许多事物都处于中间。 \+就是其中之一,因为它有一个大部分是陈述式的阅读,但是陈述性阅读不足的地方与它在机器上执行有关。但是所有的Prolog都是在一台机器上执行的,并不意味着你永远无法用声明来思考。这不是一个全有或全无的命题。所谓的extralogical或meta predicates setof/3 et。人。为您提供的结果不是严格意义上的一阶逻辑,但这并不意味着它们是程序性的,甚至不一定是以公开程序的方式实施的。简而言之:在宇宙中比“程序性”和“陈述性”更多的东西,它并不总是被切割和干燥,它们是哪一个,哪个是

其次,你坚持把条件逻辑看作固有的程序。我认为这是对低层次细节的固定。是的,你可以写出大量红色剪辑,并且只承认程序性阅读,但是如果使用逻辑不是必须的,也不是从一个到另一个的滑坡。你似乎专注于阅读“如果X,Y,否则Z”为“首先,你做X,如果成功,你做Y,或者如果失败,那么做Z.”但是你不必在程序上阅读它,事实上你可能不应该这样做。即使排序条件会影响性能,有时也会影响正确性,但您不需要让它为您抹去声明性阅读。毕竟,在任何语言中,这都会在某种程度上是真实的,这要归功于暂停的问题以及我们在机器上执行程序的事实。如果我们在Prolog中让我们的理解受到毒害,我们将永远无法摆脱它,或者意识到声明式编程的好处。总之:if/then/else不需要被理解为固有的程序

所以总结一下:放松一下。 :)

+0

总是一个很好的建议。 :)虽然,我不确定这一点;如果谓词顺序改变时结果发生变化,我认为这是程序代码的定义。此外,最好*总是*读“不”作为“不能证明......”,这也是程序性的。 – 2013-04-09 17:34:30

+0

如果X是红色并且X是一只鸟,那么X是一个红衣主教。是的,在一台机器上,你必须首先尝试“红色”测试,但这并不意味着这是固有的程序。 – 2013-04-09 17:35:36

+0

您在示例中缺少其他部分。你显示的只是一个连接点。 – 2013-04-09 17:36:11