Prolog 定义过程时未定义过程

Prolog 定义过程时未定义过程,prolog,Prolog,我试图定义一个简单的二叉搜索树。它存储在如下列表中:[键,左树,右树]。 我相信我已经这样做了,但是当我尝试在现有的树上使用bstadd时,我得到了以下错误 ?- bstadd(19,[],T1), bstadd(9, T1, T2). ERROR: bstadd/3: Undefined procedure: right/3 Exception: (8) right(9, [[], []], _G3233) ? 我在第8行定义了三个Arumings。以下是我的代码: % bstadd(

我试图定义一个简单的二叉搜索树。它存储在如下列表中:[键,左树,右树]。 我相信我已经这样做了,但是当我尝试在现有的树上使用bstadd时,我得到了以下错误

?- bstadd(19,[],T1), bstadd(9, T1, T2).
ERROR: bstadd/3: Undefined procedure: right/3
   Exception: (8) right(9, [[], []], _G3233) ?
我在第8行定义了三个Arumings。以下是我的代码:

% 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).
%bstadd(键、树、新树)
%将元素键添加到树并返回
%新树是新树。左子树L中的元素必须小于Key和
%右子树R中的元素必须大于键。这意味着重复
%在二进制搜索树中不允许使用。不要把打印的语句放在这里
%谓词。
右(键[TreeKey | TreeTail],[TreeKey | NewTree]):-grabtail(键,TreeTail,NewTree])。
grabtail(键[TreeKey | | |],[TreeKey | NewTree]):-bstadd(键,TreeKey,NewTree)。
bstadd(键,[],[键,[],[])。
bstadd(KEY[TreeKey | TreeTail],[TreeKey | NewTree]):-KEY>TreeKey,grabtail(KEY,TreeTail,NewTree)。
bstadd(KEY[TreeKey | TreeTail],[TreeKey | NewTree]):-KEY

非常感谢您的所有见解。

在加载文件时,请始终查看系统所说的内容。我肯定有某种语法错误。在您的例子中,
right/3
结尾包含语法错误。有一个不匹配的结束
]

right(Key, [TreeKey|TreeTail], [TreeKey|NewTree]) :- grabtail(KEY, TreeTail, NewTree]).
                                                                                   ^^^

就这样。我的提示符会自动加载文件,我从来没有注意到带有法律警告的语法错误。谢谢@stygma:许多Prolog系统不会在出现此类错误时停止,而是继续。还要注意“不连续”警告和关于变量的警告。在其他编程语言中,编译器会立即停止。在序言中,你必须小心!