Prolog数据库允许重复事实与规则的原因及逻辑影响探究
Prolog数据库允许重复事实与规则的原因及逻辑影响探究
咱们直接切入核心问题:为啥Prolog允许数据库里存在重复的事实和规则呢?
其实要实现事实的「幂等添加」(也就是加过的事实再添加就自动忽略)并不难,但规则就不一样了——要判断两个规则在逻辑上是否等价,这事儿可没那么简单。比如看起来变量名不同的规则,本质上可能是同一个逻辑含义,但要精准识别这种等价性,涉及到变量重命名、子句结构匹配、逻辑语义对齐等一堆复杂操作,实现起来成本很高。
不过允许重复确实会带来一些看起来「出乎意料」的结果,而且这些结果从纯逻辑角度看是站不住脚的。举个实际的例子:
f(a). f(a). g(X) :- f(X). g(Z) :- f(Z). findall(Y, g(Y), Y).
这段代码运行后会得到 Y = [a,a,a,a]。从操作层面看,这个结果很好理解——Prolog的回溯机制会遍历所有可用的子句:两个f(a)事实,两个g规则,两两组合下来就有4次匹配,自然会收集到4个a。
但从声明式逻辑解释的角度看,这就有点别扭了:重复声明f(a)并不会让这个命题「更真」,逻辑上g(Y)的解应该只有一个a才对。这就导致了Prolog的操作行为和纯逻辑语义之间出现了偏差。
那为啥Prolog要这么设计呢?大概率是出于性能的考量——就像很多Prolog实现会在合一过程中去掉所谓的「发生检查」一样,如果每次添加子句都要检查是否和已有的事实/规则重复(尤其是规则的逻辑等价性检查),会给程序带来极大的性能负担,拖慢运行效率。与其为了纯逻辑的严谨性牺牲性能,不如把这个控制权交给开发者,由开发者来决定是否需要避免重复。
备注:内容来源于stack exchange,提问作者nanitous
相关产品推荐
相关产品推荐

