这个问题在这里已有答案:
我认为我认为我对Prolog中 not 谓词的声明性观点有点混淆 .
我有这个我可以简单地以这种方式实现 not 谓词:
not(P) :- P, !, fail;
true.
其中P是谓词,如果P为TRUE则不是P为FALSE,如果P为假,则P为TRUE .
阅读布拉特科书,我可以读到:
如果目标成功则不然(目标)失败,否则(目标)成功
好吧,也许我在尝试解释这段代码片段时遇到了很多问题,但在我看来,这超出了声明范式和逻辑,并进入某种程序范式
在我看来,这是一种由cut和fail谓词谓词实现的 if{} else{} 形式......我用这种方式阅读它:
P is a boolean predicate that can only be: TRUE or FALSE
如果P为TRUE则强制失败(因此不是(P)为FALSE)并避免回溯而没有其他响应 .
ELSE P为FALSE而不是P为TRUE .
我不知道我的解释是否错误,如果我在推理中遗漏了某些东西,或者我对愚蠢问题做了很多问题......
1 回答
我没有太多补充@hardmath所说的(1)但是我会说更多的话来说明这不是评论 .
首先,你在程序性和陈述性之间看到了一种艰难的二分法,但是还有其他方式可以看待事物,很多事情都处于中间 .
\+
就是其中之一,因为它有一个主要是声明性的读数,但声明性读数不足的地方与它在机器上执行有关 . 但是Prolog的所有内容都是在一台机器上执行的,而且它从未能够以声明的方式进行思考 . 这不是一个全有或全无的主张 . 所谓的语外或元谓词setof/3
等 . 人 . 为您提供严格来说不是一阶逻辑的结果,但这并不是程序性的,甚至不一定是以一种明显的程序性方式实施的 . 简而言之:宇宙中有比"procedural"和_579541更多的东西,它并不总是被切割干燥的 .其次,你坚持阅读条件逻辑本身就是程序性的 . 我认为这是对低级细节的固定 . 是的,你可以用很多红色剪辑来编写Prolog并且只允许程序性阅读,但只是使用if / then逻辑并不需要在程序上阅读它,事实上你可能不应该这样做 . 即使排序条件会影响性能,有时也会影响正确性,但是你永远不能逃脱它或者意识到声明性编程的好处 . 简而言之:if / then / else不需要被理解为固有的程序性 .
总结一下:放松一下 . :)