Написать программу для проверки двух деревьев на изоморфность - Prolog

Узнай цену своей работы

Формулировка задачи:

Добавляю готовый код работающий в Prolog 5.2 "Написать программу для проверки двух деревьев на изоморфность".
Листинг программы
  1. include "binarytree.inc"
  2. include "binarytree.con"
  3. DOMAINS
  4. VAL = reference integer
  5. bin_tree = reference t(VAL,bin_tree,bin_tree); void
  6. DATABASE - binarytree
  7. binary_tree1(bin_tree)
  8. binary_tree2(bin_tree)
  9. PREDICATES
  10. get_startup_tree1(bin_tree) %возвращает предопределённую структуру дерева
  11. get_startup_tree2(bin_tree) %возвращает предопределённую структуру дерева
  12. collect_tree(STRING,TREELIST,TREE)
  13. get_tree(bin_tree,INTEGER,TREE)
  14. treelist_insert(TREE,TREELIST,TREELIST) %добавляет дерево в список деревьев
  15. bin_tree_insert(integer,bin_tree,bin_tree) %добавляет новое значение в бинарное дерево
  16. isotree(bin_tree, bin_tree) %проверка изоморфности деревьев
  17. CLAUSES
  18. get_startup_tree1(BinTree):-
  19. BinTree=t(5, t(4, t(1, void,
  20. t(2, void,
  21. t(3, void, void)
  22. )
  23. ),
  24. void
  25. ),
  26. t(7,t(6,void,void),
  27. t(9,t(8,void,void),
  28. t(12,void,void)
  29. )
  30. )
  31. ).
  32. get_startup_tree2(BinTree):-
  33. BinTree=t(5, t(7, t(9, t(12, void, void),
  34. t(8, void, void)
  35. ),
  36. t(6, void, void)
  37. ),
  38. t(4, void,
  39. t(1, t(2, t(3, void, void),
  40. void
  41. ),
  42. void)
  43. )
  44. ).
  45. treelist_insert(TREE,[],[TREE]):-!.
  46. treelist_insert(_,[],[]):-!.
  47. treelist_insert(TREE,[H|T],[H|TNew]):-!,
  48. treelist_insert(TREE,T,TNew).
  49. collect_tree(NODE,[],tree(NODE,unmarked,[],0)):-!.
  50. collect_tree(NODE,TREEL,tree(NODE,unmarked,TREEL,0)):-!.
  51. /* отображение пустой вершины для симметрии дерева */
  52. get_tree(void,_,TREE):-!,
  53. collect_tree("void",[],TREE).
  54. get_tree(t(NODE, void, void),_,TREE):-!,
  55. str_int(StrNode, NODE),
  56. collect_tree(StrNode,[],TREE).
  57. get_tree(t(NODE,L,R),IdcTree,TREE):-!,
  58. get_tree(L,IdcTree,LTREE),
  59. treelist_insert(LTREE,[],TREEL),
  60. get_tree(R,IdcTree,RTREE),
  61. treelist_insert(RTREE,TREEL,TREELNew),
  62. str_int(StrNode, NODE),
  63. collect_tree(StrNode,TREELNew,TREE).
  64. get_tree(_,_,tree("Other", unmarked, [], 0)):-!.
  65. %вставляем элемент в дерево
  66. bin_tree_insert(Node,void,t(Node,void,void)):-!.
  67. bin_tree_insert(Node,t(Root,Left,Right),t(Root,LeftNew,Right)):-
  68. Node = Root,!,dlg_note("Такое значение уже есть в дереве!"),fail.
  69. bin_tree_insert(Node,t(Root,Left,Right),t(Root,LeftNew,Right)):-
  70. Node < Root,!,
  71. bin_tree_insert(Node,Left,LeftNew).
  72. bin_tree_insert(Node,t(Root,Left,Right),t(Root,Left,RightNew)):-
  73. Node > Root,!,
  74. bin_tree_insert(Node,Right,RightNew).
  75.  
  76. %проверяем изоморфность
  77. isotree(void, void):-!.
  78. isotree(t(R, L1, R1), t(R, L2, R2)):-
  79. isotree(L1, L2),
  80. isotree(R1, R2),
  81. !.
  82. isotree(t(R, L1, R1), t(R, L2, R2)):-
  83. isotree(L1, R2),
  84. isotree(L2, R1),
  85. !.
  86. PREDICATES
  87. pdctree_handler : EHANDLER
  88. CLAUSES
  89. %обработка события создания дерева
  90. pdctree_handler ( _Win, e_Create(_), 0 ) :-
  91. CtrlId=win_GetCtlId(_Win),
  92. CtrlId=idc_tree1,
  93. !,
  94. binary_tree1(BinaryTree),
  95. get_tree(BinaryTree,CtrlId,Tree),
  96. TreeFont = font_Create ( ff_Times, [], 10 ),
  97. TreeWinInfo = tree_WinInfo ( TreeFont, tree_DirUp, [] ),
  98. tree_CreateSubClass( _Win, Tree, TreeWinInfo, [] ),
  99. fail.
  100. pdctree_handler ( _Win, e_Create(_), 0 ) :-
  101. CtrlId=win_GetCtlId(_Win),
  102. CtrlId=idc_tree2,
  103. !,
  104. binary_tree2(BinaryTree),
  105. get_tree(BinaryTree,CtrlId,Tree),
  106. TreeFont = font_Create ( ff_Times, [], 10 ),
  107. TreeWinInfo = tree_WinInfo ( TreeFont, tree_DirUp, [] ),
  108. tree_CreateSubClass( _Win, Tree, TreeWinInfo, [] ),
  109. fail.
  110. %обработка пользовательского события (обновление дерева)
  111. pdctree_handler ( _Win, e_User(_,_), Return ):-
  112. CtrlId=win_GetCtlId(_Win),
  113. CtrlId=idc_tree1,
  114. !,
  115. Return=cast(long,CtrlId),
  116. binary_tree1(BinaryTree),
  117. get_tree(BinaryTree,CtrlId,Tree),
  118. tree_Update( _Win, Tree, []),
  119. !.
  120. pdctree_handler ( _Win, e_User(_,_), Return ):-
  121. CtrlId=win_GetCtlId(_Win),
  122. CtrlId=idc_tree2,
  123. !,
  124. Return=cast(long,CtrlId),
  125. binary_tree2(BinaryTree),
  126. get_tree(BinaryTree,CtrlId,Tree),
  127. tree_Update( _Win, Tree, []),
  128. !.
  129. pdctree_handler ( W, e_MouseDbl ( _, _, _ ), 0 ):-!,
  130. tree_OpenCloseNode ( W ),
  131. !.
  132. %autogenerate code
  133. %BEGIN_WIN Task Window
  134. /***************************************************************************
  135. Event handling for task window
  136. ***************************************************************************/
  137. PREDICATES
  138. task_win_eh : EHANDLER
  139. CONSTANTS
  140. %BEGIN Task Window, CreateParms, 19:47:05-2.10.2005, Code automatically updated!
  141. task_win_Flags = [wsf_SizeBorder,wsf_TitleBar,wsf_Close,wsf_ClipSiblings,wsf_ClipChildren]
  142. task_win_Menu = no_menu
  143. task_win_Title = "BinaryTree"
  144. task_win_Help = idh_contents
  145. %END Task Window, CreateParms
  146. CLAUSES
  147. %BEGIN Task Window, e_Create
  148. task_win_eh(_Win,e_Create(_),0):-!,
  149. %end autogenerate code
  150. retractall(binary_tree1(_)),
  151. get_startup_tree1(BinaryTree1),
  152. assert(binary_tree1(BinaryTree1)),
  153. retractall(binary_tree2(_)),
  154. get_startup_tree2(BinaryTree2),
  155. assert(binary_tree2(BinaryTree2)),
  156. class_Create("PDCTREE",pdctree_handler),
  157. %autogenerate code
  158. %BEGIN Task Window, InitControls, 19:47:05-2.10.2005, Code automatically updated!
  159. win_CreateDynControl([customctl(wdef(wc_Custom,rct(20,28,280,270),"Tree",u_Pixels),"PDCTREE",idc_tree1,[wsf_Group,wsf_TabStop,wsf_Transparent])],_Win),
  160. win_CreateControl(wc_PushButton,rct(458,333,554,357),"Закрыть",_Win,[wsf_Group,wsf_TabStop],idc_ok),
  161. win_CreateControl(wc_PushButton,rct(127,300,202,324),"Добавить",_Win,[wsf_Group,wsf_TabStop],idc_add1),
  162. win_CreateControl(wc_Text,rct(23,274,202,295),"Добавление нового эл-та:",_Win,[wsf_AlignCenter],idct_label3),
  163. win_CreateControl(wc_Edit,rct(23,298,111,322),"",_Win,[wsf_Group,wsf_TabStop,wsf_AutoHScroll,wsf_AlignLeft],idc_new1),
  164. win_CreateControl(wc_Text,rct(24,4,274,23),"Дерево 1",_Win,[wsf_AlignCenter,wsf_NoClipSiblings],idc_label1),
  165. win_CreateControl(wc_PushButton,rct(211,271,279,295),"Очистить",_Win,[wsf_Group,wsf_TabStop],idc_clear1),
  166. win_CreateControl(wc_PushButton,rct(400,301,475,325),"Добавить",_Win,[wsf_Group,wsf_TabStop],idc_add2),
  167. win_CreateControl(wc_Edit,rct(296,299,384,323),"",_Win,[wsf_Group,wsf_TabStop,wsf_AutoHScroll,wsf_AlignLeft],idc_new2),
  168. win_CreateControl(wc_PushButton,rct(484,272,552,296),"Очистить",_Win,[wsf_Group,wsf_TabStop],idc_clear2),
  169. win_CreateControl(wc_Text,rct(296,275,475,296),"Добавление нового эл-та:",_Win,[wsf_AlignCenter],idc_label4),
  170. win_CreateControl(wc_Text,rct(297,5,547,24),"Дерево 2",_Win,[wsf_AlignCenter,wsf_NoClipSiblings],idc_label2),
  171. win_CreateDynControl([customctl(wdef(wc_Custom,rct(293,29,553,271),"Tree",u_Pixels),"PDCTREE",idc_tree2,[wsf_Group,wsf_TabStop,wsf_Transparent])],_Win),
  172. win_CreateControl(wc_PushButton,rct(244,334,340,358),"Изоморфны?",_Win,[wsf_Group,wsf_TabStop],idc_изоморфны),
  173. %END Task Window, InitControls
  174. IFDEF use_message
  175. msg_Create(100),
  176. ENDDEF
  177. !.
  178. %END Task Window, e_Create
  179. %MARK Task Window, new events
  180. %BEGIN Task Window, idc_изоморфны _CtlInfo
  181. task_win_eh(_Win,e_Control(idc_изоморфны,_CtrlType,_CtrlWin,_CtlInfo),0):-
  182. binary_tree1(T1), %взяли ранее сохранённое дерево
  183. binary_tree2(T2),
  184. isotree(T1,T2),
  185. !,
  186. dlg_MessageBox("Проверка изоморфности", "Деревья изоморфны",
  187. mesbox_iconInformation, mesbox_buttonsOK, mesbox_defaultFirst,
  188. mesbox_suspendApplication),
  189. !.
  190. task_win_eh(_Win,e_Control(idc_изоморфны,_CtrlType,_CtrlWin,_CtlInfo),0):-!,
  191. dlg_MessageBox("Проверка изоморфности", "Деревья неизоморфны",
  192. mesbox_iconInformation, mesbox_buttonsOK, mesbox_defaultFirst,
  193. mesbox_suspendApplication),
  194. !.
  195. %END Task Window, idc_изоморфны _CtlInfo
  196. %BEGIN Task Window, idc_clear2 _CtlInfo
  197. task_win_eh(_Win,e_Control(idc_clear2,_CtrlType,_CtrlWin,_CtlInfo),0):-!,
  198. retractall(binary_tree2(_)),
  199. assert(binary_tree2(void)),
  200. TreeCtrlWin =win_GetCtlHandle(_Win,idc_tree2),
  201. win_SendEvent(TreeCtrlWin,e_User(0,0)),
  202. !.
  203. %END Task Window, idc_clear2 _CtlInfo
  204. %BEGIN Task Window, idc_add2 _CtlInfo
  205. task_win_eh(_Win,e_Control(idc_add2,_CtrlType,_CtrlWin,_CtlInfo),0):-
  206. %получение имени нового узла
  207. EditCtrlWin = win_GetCtlHandle(_Win, idc_new2), %идентификатор контрола NewNode
  208. Text=win_GetText(EditCtrlWin), %значение из поля NewNode
  209. Text = "",
  210. dlg_note("Введите значение узла!"),!.
  211. task_win_eh(_Win,e_Control(idc_add2,_CtrlType,_CtrlWin,_CtlInfo),0):-
  212. %получение имени нового узла
  213. EditCtrlWin = win_GetCtlHandle(_Win, idc_new2), %идентификатор контрола NewNode
  214. Text=win_GetText(EditCtrlWin), %значение из поля NewNode
  215. Text <> "", %значение должно быть непустым
  216. not(str_int(Text, _)),
  217. dlg_note("Значение узла должно быть целым числом!"),!.
  218. task_win_eh(_Win,e_Control(idc_add2,_CtrlType,_CtrlWin,_CtlInfo),0):-!,
  219. %получение имени нового узла
  220. EditCtrlWin = win_GetCtlHandle(_Win, idc_new2), %идентификатор контрола NewNode
  221. Text=win_GetText(EditCtrlWin), %значение из поля NewNode
  222. Text <> "", %значение должно быть непустым
  223. str_int(Text, Val), %значение должно быть целым
  224. !,
  225. win_SetText(EditCtrlWin,""), %очистка поля NewNode
  226. binary_tree2(TempTree), %взяли ранее сохранённое дерево
  227. bin_tree_insert(Val, TempTree, BinaryTree), %вставили новый узел
  228. retractall(binary_tree2(_)), %очистили все значения
  229. assert(binary_tree2(BinaryTree)), %сохранили новое значение
  230. %обновление контрола, отображающего дерево
  231. TreeCtrlWin =win_GetCtlHandle(_Win,idc_tree2),
  232. win_SendEvent(TreeCtrlWin,e_User(0,0)),
  233. !.
  234. task_win_eh(_Win,e_Control(idc_add2,_CtrlType,_CtrlWin,_CtlInfo),0):-!,
  235. dlg_error("Введите целое число."),
  236. !.
  237. %END Task Window, idc_add2 _CtlInfo
  238. %end autogenerate code
  239. %BEGIN Task Window, idc_add1 _CtlInfo
  240. task_win_eh(_Win,e_Control(idc_add1,_CtrlType,_CtrlWin,_CtlInfo),0):-
  241. %получение имени нового узла
  242. EditCtrlWin = win_GetCtlHandle(_Win, idc_new1), %идентификатор контрола NewNode
  243. Text=win_GetText(EditCtrlWin), %значение из поля NewNode
  244. Text = "",
  245. dlg_note("Введите значение узла!"),!.
  246. task_win_eh(_Win,e_Control(idc_add1,_CtrlType,_CtrlWin,_CtlInfo),0):-
  247. %получение имени нового узла
  248. EditCtrlWin = win_GetCtlHandle(_Win, idc_new1), %идентификатор контрола NewNode
  249. Text=win_GetText(EditCtrlWin), %значение из поля NewNode
  250. Text <> "", %значение должно быть непустым
  251. not(str_int(Text, _)),
  252. dlg_note("Значение узла должно быть целым числом!"),!.
  253. task_win_eh(_Win,e_Control(idc_add1,_CtrlType,_CtrlWin,_CtlInfo),0):-
  254. %получение имени нового узла
  255. EditCtrlWin = win_GetCtlHandle(_Win, idc_new1), %идентификатор контрола NewNode
  256. Text=win_GetText(EditCtrlWin), %значение из поля NewNode
  257. Text <> "", %значение должно быть непустым
  258. str_int(Text, Val), %значение должно быть целым
  259. !,
  260. win_SetText(EditCtrlWin,""), %очистка поля NewNode
  261. binary_tree1(TempTree), %взяли ранее сохранённое дерево
  262. bin_tree_insert(Val, TempTree, BinaryTree), %вставили новый узел
  263. retractall(binary_tree1(_)), %очистили все значения
  264. assert(binary_tree1(BinaryTree)), %сохранили новое значение
  265. %обновление контрола, отображающего дерево
  266. TreeCtrlWin =win_GetCtlHandle(_Win,idc_tree1),
  267. win_SendEvent(TreeCtrlWin,e_User(0,0)),
  268. !.
  269. %END Task Window, idc_add1 _CtlInfo
  270. %BEGIN Task Window, idc_clear1 _CtlInfo
  271. task_win_eh(_Win,e_Control(idc_clear1,_CtrlType,_CtrlWin,_CtlInfo),0):-!,
  272. retractall(binary_tree1(_)),
  273. assert(binary_tree1(void)),
  274. TreeCtrlWin =win_GetCtlHandle(_Win,idc_tree1),
  275. win_SendEvent(TreeCtrlWin,e_User(0,0)),
  276. !.
  277. %END Task Window, idc_clear1 _CtlInfo
  278. %BEGIN Task Window, idc_ok _CtlInfo
  279. task_win_eh(_Win,e_Control(idc_ok,_CtrlType,_CtrlWin,_CtlInfo),0):-!,
  280. retractall(_, binarytree),
  281. win_Destroy(_Win),
  282. !.
  283. %END Task Window, idc_ok _CtlInfo
  284. %BEGIN Task Window, e_Destroy
  285. task_win_eh(_Win,e_Destroy,0):-!,
  286. class_Destroy("PDCTREE"),
  287. !.
  288. %END Task Window, e_Destroy
  289. %autogenerate code
  290. %BEGIN Task Window, e_Update
  291. task_win_eh(_Win,e_Update(_UpdateRct),0):-!,
  292. win_Clear(_Win,color_White),
  293. !.
  294. %END Task Window, e_Update
  295. %BEGIN Task Window, e_Size
  296. task_win_eh(_Win,e_Size(_Width,_Height),0):-!,
  297. !.
  298. %END Task Window, e_Size
  299. /***************************************************************************
  300. Main Goal Project
  301. ***************************************************************************/
  302. GOAL
  303. IFDEF use_mdi
  304. vpi_SetAttrVal(attr_win_mdi,b_true),
  305. ENDDEF
  306. IFDEF use_3dctrl
  307. vpi_SetAttrVal(attr_win_3dcontrols,b_true),
  308. ENDDEF
  309. IFDEF use_tbar
  310. vpi_SetAttrVal(attr_win_tbar,use_tbar),
  311. ENDDEF
  312. IFDEF use_sbar
  313. vpi_SetAttrVal(attr_win_sbar,use_sbar),
  314. ENDDEF
  315. vpi_Init(task_win_Flags,task_win_eh,task_win_Menu,"binarytree",task_win_Title).
  316. %END_WIN Task Window
