Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Prolog] Бинарные деревья 
:(
    Опции темы
Micher
Дата 22.12.2006, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 13.1.2006
Где: г. Ижевск

Репутация: нет
Всего: нет



На 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() в котором собирать дерево.
------------------

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

Это сообщение отредактировал(а) Guedda - 18.1.2007, 18:01
PM MAIL   Вверх
Artemios
Дата 22.12.2006, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 2
Всего: 50



Попробовал потестировать твой код:
Код

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)


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
Micher
Дата 18.1.2007, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 13.1.2006
Где: г. Ижевск

Репутация: нет
Всего: нет



Цитата(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]
А не могли бы вы адаптировать данный код для Турбо Пролога?
PM MAIL   Вверх
Artemios
Дата 19.1.2007, 03:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 2
Всего: 50



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

Это сообщение отредактировал(а) Artemios - 19.1.2007, 03:53


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0443 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.