Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Визуализация дерева в Prolog 5.2
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Moonbiter Moonbiter вне форума
Новичок
 
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.05.2011
По умолчанию Визуализация дерева в Prolog 5.2 - 18.05.2011, 15:56

Добрый день. Срочна нужна ваша помощь с деревьями, может кто подскажет...

Нужно вывести неупорядоченное бинарное дерево с помощью Tree Package, причём дерево пользователь будет создавать сам: одной кнопкой он создаёт корень дерева, а потом с помощью двух кнопок "лево" и "право" добавляет поддерево к выбранному узлу.

Собственно проблема:
Предикаты строят дерево на основе фактов базы данных, и для корректности последующего присоединения узлов нужно, чтобы значения узлов не повторялись. Преподавателю же нужно, чтобы в дерево могли добавляться какие угодно значения, например, чтобы оно состояло из одних единиц.

Помогите модифицировать код, чтобы дерево корректно создавалось при повторяющихся значениях узлов. Либо предложите свой вариант, как реализовать подобную задачу...


prolog Код:
database -lol %база фактов, в которой будет сохраняться структура созданного дерева
 der(string,string,string) %дерево (корень, левый сын, правый сын)
 head(string) %голова дерева

domains
bintree = tree(string, bintree, bintree); empty() %бинарное дерево
 
predicates
%Предикаты для построения дерева (создание узла,добавление левого/правого поддерева)
create_tree(string,bintree)
insert_left (bintree,bintree,bintree)
insert_right (bintree,bintree,bintree)

convert(bintree,tree) %Для перевода в формат для вывода
nondeterm treeout(string,window) %вывод самого дерева
nondeterm out2(string,bintree) %построение структуры бинарного дерева


clauses

create_tree(A,tree(A,empty,empty)).
insert_left(X,tree(A,_,B),tree(A,X,B)).
insert_right(X,tree(A,B,_),tree(A,B,X)).

clear:-der(_,_,_),retract(der(_,_,_)),clear.
clear:-retract(head(_)).
convert(tree(Elem,empty,empty),tree(Elem,unmarked,[],0)):- !.
convert(tree(Elem,L,empty),tree(Elem,unmarked,[Tree],0)):- !,    convert(L,Tree).
convert(tree(Elem,empty,R),tree(Elem,unmarked,[Tree],0)):- !,    convert(R,Tree).
convert(tree(Elem,L,R),tree(Elem,unmarked,TreeList,0)):-    convert(L,Tree1),    convert(R,Tree2),    TreeList=[Tree1,Tree2].

treeout(S,W):-out2(S,Derevo),convert(Derevo,Tree), tree_Update(W, Tree, []).
out2(S,Perem):-der(S,L,R),L="",R="",!,create_tree(S,Perem). %если текущий элемент - лист
out2(S,Perem):-der(S,L,R),L<>"",R<>"",!,create_tree(S,P1),out2(L,P2),insert_left(P2,P1,P3),out2(R,P4),insert_right(P4,P3,Perem). %если у текущего элемента есть оба поддерева
out2(S,Perem):-der(S,L,R),L<>"",!,create_tree(S,P1),out2(L,P2),insert_left(P2,P1,Perem). %у текущего элемента только левое поддерево
out2(S,Perem):-der(S,L,R),R<>"",create_tree(S,P1),out2(R,P2),insert_right(P2,P1,Perem). %только правое поддерево


  win_tree_Create(_Parent):-
 
ifdef use_tree

    Tree = tree("",unmarked,[],0),
    TreeDir = tree_dirup, %направление построения дерева - dirright/dirup
    Font = font_Create(ff_Fixed,[],10),
    TreeWinInfo = tree_WinInfo(Font,TreeDir,[]),
    tree_Create(win_tree_WinType,win_tree_RCT,win_tree_Title,
        win_tree_Menu,_Parent,win_tree_Flags,win_tree_eh,0,Tree,TreeWinInfo,[]),
       
enddef
    true.

/*============ДОБАВЛЕНИЕ ПРАВОГО ПОДДЕРЕВА============*/
%BEGIN Tree, idc_добавить_вправо _CtlInfo
  win_tree_eh(_Win,e_Control(idc_добавить_вправо,_CtrlType,_CtrlWin,_CtlInfo),0):-
  Handle1 = win_GetCtlHandle(_Win, idc_tree_1), %Поле ввода значения узла
  Stroka=win_GetText(Handle1), Stroka<>"",      %Получаем строку символов и если она не пустая
  Vershina=tree_GetSelectedNode(_Win), der(Vershina,Left,""),   %читаем выделенный узел и определяем выходящие из него поддеревья
  asserta(der(Vershina,Left,Stroka)), retract(der(Vershina,Left,"")), asserta(der(Stroka,"","")),%добавление элемента
  head(Gol),treeout(Gol,_Win),!. %читаем голову дерева и начинаем строить и выводить дерево
   
  win_tree_eh(_Win,e_Control(idc_добавить_вправо,_CtrlType,_CtrlWin,_CtlInfo),0):-not(head(_)),
    dlg_error("Ошибка", "У дерева нет корня"),!.
   
  win_tree_eh(_Win,e_Control(idc_добавить_вправо,_CtrlType,_CtrlWin,_CtlInfo),0):-
    dlg_error("Ошибка", "Пустое либо повторяющееся значение или правое поддерево у узла уже существует").
