Facebook
From Marek, 4 Years ago, written in Plain Text.
This paste is a reply to Prolog test 2 - przem from Marek - view diff
Embed
Download Paste or View Raw
Hits: 409
  1. %przykładowe testy
  2. %przem(c,4,c,3)
  3. %przem(a,1,b,1)
  4. %przem(a,6,d,6)
  5. %
  6. %przem(a,1,X,Y) - brak optymalnego dobierania rozwiazania, problem wykonuje sie zbyt dlugo, dla tak duzej planszy
  7.  
  8.  
  9.  
  10. board([ [w  ,w  ,w  ,w  ,w  ,w  ,w  ,w  ,w  ],
  11.         [w  ,a  ,a  ,c  ,c  ,x  ,i  ,l  ,w  ],
  12.         [w  ,a  ,a  ,x  ,d  ,d  ,x  ,l  ,w  ],
  13.         [w  ,x  ,x  ,x  ,e  ,h  ,x  ,k  ,w  ],
  14.         [w  ,b  ,b  ,x  ,e  ,g  ,x  ,k  ,w  ],
  15.         [w  ,b  ,b  ,x  ,x  ,x  ,j  ,j  ,w  ],
  16.         [w  ,b  ,b  ,x  ,f  ,f  ,j  ,j  ,w  ],
  17.         [w  ,w  ,w  ,w  ,w  ,w  ,w  ,w  ,w  ]]).
  18.  
  19.  
  20. steps(2).
  21. steps(4).
  22. steps(8).
  23. steps(16).
  24. steps(32).
  25.  
  26. block(a).
  27. block(b).
  28. block(c).
  29. block(d).
  30. block(e).
  31. block(f).
  32. block(g).
  33. block(h).
  34. block(i).
  35. block(j).
  36. block(k).
  37. block(l).
  38.  
  39. direction(down).
  40. direction(right).
  41. direction(up).
  42. direction(left).
  43.  
  44. height(a, X):- X is 1.
  45. height(b, X):- X is 2.
  46. height(c, X):- X is 3.
  47. height(d, X):- X is 4.
  48. height(e, X):- X is 5.
  49. height(f, X):- X is 6.
  50.  
  51.  
  52. height(a).
  53. height(b).
  54. height(c).
  55. height(d).
  56. height(e).
  57. height(f).
  58.  
  59. width(1).
  60. width(2).
  61. width(3).
  62. width(4).
  63. width(5).
  64. width(6).
  65. width(7).
  66.  
  67.  
  68.  
  69. xydiff(D, Y, X):-
  70.     D = 'left',
  71.     Y is 0,
  72.     X is -1.
  73. xydiff(D, Y, X):-
  74.     D = 'right',
  75.     Y is 0,
  76.     X is 1.
  77. xydiff(D, Y, X):-
  78.     D = 'up',
  79.     Y is -1,
  80.     X is 0.    
  81. xydiff(D, Y, X):-
  82.     D = 'down',
  83.     Y is 1,
  84.     X is 0.
  85.  
  86.  
  87. % PREDICATS
  88.  
  89. %------------------
  90.         max_steps(MaxSteps):-
  91.         board(Board),
  92.         find_all_objects(Board, Objects, 'x'),
  93.         length(Objects, MaxSteps).
  94. %------------------
  95.  
  96.  
  97. %------------------
  98.     n_character(N, Chars, Char):-
  99.         string_chars(Chars, Str),
  100.         nth0(N, Str, Char).    
  101. %------------------    
  102.  
  103.  
  104. %------------------
  105.         position(Board, Y, X, Character):-
  106.         nth0(Y, Board, Column),
  107.         nth0(X, Column, Character).
  108. %------------------
  109.  
  110.  
  111. %------------------
  112.         find_corner(Board, Y, X, Character):-
  113.         position(Board, Y, X, Character), !.
  114. %------------------    
  115.  
  116.  
  117. %------------------
  118.         is_position_free(Board, Y, X):-
  119.         position(Board, Y, X, 'x').
  120. %------------------    
  121.  
  122.  
  123. %------------------
  124.     is_position_wall(Board, Y, X):-
  125.         position(Board, Y, X, 'w').
  126. %------------------
  127.  
  128.        
  129. %------------------
  130.     add_element(List, Element, [Element|List]).
  131. %------------------
  132.  
  133.  
  134. %------------------
  135.     change_in_list(Index, Elem, [_|T], [Elem|T]):-
  136.         Index = 0,
  137.         !.
  138.        
  139.     change_in_list(Index, Elem, [H|T], [H|Out]):-
  140.         Index1 is Index - 1,
  141.         change_in_list(Index1, Elem, T, Out).
  142. %------------------
  143.  
  144.  
  145. %------------------
  146.         insert_into_two_dimensional_array(Y, X, Object, Board, NewBoard):-
  147.         nth0(Y, Board, ColFrom),
  148.         change_in_list(X, Object, ColFrom, NewColFrom),
  149.         change_in_list(Y, NewColFrom, Board, NewBoard).
  150. %------------------
  151.  
  152.  
  153. %------------------
  154.     unpack_one_element_list([H|_], H).
  155.  
  156.  
  157.     unpack_two_element_list([H|T], H, B):-
  158.         unpack_one_element_list(T, B).
  159.  
  160.  
  161.         unpack_three_element_list([H|T], H, B, C):-
  162.         unpack_two_element_list(T, B, C).
  163. %------------------
  164.  
  165.  
  166. %------------------
  167.         find_all_objects(Board, Objects, Character):-
  168.         append(Board, L),
  169.         find_all_objects_unwrap(L, [], Objects, Character).
  170.        
  171.         find_all_objects_unwrap([], ObjectsTemp, ObjectsTemp, _).
  172.    
  173.     find_all_objects_unwrap([H|T], ObjectsTemp, Objects, Character):-
  174.         n_character(_, H, Character),
  175.         add_element(ObjectsTemp, H, ObjectsTemp1),
  176.         find_all_objects_unwrap(T, ObjectsTemp1, Objects, Character),!.
  177.  
  178.     find_all_objects_unwrap([_|T], ObjectsTemp, Objects, Character):-
  179.                 find_all_objects_unwrap(T, ObjectsTemp, Objects, Character), !.
  180.  
  181. %------------------    
  182.  
  183.  
  184.  
  185. %------------------
  186.     find_all_cords_of_block_unwrap(_, [], ListOfCords, ListOfCords).   
  187.        
  188.     find_all_cords_of_block_unwrap(Board, [H|T], ListOfCordsTemp, ListOfCords):-
  189.          position(Board, Y, X, H),
  190.          insert_into_two_dimensional_array(Y, X, 'T', Board, NewBoard),
  191.          add_element(ListOfCordsTemp, [Y, X], ListOfCordsTemp1),
  192.          find_all_cords_of_block_unwrap(NewBoard, T, ListOfCordsTemp1, ListOfCords), !.
  193.    
  194.         find_all_cords_of_block(Board, Character, ListOfCords):-
  195.         find_all_objects(Board, Objects, Character),
  196.         find_all_cords_of_block_unwrap(Board, Objects, [], ListOfCords).
  197. %------------------
  198.  
  199.  
  200. %------------------
  201.     replace_cords_with_character(Board, Board, [], _).
  202.         replace_cords_with_character(Board, NewBoard, [H|T], BlockCharacter):-
  203.         unpack_two_element_list(H, Y, X),
  204.         insert_into_two_dimensional_array(Y, X, BlockCharacter, Board, Board1),
  205.         replace_cords_with_character(Board1, NewBoard, T, BlockCharacter).
  206. %------------------
  207.  
  208.  
  209. %------------------
  210.         move_cordinates([], NewListOfCords, NewListOfCords , _, _).
  211.         move_cordinates([H|T], TemporaryListOfCords, NewListOfCords, Ydiff, Xdiff):-
  212.         unpack_two_element_list(H, Y, X),
  213.         Y1 is Y + Ydiff,
  214.         X1 is X + Xdiff,
  215.         add_element(TemporaryListOfCords, [Y1, X1], TemporaryListOfCords1),
  216.         move_cordinates(T, TemporaryListOfCords1, NewListOfCords, Ydiff, Xdiff).
  217. %------------------
  218.  
  219. %------------------
  220.         get_new_cords(ListOfCords, NewListOfCords, Direction):-
  221.         xydiff(Direction, Ydiff, Xdiff),
  222.         move_cordinates(ListOfCords, [], NewListOfCords, Ydiff, Xdiff).
  223. %------------------
  224.  
  225.  
  226. %------------------
  227.     can_single_cell_move(Board, Y, X, Ydiff, Xdiff):-
  228.         position(Board, Y, X, BlockCharacter),
  229.         Y1 is Y + Ydiff,
  230.         X1 is X + Xdiff,
  231.         position(Board, Y1, X1, CellCharacter),
  232.         (CellCharacter = BlockCharacter ; CellCharacter = 'x').
  233. %------------------
  234.  
  235.  
  236. %------------------    
  237.         can_every_cell_move(_, [], _, _).
  238.         can_every_cell_move(Board, [H|T], Xdiff, Ydiff):-
  239.         unpack_two_element_list(H, Y, X),
  240.         can_single_cell_move(Board, Y, X, Xdiff, Ydiff),
  241.         can_every_cell_move(Board, T, Xdiff, Ydiff).
  242. %------------------
  243.  
  244.  
  245. %------------------
  246.     can_block_move(Board, Direction, ListOfCords):-
  247.         xydiff(Direction, Ydiff, Xdiff),
  248.         can_every_cell_move(Board, ListOfCords, Ydiff, Xdiff).
  249. %------------------
  250.  
  251.  
  252.  
  253. %------------------    
  254.         move_block(Board, BlockCharacter, Direction, NewBoard):-
  255.         find_all_cords_of_block(Board, BlockCharacter, ListOfCords),
  256.         can_block_move(Board, Direction, ListOfCords),
  257.         replace_cords_with_character(Board, Board1, ListOfCords, x),
  258.         get_new_cords(ListOfCords, ListOfCords1, Direction),
  259.         replace_cords_with_character(Board1, NewBoard, ListOfCords1, BlockCharacter).
  260. %------------------
  261.  
  262.  
  263. %------------------
  264.         %best move for the game
  265.         one_step(Board, NewBoard):-
  266.        move_block(Board, a, right, NewBoard), !.
  267.        
  268.         %random  move
  269.         one_step(Board, NewBoard):-
  270.        direction(Dir),
  271.        block(BlockCharacter),
  272.        move_block(Board, BlockCharacter, Dir, NewBoard).
  273. %------------------
  274.        
  275.  
  276. %------------------
  277.         make_move(Board, Board, Steps, MaxSteps, Final_Y, Final_X, []):-
  278.         not(Steps > MaxSteps),
  279.         find_corner(Board, Y, X, a),
  280.         Y is Final_Y,
  281.         X is Final_X,
  282.         !.
  283.         make_move(Board, NewBoard, Steps, MaxSteps,  Final_Y, Final_X, MOVES):-
  284.         not(Steps > MaxSteps),
  285.         one_step(Board, BoardT),
  286.         IncSteps is Steps + 1,
  287.         make_move(BoardT, NewBoard, IncSteps, MaxSteps, Final_Y, Final_X, MOVEST),
  288.         MOVES = [BoardT | MOVEST],
  289.         !.
  290. %------------------
  291.  
  292.  
  293. %------------------
  294.  
  295.         rozwiaz(FinalY, FinalX, FinalBoard, MOVES):-
  296.         height(FinalY, Y),
  297.         board(B),
  298.         steps(MaxSteps),
  299.         make_move(B, FinalBoard, 0, MaxSteps, Y, FinalX, MOVES), !.
  300.        
  301. %------------------
  302.  
  303. max_height_width(MaxHeight, MaxWidth):-
  304.     board(B),
  305.     last(B, Row),
  306.     length(B, Height),
  307.     length(Row, Width),
  308.     MaxHeight is Height - 2,
  309.     MaxWidth is Width - 2.
  310.  
  311. walidate_cords(StartY, StartX, EndY, EndX):-
  312.     height(EndY),
  313.     width(EndX),
  314.     height(StartY),
  315.     width(StartX).
  316.    
  317. translate_cords(StartY, EndY, SY, EY):-
  318.     height(StartY, SY),
  319.     height(EndY, EY).
  320.  
  321. %------------------    
  322.         przem(StartY, StartX, EndY, EndX):-
  323.         walidate_cords(StartY, StartX, EndY, EndX),    
  324.                 translate_cords(StartY, EndY, SY, EY),    
  325.         max_steps(MaxSteps),
  326.         board(B),
  327.         przem_unwrap(B, SY, StartX, EY, EndX, 0, MaxSteps).
  328.        
  329.         przem_unwrap(_, StartY, StartX, EndY, EndX, Steps, MaxSteps):-
  330.         not(Steps > MaxSteps),
  331.         StartX = EndX,
  332.         StartY = EndY,!.
  333.  
  334.         przem_unwrap(Board, StartY, StartX, EndY, EndX, Steps, MaxSteps):-
  335.         not(Steps > MaxSteps),
  336.         position(Board, StartY, StartX,  Char),
  337.         direction(Dir),
  338.         move_block(Board, Char, Dir, NewBoard),
  339.         position(NewBoard, TempY, TempX, Char),
  340.         IncSteps = Steps + 1,
  341.         przem_unwrap(NewBoard, TempY, TempX, EndY, EndX, IncSteps, MaxSteps).
  342. %------------------