回想一下这个证明元循环
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
答案 0 :(得分:1)
(我对你的元翻译有很多保留意见。但首先我会回答你的问题)
在这个元解释器中,你正在实现(实现)连接。你用Prolog的结合实现它。现在您有两种不同的版本来解释连词。一旦你说首先证明A,那么B.然后你说相反。
想想
p :- p, false.
和
p :- false, p.
第二个版本将产生一个有限的失败分支,而第一个版本将产生一个无限的失败分支。这将是使用一个或另一个元解释器的效果。注意这个"错误"通过解释元解释器本身可以再次缓解这种情况!
另请参阅this answer,这可能会略微阐明这些概念。
还有其他方法可以实现连接(通过二值化);这样,下一级元解释器将无法再进行补偿。
最后评论你的元解释器的风格:你正在混合列表和其他术语。事实上[true|true]
将是真的。一定要避免这种表现。要么坚持使用传统的"香草"在Prolog规则的语法树上运行的表示。也就是说,连词表示为(',')/2
。或坚持列表。但不要混合列表和其他表示。