%END Tree, idc_добавить_вправо _CtlInfo
                 
/*============СОЗДАНИЕ КОРНЯ ДЕРЕВА============*/
%BEGIN Tree, idc_создать_корень_дерева _CtlInfo
  win_tree_eh(_Win,e_Control(idc_создать_корень_дерева,_CtrlType,_CtrlWin,_CtlInfo),0):-
  Handle1 = win_GetCtlHandle(_Win, idc_tree_1), %Поле ввода значения узла
  Stroka=win_GetText(Handle1), Stroka<>"",      %Получаем строку символов и если она не пустая
  not(head(_)), %если голова ранее не была создана
  asserta(head(Stroka)),    asserta(der(Stroka,"","")), %добавление головы и начального дерева
  Tree=tree(Stroka,unmarked,[],0), tree_Update(_Win, Tree, []),!. % создаем дерево из одного элемента
   
  win_tree_eh(_Win,e_Control(idc_создать_корень_дерева,_CtrlType,_CtrlWin,_CtlInfo),0):-
    dlg_error("Ошибка", "Введено пустое значение корня либо корень уже создан").
%END Tree, idc_создать_корень_дерева _CtlInfo

/*============СОЗДАНИЕ ЛЕВОГО ПОДДЕРЕВА============*/
%BEGIN Tree, idc_добавить_узел _CtlInfo
  win_tree_eh(_Win,e_Control(idc_добавить_узел,_CtrlType,_CtrlWin,_CtlInfo),0):-
  Handle1 = win_GetCtlHandle(_Win, idc_tree_1), %Поле ввода значения узла
  Stroka=win_GetText(Handle1), Stroka<>"",      %Получаем строку символов и если она не пустая
  Vershina=tree_GetSelectedNode(_Win),der(Vershina,"",Right), %читаем выделенный узел и определяем выходящие из него поддеревья
  asserta(der(Vershina,Stroka,Right)), retract(der(Vershina,"",Right)), asserta(der(Stroka,"","")),%добавление элемента
  head(Gol),treeout(Gol,_Win),!. %читаем голову дерева и начинаем строить и выводить дерево
   
  win_tree_eh(_Win,e_Control(idc_добавить_узел,_CtrlType,_CtrlWin,_CtlInfo),0):- not(head(_)),
    dlg_error("Ошибка", "У дерева нет корня"),!.
   
  win_tree_eh(_Win,e_Control(idc_добавить_узел,_CtrlType,_CtrlWin,_CtlInfo),0):-
    dlg_error("Ошибка", "Пустое либо повторяющееся значение или левое поддерево у узла уже существует").
%END Tree, idc_добавить_узел _CtlInfo
Ответить с цитированием
  (#2 (permalink)) Старый
roman443 roman443 вне форума
Новичок
 
Сообщений: 1
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.04.2018
По умолчанию 17.04.2018, 06:10

Moonbiter у вас остался проект? очень нужен
Ответить с цитированием
  (#3 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,956
Сказал(а) спасибо: 2
Поблагодарили 303 раз(а) в 303 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 17.04.2018, 20:52

Moonbiter Вам не ответит. Он заходил в 2011 году. Да и версия 5.2 несколько устарела. С вас преподаватель спрашивает прогу именно в VIP5.2 или можно в современных версиях?
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определить функцию для вывода бинарного дерева на экран в виде дерева imported_Vinni Lisp 22 20.06.2011 22:34
Визуализация деревьев (VP 7.3) Ground Prolog 3 06.04.2011 18:52
Поиск остовного дерева на swi-prolog serik123 Prolog 0 05.07.2010 21:24
Визуализация Организационной Структуры Serge0 Задания за деньги 2 05.05.2010 13:51
Визуализация графов с чего начать _sas_ С/С++ 0 13.04.2010 08:26
Небольшой проект - визуализация организационной структуры Serge0 Задания за деньги 6 13.01.2010 13:03
визуализация движения по лабиринту Хочу быть программистом Задания за деньги 1 22.11.2007 17:42
Визуализация метода Гаусса Daredevil С/С++ 25 23.01.2006 19:05
Визуализация данных в DBGrid NorthFace Delphi 1 31.08.2005 07:57
Визуализация в несколько окон Reef Программирование графики 3 02.07.2005 00:41
Визуализация процесса выполнения запроса kpu12 C++ Builder 3 08.08.2003 13:44
Визуализация org.w3c.dom.Document Anonymous Java 0 24.04.2003 23:56



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов