我已经通过定义定义了给定术语是否为二叉树的成员:
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).