“逻辑纯度”是什么意思(在Prolog编程中)? logical-purity标记信息说“仅使用Horn子句的程序”,但是,像if_/3这样的谓词将如何限定使用,使用尽可能多的剪切以及各种元逻辑(正确的术语是什么?等)谓词,即低级内容。

我知道它可以达到某种“纯粹”的效果,但这究竟意味着什么?

有关更具体的说明,请说明var/1如何在逻辑上纯净(例如在使用中看到的) in this answer

最佳答案

首先让我们习惯于对逻辑程序进行声明式阅读。

声明式地,Prolog程序说明了什么是正确的。

例如

natural_number(0).
natural_number(s(X)) :-
        natural_number(X).


第一条说明:0是自然数。

第二个子句指出:如果X是自然数,则s(X)是自然数。

现在让我们考虑对该程序进行更改的影响。例如,当我们更改这两个子句的顺序时,会发生什么变化?

natural_number(s(X)) :-
        natural_number(X).
natural_number(0).


声明式地,交换子句的顺序不会以任何方式改变程序的预期含义(析取是可交换的)。

在操作上,也就是说,考虑到Prolog的实际执行策略,显然不同的子句顺序通常会产生显着差异。

但是,无论选择的子句顺序如何,纯Prolog代码的一个极好的属性都得以保留:


如果查询Q对于排序O1的子句成功,则
Q不会因其他顺序O2而失败。


请注意,我并不是说Q总是也以不同的顺序成功:这是因为查询也可能以不同的顺序循环或产生错误。

对于两个查询Q1Q2,我们说G1是更通用的,因为它在语法统一方面包含了G2。例如,查询?- parent_child(P, C).比查询?- parent_child(0, s(0)).更通用。

现在,使用纯Prolog程序,另一个非常不错的属性得以保存:


如果查询Q1成功,则每个普通查询Q2都不会
失败。


再次注意,Q2可能会循环而不是成功。

现在考虑您提到的var/1的情况,并考虑相关谓词nonvar/1。假设我们有:

my_pred(V) :-
        nonvar(V).


什么时候举行?显然,只要参数不是变量,它就适用。

如预期的那样,我们得到:

?- my_pred(a).
true.


但是,对于更一般的查询?- my_pred(X).,我们得到:

?- my_pred(X).
false.


这样的谓词称为非单调性,由于此属性,您不能将其视为真实关系:这是因为上面的答案false在逻辑上意味着没有任何解决方案,但是在前面的示例中,我们看到了有一个解决方案。因此,从逻辑上讲,通过添加约束建立的更具体的查询使查询成功:

?- X = a, my_pred(X).
true.


因此,对这样的谓词进行推理非常复杂,以至于用它们进行编程根本没有意思。它使声明式调试变得不可能,并且很难声明保留的任何属性。例如,仅在上述联合查询中交换子目标的顺序将使其失败:

?- my_pred(X), X = a.
false.


因此,我强烈建议您留在Prolog的纯单调子集中,这允许按照上面概述的方式进行陈述性推理。

CLP(FD)约束,dif/2等在这种意义上都是纯净的:无论使用何种方式,顺序等,都不能欺骗这些谓词以给出逻辑上无效的答案。 if_/3也满足此属性。另一方面,var/1nonvar/1integer/1!/0,具有副作用的谓词等都是在逻辑上引用正在描述的声明性世界之外的内容,因此不能被认为是纯。

编辑:澄清:我在这里提到的好属性绝不是穷举。纯粹的Prolog代码还具有许多其他非常有价值的属性,通过它们您可以了解逻辑编程的荣耀。例如,在纯粹的Prolog代码中,添加子句最多​​可以扩展解决方案集,但绝不能缩小解决方案的范围。添加目标最多只能缩小目标,而不能扩展目标,等等。

使用单个逻辑外原语可能并且通常会破坏许多这些属性。因此,例如,每次使用!/0时,都应将其视为纯净之心的切入点,并尝试为伤害这些属性而感到遗憾和羞愧。

好的Prolog书籍至少会开始引入或包含许多提示来鼓励这种声明式观点,引导您考虑更一般的查询,保留的属性等。不好的Prolog书籍对此不多说,通常最终使用正是那些不纯净的语言元素破坏了语言的最宝贵和最美丽的特性。

很好地利用这些属性来实现声明性调试的Prolog教学环境称为GUPU,我强烈建议您检查一下这些想法。乌尔里希·纽默克尔(Ulrich Neumerkel)慷慨地提出了一个核心思想,该思想在他的环境中得到部分使用,以library(diadem)的形式提供。请参阅源文件,以获取有关如何以声明方式调试意外失败的目标的好示例:该库系统地构建仍然失败的查询的概括。这种推理当然可以与纯代码完美配合。

关于prolog - Prolog中的“逻辑纯正”是什么意思?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31941407/

10-13 22:51