给定的序言术语是二叉树吗

时间:2019-04-21 03:29:25

标签: types prolog binary-tree predicate

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

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(_,_,_)).,我试图问一个错误的bt定义是否可能是任何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).

0 个答案:

没有答案