но вместе с тем прошу и помочь: как данный код будет выглядеть без визуальных элементов то есть программа будет проходить отладку без ошибок но при запуске будет просто консоль а не окна
Добавлю навоял такой код подскажите почему ошибка E;Test_Goal, pos: 113, 590 Nondeterministic clause: isotree
Листинг программы
  1. domains
  2. treetype = tree(symbol, treetype, treetype);nil
  3. predicates
  4. isotree (treetype, treetype)
  5. clauses
  6. isotree (T, T).
  7. isotree (tree (X,L1, R1),
  8. tree (X, L2, R2)):- isotree
  9. (L1, L2), isotree (R1,
  10. R2).
  11. isotree (tree (X, L1, R1),
  12. tree (X, L2, R2)):- isotree
  13. (L1, R2), isotree (L2,
  14. R1).
  15. goal
  16. isotree(tree("a",tree("b",tree("d",nil,nil),tree("e",nil,
  17. nil)),tree("c",nil,nil)),
  18. tree("a",tree("b",tree("d",nil,nil),tree("e",nil,
  19. nil)),tree("c",nil,nil))),
  20. write("true").

Решение задачи: «Написать программу для проверки двух деревьев на изоморфность»

textual
Листинг программы
  1. predicates
  2. nondeterm isotree (treetype, treetype)

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.636 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы