Advertisement
Guest User

Untitled

a guest
Apr 24th, 2019
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Prolog 4.54 KB | None | 0 0
  1.  
  2. max(N1, N2, N1) :- N1 > N2, !.
  3. max(N1, N2, N2).
  4.  
  5. height(empty, 0) :- !.
  6. height(tree(L, W, R), H) :- height(L, N1), height(R, N2), max(N1, N2, N), H is N + 1.
  7.  
  8. isEmpty(empty) :- !.
  9.  
  10.  
  11. pow(B, 0, 1) :- !.
  12. pow(B, P, E) :- P1 is P - 1, pow(B, P1, E1), E is E1 * B.
  13.  
  14. chars(C, 0, "") :- !.
  15. chars(C, N, S) :- N1 is N - 1, chars(C, N1, S1), string_concat(S1, C, S).
  16.  
  17. empty_string_list(0, []) :- !.
  18. empty_string_list(N, [""|L]) :- N1 is N - 1, empty_string_list(N1, L).
  19.  
  20. draw_tree(empty) :- write("empty"), !.
  21. draw_tree(T) :- height(T, H), H1 is H + 1, empty_string_list(H1, LIn), draw_tree_rek(T, H, 0, LIn, LOut), draw_tree_lines(LOut), nl(), nl().
  22.  
  23. draw_tree_lines([]) :- !.
  24. draw_tree_lines([L|R]) :- write(L), nl(), draw_tree_lines(R).
  25.  
  26. /* draw_tree_real(in:Baum, in:Hรถhe des Baumes, in:Aktuelle Tiefe, in:Liste Substrings, out:Liste Substrings]
  27.  
  28. wenn Tiefe == Index: \n Am Ende */  
  29.  
  30. draw_tree_rek(empty, T, T, L, L) :- !.
  31. draw_tree_rek(empty, H, T, [SIn|LIn], [SOut|LOut]) :-   T1 is T + 1, draw_tree_rek(empty, H, T1, LIn, LTemp),
  32.                                                         Height is H - T, pow(2, Height, N), NElements is N - 1, /* Calc number of elements in this subtree */
  33.                                                         NSpaces is (NElements - 1) / 2, draw_tree_build_element(NSpaces, 2, "  ", empty, empty, SIn, SOut),      
  34.                                                         draw_tree_insert_padding(2, LTemp, LTemp2),
  35.                                                         draw_tree_rek(empty, H, T1, LTemp2, LOut).                                                                                                        
  36.  
  37.  
  38. draw_tree_rek(tree(L, W, R), H, T, [SIn|LIn], [SOut|LOut]) :-   T1 is T + 1, draw_tree_rek(L, H, T1, LIn, LTemp),     /* Follow Left Tree */
  39.                                                                 Height is H - T, pow(2, Height, N), NElements is N - 1, /* Calc number of elements in this subtree */
  40.                                                                 NSpaces is (NElements - 1) / 2, draw_tree_build_element(NSpaces, 2, W, L, R, SIn, SOut),
  41.                                                                 draw_tree_insert_padding(2, LTemp, LTemp2),
  42.                                                                 draw_tree_rek(R, H, T1, LTemp2, LOut).
  43.  
  44.  
  45. draw_tree_build_edge(ESize, NSpaces, StatusLeft, StatusRight, EdgeLeft, EdgeRight) :-   NFill is (ESize - 1) * NSpaces,
  46.                                                                                         chars(" ", NFill, SpaceLeft), chars(" ", NFill, SpaceRight),  
  47.                                                                                         (isEmpty(StatusLeft), chars(" ", NSpaces, UnderLeft); chars("_", NSpaces, UnderLeft)),
  48.                                                                                         (isEmpty(StatusRight), chars(" ", NSpaces, UnderRight); chars("_", NSpaces, UnderRight)),
  49.                                                                                         string_concat(SpaceLeft, UnderLeft, EdgeLeft), string_concat(UnderRight, SpaceRight, EdgeRight).
  50.  
  51. draw_tree_build_element(NSpaces, ESize, E, StatusLeft, StatusRight, SBefore, SOut) :-   /* NFill is (ESize - 1) * NSpaces,
  52.                                                                 chars(" ", NFill, SpaceLeft), chars(" ", NFill, SpaceRight),
  53.                                                                 chars("_", NSpaces, UnderLeft), chars("_", NFill, UnderRight),
  54.                                                                 string_concat(SpaceLeft, UnderLeft, SLeft), string_concat(UnderRight, SpaceRight, SRight), */
  55.                                                                 draw_tree_build_edge(ESize, NSpaces, StatusLeft, StatusRight, SLeft, SRight),
  56.  
  57.                                                                 atom_string(E, SElement), string_length(SElement, L),
  58.                                                                 Padding is 2 - L, chars(" ", Padding, SPadding), string_concat(SPadding, SElement, SInner),
  59.                                                                 string_concat(SLeft, SInner, S1), string_concat(S1, SRight, S2),
  60.                                                                 string_concat(SBefore, S2, SOut).
  61.  
  62. draw_tree_insert_padding(Padding, [], []) :- !.
  63. draw_tree_insert_padding(Padding, [EIn|LIn], [EOut|LOut]) :- chars(" ", Padding, SPadding), string_concat(EIn, SPadding, EOut), draw_tree_insert_padding(Padding, LIn, LOut).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement