1

我认为我认为我对Prolog 中非谓词的声明性观点有些混淆。

我有我可以通过这种方式简单地实现谓词:

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

其中 P 它是一个谓词,如果 P 它是 TRUE,则 P 是 FALSE,如果 P 它是 false,则 P 是 TRUE。

阅读 Bratko 的书,我可以阅读:

如果 Goal 成功,则 not(Goal) 失败,否则 not(Goal) 成功

好吧,也许我在试图解释这个代码片段时遇到了很多问题,但似乎我认为这超出了声明性范式和逻辑,并进入了某种程序范式

在我看来,这是if{} else{}的一种形式,由 cut 和 fail 谓词谓词实现......我是这样读的:

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

如果 P 为 TRUE,则强制失败(因此 not(P) 为 FALSE)并避免回溯以没有其他响应。

ELSE P 是 FALSE 而不是 P 是 TRUE。

我不知道我的解释是否错误,我是否在推理中遗漏了什么,或者我是否对愚蠢的问题做了很多问题......

4

1 回答 1

4

对于@hardmath 所说的(+1),我没有太多要补充的东西,但我需要更多的话才能说出来,所以这不是评论。

首先,您会看到程序性和声明性之间的硬性二分法,但是还有其他看待事物的方式,而且很多事情都处于中间位置。\+是其中之一,因为它具有主要的声明性阅读,但声明性阅读不足的地方与它在机器上执行有关。但是所有的 Prolog 都是在一台机器上执行的,这并不意味着你永远无法进行声明式思考。这不是一个全有或全无的命题。所谓的外逻辑或元谓词setof/3等。人。为您提供的结果严格来说不是一阶逻辑,但这并不意味着它们是程序性的,甚至不一定是它们以明显的程序性方式实现的。简而言之:在宇宙中,除了“程序性”和“声明性”之外,还有更多的东西,而且它并不总是一成不变的

其次,您坚持将条件逻辑理解为本质上是程序性的。我认为这是对低级细节的关注。是的,您可以编写带有很多红色剪辑的 Prolog,并且只承认程序性阅读,但只需使用 if/then 逻辑就不需要这样做,也不是从一个到另一个的滑坡。你似乎执着于将“如果 X 则 Y 否则 Z”解读为“首先,你做 X,然后如果成功你做 Y,或者如果失败,然后做 Z”。但是您不必按程序阅读它,实际上您可能不应该这样做。即使对条件进行排序会影响性能,有时还会影响正确性,但您不需要让它为您抹去声明性阅读。毕竟,在任何语言中,这在某种程度上都是正确的,由于停机问题以及我们在机器上执行程序的事实。如果即使在 Prolog 中我们也让它毒化了我们的理解,我们将永远无法摆脱它或实现声明式编程的好处。简而言之:if/then/else 不需要被理解为本质上是程序性的。

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

于 2013-04-09T17:13:34.993 回答