Я определил, является ли данный термин членом двоичного дерева по определениям:
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).