首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog程序设计语言与证明树

Prolog程序设计语言与证明树
EN

Stack Overflow用户
提问于 2014-06-21 23:10:23
回答 1查看 566关注 0票数 0

回想一下这个证明元循环

代码语言:javascript
复制
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).

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

代码语言:javascript
复制
% 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). 

考虑将在两个版本中为某些查询创建的证明树。变量替换只能在一个版本中实现吗?解释一下。任何真正的叶子可以移动到最左边的无限分支的另一边吗?解释一下。在这两个问题中,如果答案是肯定的,请举例说明。这将对证据产生怎样的影响?

请帮帮我!发送

EN

回答 1

Stack Overflow用户

发布于 2014-06-22 01:55:48

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

在这个元解释器中,你正在具体化(~实现)合取。你可以用Prolog的合取来实现它。现在,您有两个不同的版本来解释连接词。一旦你说先证明A,然后证明B,然后你说相反的。

想想

代码语言:javascript
复制
p :- p, false.

代码语言:javascript
复制
p :- false, p.

第二个版本将产生一个有限故障分支,而第一个版本将产生一个无限故障分支。所以这就是使用一个或另一个元解释器的效果。请注意,这个“错误”可以通过解释元解释器本身来减轻!

另请参阅this answer,它可能会稍微澄清一些概念。

还有其他方法来实现合取(通过二值化);这样下一级元解释器将不再能够进行补偿。

最后,关于你的元解释器的风格:你混合了列表和其他术语。事实上,[true|true]将会是真的。一定要避免这样的表示。要么坚持传统的“香草”表示法,它在Prolog规则的语法树上操作。也就是说,合取被表示为(',')/2。或者坚持使用列表。但不要混用列表和其他表示法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24342923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档