要素をツリーに挿入し、新しいツリーを返す関数を作成しました。次の形式を取ります。
% insert(Element, OldTree, NewTree)
?-insert(2, tree(nil, 5, nil), T).
そして、理論的には、次を返す必要があります。
T = tree(tree(nil, 2, nil) 5, nil)
簡単に言えば、左側のサブツリーに 2 つが追加され、バイナリにするために nil が追加されます。ただし、私の実装では、2つは左と右の両方のサブツリーに追加されます。条件には常に違反があります。2 が 6 だった場合でも、右側だけでなく両方のサブツリーに追加されます。
このコードを 1 時間調べましたが、バグが見つかりません。新鮮な目がこれをすくい取ることができますか?
tree(Left, Root, Right).
insert(Item, Oldtree, Newtree).
%tree is empty
insert(Element, Empty, tree(Empty, Element, Empty)):-!.
%tree isn't empty. if NewItem is less than Root, we put it on the left subtree
insert(NewItem, tree(LeftSubtree, Root, RightSubtree), tree(NewLeftSubtree, Root, RightSubtree)):-
NewItem < Root,
!,
insert(NewItem, LeftSubtree, NewLeftSubtree).
%else
insert(NewItem, tree(LeftSubtree, Root, RightSubtree), tree(LeftSubtree, Root, NewRightSubtree)):-
NewItem > Root,
!,
insert(NewItem, RightSubtree, NewRightSubtree).