Написать программу для проверки двух деревьев на изоморфность - Prolog
Формулировка задачи:
Добавляю готовый код работающий в Prolog 5.2 "Написать программу для проверки двух деревьев на изоморфность".
но вместе с тем прошу и помочь: как данный код будет выглядеть без визуальных элементов то есть программа будет проходить отладку без ошибок но при запуске будет просто консоль а не окна
Листинг программы
- include "binarytree.inc"
- include "binarytree.con"
- DOMAINS
- VAL = reference integer
- bin_tree = reference t(VAL,bin_tree,bin_tree); void
- DATABASE - binarytree
- binary_tree1(bin_tree)
- binary_tree2(bin_tree)
- PREDICATES
- get_startup_tree1(bin_tree) %возвращает предопределённую структуру дерева
- get_startup_tree2(bin_tree) %возвращает предопределённую структуру дерева
- collect_tree(STRING,TREELIST,TREE)
- get_tree(bin_tree,INTEGER,TREE)
- treelist_insert(TREE,TREELIST,TREELIST) %добавляет дерево в список деревьев
- bin_tree_insert(integer,bin_tree,bin_tree) %добавляет новое значение в бинарное дерево
- isotree(bin_tree, bin_tree) %проверка изоморфности деревьев
- CLAUSES
- get_startup_tree1(BinTree):-
- BinTree=t(5, t(4, t(1, void,
- t(2, void,
- t(3, void, void)
- )
- ),
- void
- ),
- t(7,t(6,void,void),
- t(9,t(8,void,void),
- t(12,void,void)
- )
- )
- ).
- get_startup_tree2(BinTree):-
- BinTree=t(5, t(7, t(9, t(12, void, void),
- t(8, void, void)
- ),
- t(6, void, void)
- ),
- t(4, void,
- t(1, t(2, t(3, void, void),
- void
- ),
- void)
- )
- ).
- treelist_insert(TREE,[],[TREE]):-!.
- treelist_insert(_,[],[]):-!.
- treelist_insert(TREE,[H|T],[H|TNew]):-!,
- treelist_insert(TREE,T,TNew).
- collect_tree(NODE,[],tree(NODE,unmarked,[],0)):-!.
- collect_tree(NODE,TREEL,tree(NODE,unmarked,TREEL,0)):-!.
- /* отображение пустой вершины для симметрии дерева */
- get_tree(void,_,TREE):-!,
- collect_tree("void",[],TREE).
- get_tree(t(NODE, void, void),_,TREE):-!,
- str_int(StrNode, NODE),
- collect_tree(StrNode,[],TREE).
- get_tree(t(NODE,L,R),IdcTree,TREE):-!,
- get_tree(L,IdcTree,LTREE),
- treelist_insert(LTREE,[],TREEL),
- get_tree(R,IdcTree,RTREE),
- treelist_insert(RTREE,TREEL,TREELNew),
- str_int(StrNode, NODE),
- collect_tree(StrNode,TREELNew,TREE).
- get_tree(_,_,tree("Other", unmarked, [], 0)):-!.
- %вставляем элемент в дерево
- bin_tree_insert(Node,void,t(Node,void,void)):-!.
- bin_tree_insert(Node,t(Root,Left,Right),t(Root,LeftNew,Right)):-
- Node = Root,!,dlg_note("Такое значение уже есть в дереве!"),fail.
- bin_tree_insert(Node,t(Root,Left,Right),t(Root,LeftNew,Right)):-
- Node < Root,!,
- bin_tree_insert(Node,Left,LeftNew).
- bin_tree_insert(Node,t(Root,Left,Right),t(Root,Left,RightNew)):-
- Node > Root,!,
- bin_tree_insert(Node,Right,RightNew).
- %проверяем изоморфность
- isotree(void, void):-!.
- isotree(t(R, L1, R1), t(R, L2, R2)):-
- isotree(L1, L2),
- isotree(R1, R2),
- !.
- isotree(t(R, L1, R1), t(R, L2, R2)):-
- isotree(L1, R2),
- isotree(L2, R1),
- !.
- PREDICATES
- pdctree_handler : EHANDLER
- CLAUSES
- %обработка события создания дерева
- pdctree_handler ( _Win, e_Create(_), 0 ) :-
- CtrlId=win_GetCtlId(_Win),
- CtrlId=idc_tree1,
- !,
- binary_tree1(BinaryTree),
- get_tree(BinaryTree,CtrlId,Tree),
- TreeFont = font_Create ( ff_Times, [], 10 ),
- TreeWinInfo = tree_WinInfo ( TreeFont, tree_DirUp, [] ),
- tree_CreateSubClass( _Win, Tree, TreeWinInfo, [] ),
- fail.
- pdctree_handler ( _Win, e_Create(_), 0 ) :-
- CtrlId=win_GetCtlId(_Win),
- CtrlId=idc_tree2,
- !,
- binary_tree2(BinaryTree),
- get_tree(BinaryTree,CtrlId,Tree),
- TreeFont = font_Create ( ff_Times, [], 10 ),
- TreeWinInfo = tree_WinInfo ( TreeFont, tree_DirUp, [] ),
- tree_CreateSubClass( _Win, Tree, TreeWinInfo, [] ),
- fail.
- %обработка пользовательского события (обновление дерева)
- pdctree_handler ( _Win, e_User(_,_), Return ):-
- CtrlId=win_GetCtlId(_Win),
- CtrlId=idc_tree1,
- !,
- Return=cast(long,CtrlId),
- binary_tree1(BinaryTree),
- get_tree(BinaryTree,CtrlId,Tree),
- tree_Update( _Win, Tree, []),
- !.
- pdctree_handler ( _Win, e_User(_,_), Return ):-
- CtrlId=win_GetCtlId(_Win),
- CtrlId=idc_tree2,
- !,
- Return=cast(long,CtrlId),
- binary_tree2(BinaryTree),
- get_tree(BinaryTree,CtrlId,Tree),
- tree_Update( _Win, Tree, []),
- !.
- pdctree_handler ( W, e_MouseDbl ( _, _, _ ), 0 ):-!,
- tree_OpenCloseNode ( W ),
- !.
- %autogenerate code
- %BEGIN_WIN Task Window
- /***************************************************************************
- Event handling for task window
- ***************************************************************************/
- PREDICATES
- task_win_eh : EHANDLER
- CONSTANTS
- %BEGIN Task Window, CreateParms, 19:47:05-2.10.2005, Code automatically updated!
- task_win_Flags = [wsf_SizeBorder,wsf_TitleBar,wsf_Close,wsf_ClipSiblings,wsf_ClipChildren]
- task_win_Menu = no_menu
- task_win_Title = "BinaryTree"
- task_win_Help = idh_contents
- %END Task Window, CreateParms
- CLAUSES
- %BEGIN Task Window, e_Create
- task_win_eh(_Win,e_Create(_),0):-!,
- %end autogenerate code
- retractall(binary_tree1(_)),
- get_startup_tree1(BinaryTree1),
- assert(binary_tree1(BinaryTree1)),
- retractall(binary_tree2(_)),
- get_startup_tree2(BinaryTree2),
- assert(binary_tree2(BinaryTree2)),
- class_Create("PDCTREE",pdctree_handler),
- %autogenerate code
- %BEGIN Task Window, InitControls, 19:47:05-2.10.2005, Code automatically updated!
- win_CreateDynControl([customctl(wdef(wc_Custom,rct(20,28,280,270),"Tree",u_Pixels),"PDCTREE",idc_tree1,[wsf_Group,wsf_TabStop,wsf_Transparent])],_Win),
- win_CreateControl(wc_PushButton,rct(458,333,554,357),"Закрыть",_Win,[wsf_Group,wsf_TabStop],idc_ok),
- win_CreateControl(wc_PushButton,rct(127,300,202,324),"Добавить",_Win,[wsf_Group,wsf_TabStop],idc_add1),
- win_CreateControl(wc_Text,rct(23,274,202,295),"Добавление нового эл-та:",_Win,[wsf_AlignCenter],idct_label3),
- win_CreateControl(wc_Edit,rct(23,298,111,322),"",_Win,[wsf_Group,wsf_TabStop,wsf_AutoHScroll,wsf_AlignLeft],idc_new1),
- win_CreateControl(wc_Text,rct(24,4,274,23),"Дерево 1",_Win,[wsf_AlignCenter,wsf_NoClipSiblings],idc_label1),
- win_CreateControl(wc_PushButton,rct(211,271,279,295),"Очистить",_Win,[wsf_Group,wsf_TabStop],idc_clear1),
- win_CreateControl(wc_PushButton,rct(400,301,475,325),"Добавить",_Win,[wsf_Group,wsf_TabStop],idc_add2),
- win_CreateControl(wc_Edit,rct(296,299,384,323),"",_Win,[wsf_Group,wsf_TabStop,wsf_AutoHScroll,wsf_AlignLeft],idc_new2),
- win_CreateControl(wc_PushButton,rct(484,272,552,296),"Очистить",_Win,[wsf_Group,wsf_TabStop],idc_clear2),
- win_CreateControl(wc_Text,rct(296,275,475,296),"Добавление нового эл-та:",_Win,[wsf_AlignCenter],idc_label4),
- win_CreateControl(wc_Text,rct(297,5,547,24),"Дерево 2",_Win,[wsf_AlignCenter,wsf_NoClipSiblings],idc_label2),
- win_CreateDynControl([customctl(wdef(wc_Custom,rct(293,29,553,271),"Tree",u_Pixels),"PDCTREE",idc_tree2,[wsf_Group,wsf_TabStop,wsf_Transparent])],_Win),
- win_CreateControl(wc_PushButton,rct(244,334,340,358),"Изоморфны?",_Win,[wsf_Group,wsf_TabStop],idc_изоморфны),
- %END Task Window, InitControls
- IFDEF use_message
- msg_Create(100),
- ENDDEF
- !.
- %END Task Window, e_Create
- %MARK Task Window, new events
- %BEGIN Task Window, idc_изоморфны _CtlInfo
- task_win_eh(_Win,e_Control(idc_изоморфны,_CtrlType,_CtrlWin,_CtlInfo),0):-
- binary_tree1(T1), %взяли ранее сохранённое дерево
- binary_tree2(T2),
- isotree(T1,T2),
- !,
- dlg_MessageBox("Проверка изоморфности", "Деревья изоморфны",
- mesbox_iconInformation, mesbox_buttonsOK, mesbox_defaultFirst,
- mesbox_suspendApplication),
- !.
- task_win_eh(_Win,e_Control(idc_изоморфны,_CtrlType,_CtrlWin,_CtlInfo),0):-!,
- dlg_MessageBox("Проверка изоморфности", "Деревья неизоморфны",
- mesbox_iconInformation, mesbox_buttonsOK, mesbox_defaultFirst,
- mesbox_suspendApplication),
- !.
- %END Task Window, idc_изоморфны _CtlInfo
- %BEGIN Task Window, idc_clear2 _CtlInfo
- task_win_eh(_Win,e_Control(idc_clear2,_CtrlType,_CtrlWin,_CtlInfo),0):-!,
- retractall(binary_tree2(_)),
- assert(binary_tree2(void)),
- TreeCtrlWin =win_GetCtlHandle(_Win,idc_tree2),
- win_SendEvent(TreeCtrlWin,e_User(0,0)),
- !.
- %END Task Window, idc_clear2 _CtlInfo
- %BEGIN Task Window, idc_add2 _CtlInfo
- task_win_eh(_Win,e_Control(idc_add2,_CtrlType,_CtrlWin,_CtlInfo),0):-
- %получение имени нового узла
- EditCtrlWin = win_GetCtlHandle(_Win, idc_new2), %идентификатор контрола NewNode
- Text=win_GetText(EditCtrlWin), %значение из поля NewNode
- Text = "",
- dlg_note("Введите значение узла!"),!.
- task_win_eh(_Win,e_Control(idc_add2,_CtrlType,_CtrlWin,_CtlInfo),0):-
- %получение имени нового узла
- EditCtrlWin = win_GetCtlHandle(_Win, idc_new2), %идентификатор контрола NewNode
- Text=win_GetText(EditCtrlWin), %значение из поля NewNode
- Text <> "", %значение должно быть непустым
- not(str_int(Text, _)),
- dlg_note("Значение узла должно быть целым числом!"),!.
- task_win_eh(_Win,e_Control(idc_add2,_CtrlType,_CtrlWin,_CtlInfo),0):-!,
- %получение имени нового узла
- EditCtrlWin = win_GetCtlHandle(_Win, idc_new2), %идентификатор контрола NewNode
- Text=win_GetText(EditCtrlWin), %значение из поля NewNode
- Text <> "", %значение должно быть непустым
- str_int(Text, Val), %значение должно быть целым
- !,
- win_SetText(EditCtrlWin,""), %очистка поля NewNode
- binary_tree2(TempTree), %взяли ранее сохранённое дерево
- bin_tree_insert(Val, TempTree, BinaryTree), %вставили новый узел
- retractall(binary_tree2(_)), %очистили все значения
- assert(binary_tree2(BinaryTree)), %сохранили новое значение
- %обновление контрола, отображающего дерево
- TreeCtrlWin =win_GetCtlHandle(_Win,idc_tree2),
- win_SendEvent(TreeCtrlWin,e_User(0,0)),
- !.
- task_win_eh(_Win,e_Control(idc_add2,_CtrlType,_CtrlWin,_CtlInfo),0):-!,
- dlg_error("Введите целое число."),
- !.
- %END Task Window, idc_add2 _CtlInfo
- %end autogenerate code
- %BEGIN Task Window, idc_add1 _CtlInfo
- task_win_eh(_Win,e_Control(idc_add1,_CtrlType,_CtrlWin,_CtlInfo),0):-
- %получение имени нового узла
- EditCtrlWin = win_GetCtlHandle(_Win, idc_new1), %идентификатор контрола NewNode
- Text=win_GetText(EditCtrlWin), %значение из поля NewNode
- Text = "",
- dlg_note("Введите значение узла!"),!.
- task_win_eh(_Win,e_Control(idc_add1,_CtrlType,_CtrlWin,_CtlInfo),0):-
- %получение имени нового узла
- EditCtrlWin = win_GetCtlHandle(_Win, idc_new1), %идентификатор контрола NewNode
- Text=win_GetText(EditCtrlWin), %значение из поля NewNode
- Text <> "", %значение должно быть непустым
- not(str_int(Text, _)),
- dlg_note("Значение узла должно быть целым числом!"),!.
- task_win_eh(_Win,e_Control(idc_add1,_CtrlType,_CtrlWin,_CtlInfo),0):-
- %получение имени нового узла
- EditCtrlWin = win_GetCtlHandle(_Win, idc_new1), %идентификатор контрола NewNode
- Text=win_GetText(EditCtrlWin), %значение из поля NewNode
- Text <> "", %значение должно быть непустым
- str_int(Text, Val), %значение должно быть целым
- !,
- win_SetText(EditCtrlWin,""), %очистка поля NewNode
- binary_tree1(TempTree), %взяли ранее сохранённое дерево
- bin_tree_insert(Val, TempTree, BinaryTree), %вставили новый узел
- retractall(binary_tree1(_)), %очистили все значения
- assert(binary_tree1(BinaryTree)), %сохранили новое значение
- %обновление контрола, отображающего дерево
- TreeCtrlWin =win_GetCtlHandle(_Win,idc_tree1),
- win_SendEvent(TreeCtrlWin,e_User(0,0)),
- !.
- %END Task Window, idc_add1 _CtlInfo
- %BEGIN Task Window, idc_clear1 _CtlInfo
- task_win_eh(_Win,e_Control(idc_clear1,_CtrlType,_CtrlWin,_CtlInfo),0):-!,
- retractall(binary_tree1(_)),
- assert(binary_tree1(void)),
- TreeCtrlWin =win_GetCtlHandle(_Win,idc_tree1),
- win_SendEvent(TreeCtrlWin,e_User(0,0)),
- !.
- %END Task Window, idc_clear1 _CtlInfo
- %BEGIN Task Window, idc_ok _CtlInfo
- task_win_eh(_Win,e_Control(idc_ok,_CtrlType,_CtrlWin,_CtlInfo),0):-!,
- retractall(_, binarytree),
- win_Destroy(_Win),
- !.
- %END Task Window, idc_ok _CtlInfo
- %BEGIN Task Window, e_Destroy
- task_win_eh(_Win,e_Destroy,0):-!,
- class_Destroy("PDCTREE"),
- !.
- %END Task Window, e_Destroy
- %autogenerate code
- %BEGIN Task Window, e_Update
- task_win_eh(_Win,e_Update(_UpdateRct),0):-!,
- win_Clear(_Win,color_White),
- !.
- %END Task Window, e_Update
- %BEGIN Task Window, e_Size
- task_win_eh(_Win,e_Size(_Width,_Height),0):-!,
- !.
- %END Task Window, e_Size
- /***************************************************************************
- Main Goal Project
- ***************************************************************************/
- GOAL
- IFDEF use_mdi
- vpi_SetAttrVal(attr_win_mdi,b_true),
- ENDDEF
- IFDEF use_3dctrl
- vpi_SetAttrVal(attr_win_3dcontrols,b_true),
- ENDDEF
- IFDEF use_tbar
- vpi_SetAttrVal(attr_win_tbar,use_tbar),
- ENDDEF
- IFDEF use_sbar
- vpi_SetAttrVal(attr_win_sbar,use_sbar),
- ENDDEF
- vpi_Init(task_win_Flags,task_win_eh,task_win_Menu,"binarytree",task_win_Title).
- %END_WIN Task Window
Добавлю навоял такой код подскажите почему ошибка E;Test_Goal, pos: 113, 590 Nondeterministic clause: isotree
Листинг программы
- domains
- treetype = tree(symbol, treetype, treetype);nil
- predicates
- isotree (treetype, treetype)
- clauses
- isotree (T, T).
- isotree (tree (X,L1, R1),
- tree (X, L2, R2)):- isotree
- (L1, L2), isotree (R1,
- R2).
- isotree (tree (X, L1, R1),
- tree (X, L2, R2)):- isotree
- (L1, R2), isotree (L2,
- R1).
- goal
- isotree(tree("a",tree("b",tree("d",nil,nil),tree("e",nil,
- nil)),tree("c",nil,nil)),
- tree("a",tree("b",tree("d",nil,nil),tree("e",nil,
- nil)),tree("c",nil,nil))),
- write("true").
Решение задачи: «Написать программу для проверки двух деревьев на изоморфность»
textual
Листинг программы
- predicates
- nondeterm isotree (treetype, treetype)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д