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

Replies to Prolog test 1 -przem rss

Title Name Language When
Re: Prolog test 1 -przem Marek text 4 Years ago.