Prolog编程语言和证明树

时间:2014-06-21 15:10:23

标签: prolog

回想一下这个证明元循环

solve(true, true).
solve([], []). 
solve([A|B],[ProofA|ProofB]) :-
   solve(A,ProofA),
   solve(B, ProofB).
solve(A, node(A,Proof)) :-
   rule(A,B),
   solve(B,Proof).

假设解释器的第三条规则被更改,而解释器的其他规则不变,如下所示:

% Signature: solve(Exp, Proof)/2 solve(true, true). 
solve([], []).                                      
solve([A|B], [ProofA|ProofB]) :-
   solve(B, ProofB),   %3
   solve(A, ProofA). 
solve(A, node(A, Proof)) :-
   rule(A, B),
   solve(B, Proof). 

考虑将在两个版本中为某些查询创建的证明树。是否只能在一个版本中实现任何变量替换?说明。任何真叶都可以移动到最左边无限分支的另一边吗?说明。如果答案是肯定的,那么在两个问题中给出一个例子。这将如何影响证据?

请帮帮我! TX

1 个答案:

答案 0 :(得分:1)

(我对你的元翻译有很多保留意见。但首先我会回答你的问题)

在这个元解释器中,你正在实现(实现)连接。你用Prolog的结合实现它。现在您有两种不同的版本来解释连词。一旦你说首先证明A,那么B.然后你说相反。

想想

p :- p, false.

p :- false, p.

第二个版本将产生一个有限的失败分支,而第一个版本将产生一个无限的失败分支。这将是使用一个或另一个元解释器的效果。注意这个"错误"通过解释元解释器本身可以再次缓解这种情况!

另请参阅this answer,这可能会略微阐明这些概念。

还有其他方法可以实现连接(通过二值化);这样,下一级元解释器将无法再进行补偿。


最后评论你的元解释器的风格:你正在混合列表和其他术语。事实上[true|true]将是真的。一定要避免这种表现。要么坚持使用传统的"香草"在Prolog规则的语法树上运行的表示。也就是说,连词表示为(',')/2。或坚持列表。但不要混合列表和其他表示。