关于Prolog中非谓词的声明性解释的一些问题

时间:2013-04-09 16:05:56

标签: prolog

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

我知道我只能以这种方式实现 not 谓词:

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

其中P是谓词,如果P为TRUE,则P不为FALSE,如果P为假,则为PUE。

阅读布拉特科的书,我可以读到:

  

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

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

在我看来,这是一种 if {} else {} 通过cut和fail谓词谓词实现的形式......我用这种方式阅读:

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

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

ELSE P为FALSE而不是P为TRUE。

我不知道我的解释是否错误,如果我在推理中遗漏某些东西,或者我对愚蠢问题做了很多问题......

1 个答案:

答案 0 :(得分:4)

我没有太多要添加到@hardmath所说的内容(+1),但是我会说更多的话来说明这不是评论。

首先,你在程序性和陈述性之间看到了一种艰难的二分法,但是还有其他方式可以看待事物,很多东西都处于中间位置。 \+就是其中之一,因为它有一个主要是声明性的读数,但声明性读数不足的地方与它在机器上执行有关。但是Prolog的所有内容都是在一台机器上执行的,并不意味着你永远无法以声明的方式思考。这不是一个全有或全无的主张。所谓的语外或元谓词setof/3等。人。为您提供严格来说不是一阶逻辑的结果,但这并不意味着它们是程序性的,甚至不一定是以一种明显的程序性方式实施的。简而言之:宇宙中存在着比“程序性”和“声明性”更多的东西,并且它并不总是被切割和干燥的

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

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