Предикат buildTree, первым аргументом которого является список узлов, а вторым аргументом является дерево - PullRequest
0 голосов
/ 02 апреля 2012

Я хочу определить 2-местный предикат buildTree, первым аргументом которого является список узлов (т.е. [a, b, c]), а вторым аргументом является дерево tree (a, tree (b, nil), ноль), дерево (с, ноль, ноль)) * * +1002.Это предикат "дерево":

tree(nil). 
tree(tree(_,L,R)):-tree(L),tree(R).

, и это предикат "buildTree":

buildTree([],nil).
buildTree([X|[Y|H]],tree(X,L,R)):-
   buildTree([Y|H],L),
   buildTree(H,R).

, но с запросом, то есть buildTree([a,b,c],T), я не сложныйсрок tree(a,tree(b,nil,nil),tree(c,nil,nil)).Почему?

1 Ответ

0 голосов
/ 02 апреля 2012

Вы не правильно определили buildTree, во-первых, вы не определили его ни для одного, ни для двух входов, поэтому, по логике, ваш ответ окажется неверным.

в строке должно быть большеthis:

/* Stopping conditions */
buildTree([X | nil], tree(X, nil, nil)). /* First trivial case */
buildTree([X | [Y | nil]], tree(X, tree(Y, nil, nil), nil)). /* Second case */

/* builds a tree, according to your reasoning */
buildTree([X | [Y | H]], tree(X, L, R)) :- buildTree(Y, L), buildTree(H, R).

Конечно, это не бинарное дерево поиска (для этого вам придется определить некоторую логику, например, treeInsert).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...