首页 > 解决方案 > 给定的序言项是二叉树吗

问题描述

我已经通过以下定义定义了给定术语是否是二叉树的成员:

isBtMember(E,bt(E,_L,_R)).
isBtMember(E,bt(_Rt,L,_R)) :- isBtMember(E,L).
isBtMember(E,bt(_Rt,_L,R)) :- isBtMember(E,R).

通过使用它,我想创建一个定义来检查给定项是否是二叉树。

现在,当谈到我对 的定义时isBtMember,它可以工作,但不适用于以下查询:
?- btMember(bt(a,b),bt(_,_,_)).我试图询问 a 的错误定义是否bt可能是 any 的成员bt。但是,让我们把它放在一边。

现在,我对我的定义的想法isBt是这样的:
isBt(bt(E,L,R)) :- isBtMember(bt(_,_,_),L), isBtMember(bt(_,_,_),R).
我检查左节点和右节点是否是二叉树?但似乎这个定义是错误的,因为它在查询中给出了错误的结果。

关于我的错误或更好的方法的任何建议?
谢谢

编辑:这是我认为的另一种解决方案。感觉不对,因为_E可以取任何值,例如isBt(bt(asd(a,b,c,), nil,nil))并且仍然返回 true。

isBt(nil). 
isBt(bt(_E,nil,nil)). 
isBt(bt(_E,L,nil)) :- isBt(L). 
isBt(bt(_E,nil,R)) :- isBt(R). 
isBt(bt(_E,L,R)) :- isBt(L), isBt(R).

标签: typesprologbinary-treepredicate

解决方案


推荐阅读