首页 文章

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

提问于
浏览
2

这个问题在这里已有答案:

我认为我认为我对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 回答

  • 4

    我没有太多补充@hardmath所说的(1)但是我会说更多的话来说明这不是评论 .

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

    其次,你坚持阅读条件逻辑本身就是程序性的 . 我认为这是对低级细节的固定 . 是的,你可以用很多红色剪辑来编写Prolog并且只允许程序性阅读,但只是使用if / then逻辑并不需要在程序上阅读它,事实上你可能不应该这样做 . 即使排序条件会影响性能,有时也会影响正确性,但是你永远不能逃脱它或者意识到声明性编程的好处 . 简而言之:if / then / else不需要被理解为固有的程序性 .

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

相关问题