単純な二分探索木を定義しようとしています。[キー、左ツリー、右ツリー] のようなリストに格納されます。これを行ったと思いますが、既存のツリーで bstadd を使用しようとすると、次のエラーが発生します。
?- bstadd(19,[],T1), bstadd(9, T1, T2).
ERROR: bstadd/3: Undefined procedure: right/3
Exception: (8) right(9, [[], []], _G3233) ?
8 行目の 3 つの引数で権利を定義しました。次のコードは次のとおりです。
% bstadd(Key, Tree, NewTree)
% add the element Key to the tree Tree and return an
% new tree as NewTree. Element in the left subtree L must be less than Key and
% elements in the right subtree R must be greater than Key. This means duplicates
% are not allowed in the binary search tree. Don’t put print statements in this
% predicate.
right(Key, [TreeKey|TreeTail], [TreeKey|NewTree]) :- grabtail(KEY, TreeTail, NewTree]).
grabtail(KEY, [TreeKey|_], [TreeKey|NewTree]) :- bstadd(KEY, TreeKey, NewTree).
bstadd(KEY, [], [KEY,[],[]]).
bstadd(KEY, [TreeKey|TreeTail], [TreeKey|NewTree]) :- KEY > TreeKey, grabtail(KEY, TreeTail, NewTree).
bstadd(KEY, [TreeKey|TreeTail], [TreeKey|NewTree]) :- KEY < TreeKey, right(KEY, TreeTail, NewTree).
% inorder(Tree)
% given a binary search tree Tree perform an inorder traversal of the
% Tree printing (use print(X) ) the value of each vertex inorder.
inorder([TreeHead|TreeTail]) :- inright(TreeTail), print(TreeHead), intail(TreeTail).
inright([_|TreeTail]) :- intail(TreeTail).
intail([TreeHead|_]) :- inorder(TreeHead).
ありとあらゆる洞察が高く評価されます。