2013-04-05 2 views
1

Я пытаюсь определить простое двоичное дерево поиска. Он хранится в списках следующим образом: [Key, Left Tree, Right Tree]. Я считаю, что я это сделал, но когда я пытаюсь использовать bstadd на существующем дереве, я получаю следующую ошибку.Неопределенная процедура, когда процедура определена

?- bstadd(19,[],T1), bstadd(9, T1, T2). 
ERROR: bstadd/3: Undefined procedure: right/3 
    Exception: (8) right(9, [[], []], _G3233) ? 

Я определил право с тремя arugments на линии 8. Ниже мой код:

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

Любое понимание ценится.

ответ

2

Всегда смотрите, что говорят системы при загрузке файла. Я уверен, что произошла какая-то синтаксическая ошибка. В вашем случае right/3 содержит синтаксическую ошибку в конце. Существует непревзойденное закрытие ].

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

Это было. Моя подсказка загружает файл автоматически, и я никогда не замечал синтаксических ошибок с юридическими предупреждениями. Благодаря! – stygma

+1

@stygma: Многие системы Prolog не останавливаются на таких ошибках, но продолжают. Также следите за «несметными» предупреждениями и предупреждениями о переменных. В других языках программирования компилятор немедленно остановится. В Prolog вам нужно следить! – false

Смежные вопросы