Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Prolog] Бинарные деревья


Автор: Micher 22.12.2006, 09:38
На 3 задачу один человек вот что мне написал:

------------------
Третья задача.
Вот тест (VIP7) возможности преобразования спиcка целых чисел в бинарное дерево с указанными свойствами. Попробуйте сами модифицировать прогу так, чтобы она строила бинарное дерево.

Код

сlass predicates
test: (integer_list) procedure (i).
sum_bintree: (integer_list) multi (i).
nd_cut_elem: (integer,integer_list,integer_list) nondeterm (o,i,o) (i,i,o).
clauses
test(L):-sum_bintree(L),!.

sum_bintree(L):-
   nd_cut_elem(E1,L,L1),
   nd_cut_elem(E2,L1,L2),
   nd_cut_elem(E1+E2,L2,_),
   sum_bintree(L2).
sum_bintree([_]):-write("Дерево существует."),!.
sum_bintree(_):-write("Дерево не существует."),!.

nd_cut_elem(E,[E|L],L).
nd_cut_elem(E,[Q|L],[Q|L1]):-nd_cut_elem(E,L,L1).

run():-
   init(),
   L=[1,5,8,3,2],
   test(L),
   _= readchar().


Подсказка: достаточно добавить один аргумент в предикат sum_bintree() в котором собирать дерево.
------------------

Помогите доделать

Автор: Artemios 22.12.2006, 14:16
Попробовал потестировать твой код:
Код

test(L):-sum_bintree(L),!.

sum_bintree(L):-
   nd_cut_elem(E1,L,L1),
   nd_cut_elem(E2,L1,L2),
   nd_cut_elem(E1+E2,L2,_),
   sum_bintree(L2).
sum_bintree([_]):-write('Дерево существует.'),!.
sum_bintree(_):-write('Дерево не существует.'),!.

nd_cut_elem(E,[E|L],L).
nd_cut_elem(E,[Q|L],[Q|L1]):-nd_cut_elem(E,L,L1).

проверяю:
Цитата

?- test([1,2,3,6,1,2,3]).
Дерево не существует.

Yes
?-   

хотя очевидно, для заданного списка должно существовать. (Тест в swi-prolog)

Автор: Micher 18.1.2007, 16:36
Цитата(Artemios @ 17.12.2006,  05:32)
Цитата(Micher @  15.12.2006,  18:15 Найти цитируемый пост)
1) Дан ориентированный граф.

[code=nocolor]
вершина(а,1).
вершина(б,2).
вершина(в,3).
вершина(г,4).
вершина(д,5).
вершина(е,6).
ребро(а,б).
ребро(а,в).
ребро(б,г).
ребро(б,в).
ребро(б,д).
ребро(в,г).
ребро(в,д).
ребро(г,е).
ребро(д,г).
ребро(д,е).

путь1(А,[А|Путь],[А|Путь]).
путь1(А,[Б|Путь1],Путь):-
    ребро(В,Б),
    not(member(В,Путь1)),
    путь1(А,[В,Б|Путь1],Путь).

...
...  
[/QUOTE]
А не могли бы вы адаптировать данный код для Турбо Пролога?

Автор: Artemios 19.1.2007, 03:20
Micher, тебе ведь уже полностью решение задачи №3 расписали на другом форуме, где люди преимущественно работают с Визуал и Турбой smile  
(если не считать красиво форматированной распечатки дерева.)
Чтобы альтруисты зазря головы не ломали, запостил бы и сюда конечный вариант smile 
И для будущих поколений замученных студентов, авось, пригодится smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)