Является ли данный термин пролога бинарным деревом - PullRequest
0 голосов
/ 21 апреля 2019

Я определил, является ли данный термин членом двоичного дерева по определениям:

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).
...