Игра "Пятнашки", ошибки - Prolog

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

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

Всем привет! Сразу говорю, что в прологе полный 0. Код взяла из книги Братко. Проблема с запросом. При запуске выдает вот такую ошибку . Может корявый запрос, не знаю. Буду очень благодарна за любые идеи и подсказки. Заранее спасибо!!! Вот код на SWI-Prolog:
Листинг программы
  1. % s [ node, SuccessorNode, Cost]
  2. S( [Empty I Tiles], [Tile ] Tilesl], 1) :- % Стоимости всех дуг равны 1
  3. swap( Empty, Tile, Tiles, Tilesl). % Поменять местами пустую фишку
  4. % Empty и фишку Tile в списке Tiles
  5. swap ( Empty, Tile, [Tile [ Ts], [Empty | Ts] ) :-
  6. mandist( Empty, Tile, 1). % Манхэттенское расстояние равно 1
  7. swap( Empty, Tile, [Tl I Ts], [Tl I Tsl] ) :-
  8. swap( Empty, Tile, Ts, Tsl).
  9. mandist( X/Y, Xl/Yl, D) :- % D - это манхэттенское расстояние между двумя клетками
  10. dif ( X, X1, Dx),
  11. dif ( Y, Y1 , Dy) ,
  12. D is Dx + Dy.
  13. dif( A, B, D) :- %равно IA-B|
  14. D is A-B, D >= 0, !
  15. D is B-A.
  16. % Эвристическая оценка h представляет собой сумму расстояний от каждой фишки
  17. % до ее "исходной" клетки плис утроенное значение "оценки упорядоченности"
  18. h [Empty I Tiles], H] :-
  19. goal( [Emptyl| GoalSquares] ),
  20. totdist( Tiles, GoalSquares, D), % Суммарное расстояние от исходных клеток
  21. seq( Tiles, S), %i Оценка упорядоченности
  22. H is D + 3*S.
  23. totdist( [], [], 0) .
  24. totdist( [Tile I Tiles], [Square | Squares], D) :-
  25. mandist (Tile, Square, D1),
  26. totdist( Tiles, Squares, D2) ,
  27. D is Dl + D2.
  28. % seq( TilePositions, Score): оценка упорядоченности
  29. seq( [First | Other-Tiles], S) :-
  30. seq( [First | OtherTiles ], First, S).
  31. seq( [Tilel, Tile2 | Tiles], First, S) :-
  32. score( Tilel, Tile2, S1),
  33. seq( [Tile2 | Tiles], First, S2),
  34. S is S1 + S2.
  35. seq( [Last], First, S) :-
  36. score( Last, First, S).
  37. score( 2/2, _, 1 :- !. % Оценка фишки, стоящей в центре, равна 1
  38. score( 1/3, 2/3, 0):-! . % Оценка фишки, за которой следует
  39. % допустимый преемник, равна 0
  40. score( 2/3, 3/3, 0) :- ! .
  41. score( 3/3,3/2,0) :- !.
  42. score( 3/2, 3/1, 0) :- !.
  43. score( 3/1, 2/1, 0) :- I.
  44. score( 2/1, 1/1, 0) :- !.
  45. score( 1/1,1/2,0) :- !.
  46. score( 1/2, 1/3, G) :- !.
  47. score( _, _, 2). % Оценка фишкк, за которой следует
  48. % недопустимый преемник, равна 2
  49. goal ( [2/2, 1/3, 2/3, 3/3, 3/2, 3/1, 2/1, 1/1, 1/2] ). % Исходные клетки для фишек
  50. start1([2/2,1/3,3/2,2/3,3/3,3/1,2/1,1/1,1/2] ). % Требует 4 хода
  51. start2 ( [2/1,1/2,1/3,3/3,3/2,3/1,2/2,1/1,2/3] ). %Требует 5 ходов
  52. start3( [2/2,2/3,1/3,3/1,1/2,2/1,3/3,1/1,3/2] ). % Требует 19 ходов
  53. % Показать путь решения как список позиций на доске
  54. showsol( [] ).
  55. showsol( | L] ) :-
  56. showsol( L),
  57. n1, write ( ' ----') ,
  58. showpos(P).
  59. % Показать позицию на доске
  60. showpos( [S0,Sl,S2,S3,S4,S5,S6,S7,S8 ] ) : -
  61. member[ Y, [3,2,1] >, % Последовательность координат Y
  62. nl, member[ X, [1,2,3] ), % Последовательность координат х
  63. member( Tile-X/Y), % Фишка в клетке X/Y
  64. [ ' '-SO,1-S1,2-S2,3-S3,4-S4,5-S5, 6-S6,7-S7, 8-S8 ] ,
  65. write( Tile),
  66. fail % Выполнить перебор с возвратом к следующей клетке
  67. true . % Обработка всех клеток закончена
  68. % Начальные позиции для некоторых задач
  69. start1([2/2,1/3,3/2,2/3,3/3,3/1,2/1,1/1,1/2] ). % Требует 4 хода
  70. start2 ( [2/1,1/2,1/3,3/3,3/2,3/1,2/2,1/1,2/3] ). %Требует 5 ходов
  71. start3( [2/2,2/3,1/3,3/1,1/2,2/1,3/3,1/1,3/2] ). % Требует 19 ходов

Решение задачи: «Игра "Пятнашки", ошибки»

textual
Листинг программы
  1. % Автор:
  2. % Дата: 18.05.2016
  3.  
  4. % s( Node, SuccessorNode, Cost)
  5.  
  6. s( [Empty | Tiles], [Tile | Tiles1], 1) :- % Стоимость всех дуг =1
  7. swap( Empty, Tile, Tiles, Tiles1). % Переставив Empty и Tile получаем Tiles
  8.  
  9. swap( Empty, Tile, [Tile | Ts], [Empty | Ts] ) :-
  10. mandist( Empty, Tile, 1). % Манхэттенское расстояние = 1
  11.  
  12. swap( Empty, Tile, [T1 | Ts], [T1 | Ts1] ) :-
  13. swap( Empty, Tile, Ts, Ts1).
  14.  
  15. mandist( X/Y, X1/Y1, D) :- % D это манхэттенское расстояние между 2                                                     %клетками
  16. dif( X, X1, Dx),
  17. dif( Y, Y1, Dy),
  18. D is Dx + Dy.
  19.  
  20. dif( A, B, D) :- % D is |A-B|
  21. D is A-B, D >= 0, ! ;
  22. D is B-A.
  23.  
  24. % Эвристическая оценка h равна сумме расстояний фишек от их целевых %клеток плюс степень упорядоченности*3
  25.  
  26. h( [Empty | Tiles], H) :-
  27. goal( [Empty1 | GoalSquares] ),
  28. totdist( Tiles, GoalSquares, D),
  29. seq( Tiles, S), % Sequence score
  30. H is D + 3*S.
  31.  
  32. totdist( [], [], 0).
  33.  
  34. totdist( [Tile | Tiles], [Square | Squares], D) :-
  35. mandist( Tile, Square, D1),
  36. totdist( Tiles, Squares, D2),
  37. D is D1 + D2.
  38.  
  39. % seq( TilePositions, Score):
  40.  
  41. seq( [First | OtherTiles], S) :-
  42. seq( [First | OtherTiles ], First, S).
  43.  
  44. seq( [Tile1, Tile2 | Tiles], First, S) :-
  45. score( Tile1, Tile2, S1),
  46. seq( [Tile2 | Tiles], First, S2),
  47. S is S1 + S2.
  48.  
  49. seq( [Last], First, S) :-
  50. score( Last, First, S).
  51.  
  52. score( 2/2, _, 1) :- !. % Фишка в центре 1
  53.  
  54. score( 1/3, 2/3, 0) :- !. % Правильная последовательность 0
  55. score( 2/3, 3/3, 0) :- !.
  56. score( 3/3, 3/2, 0) :- !.
  57. score( 3/2, 3/1, 0) :- !.
  58. score( 3/1, 2/1, 0) :- !.
  59. score( 2/1, 1/1, 0) :- !.
  60. score( 1/1, 1/2, 0) :- !.
  61. score( 1/2, 1/3, 0) :- !.
  62.  
  63. score( _, _, 2). % Неправильная последовательность 2
  64.  
  65. goal( [2/2,1/3,2/3,3/3,3/2,3/1,2/1,1/1,1/2] ). % Цель
  66.  
  67. % Отображение решающего пути списком позиций на доске
  68.  
  69. showsol( [] ).
  70.  
  71. showsol( [P | L] ) :-
  72. showsol( L),
  73. nl, write( '---'),
  74. showpos( P).
  75.  
  76. % Отображение позиции на доске
  77.  
  78. showpos( [S0,S1,S2,S3,S4,S5,S6,S7,S8] ) :-
  79. member( Y, [3,2,1] ), % Порядок Y-координаты
  80. nl, member( X, [1,2,3] ), % Порядок X-координаты
  81. member( Tile-X/Y,  % Фишка в клетке X/Y
  82. [' '-S0,1-S1,2-S2,3-S3,4-S4,5-S5,6-S6,7-S7,8-S8] ),
  83. write( Tile),
  84. fail % Возврат с переходом к следующей клетке
  85. ;
  86. true. % Обработка всех клеток закончена
  87.  
  88.  
  89.  
  90. % Поиск с предпочтением bestfirst
  91.  
  92. % bestfirst( Start, Solution): Solution это решение от Start до goal
  93.  
  94. bestfirst( Start, Solution) :-
  95. expand( [], l( Start, 0/0), 9999, _, yes, Solution).
  96. % 9999 самое большое значение эвристической оценки
  97.  
  98. expand( P, l( N, _), _, _, yes, [N|P]) :-
  99. goal(N).
  100.  
  101. expand( P, l(N,F/G), Bound, Tree1, Solved, Sol) :-
  102. F =< Bound,
  103. ( bagof( M/C, ( s(N,M,C), not(member(M,P)) ), Succ),
  104. !,
  105. succlist( G, Succ, Ts),
  106. bestf( Ts, F1),
  107. expand( P, t(N,F1/G,Ts), Bound, Tree1, Solved, Sol)
  108. ;
  109. Solved = never % Нет приемников-тупик
  110. ) .
  111. expand( P, t(N,F/G,[T|Ts]), Bound, Tree1, Solved, Sol) :-
  112. F =< Bound,
  113. bestf( Ts, BF), min( Bound, BF, Bound1), % Bound1 = min(Bound,BF)
  114. expand( [N|P], T, Bound1, T1, Solved1, Sol),
  115. continue( P, t(N,F/G,[T1|Ts]), Bound, Tree1, Solved1, Solved, Sol).
  116.  
  117. expand( _, t(_,_,[]), _, _, never, _) :- !.
  118.  
  119. % Тупиковое дерево-нет решений
  120.  
  121. expand( _, Tree, Bound, Tree, no, _) :-
  122. f( Tree, F), F > Bound. % рост остановлен
  123.  
  124. % continue( Path, Tree, Bound, NewTree, SubtreeSolved, TreeSolved, Solution)
  125.  
  126. continue( _, _, _, _, yes, yes, Sol).
  127.  
  128. continue( P, t(N,F/G,[T1|Ts]), Bound, Tree1, no, Solved, Sol) :-
  129. insert( T1, Ts, NTs),
  130. bestf( NTs, F1),
  131. expand( P, t(N,F1/G,NTs), Bound, Tree1, Solved, Sol).
  132.  
  133. continue( P, t(N,F/G,[_|Ts]), Bound, Tree1, never, Solved, Sol) :-
  134. bestf( Ts, F1),
  135. expand( P, t(N,F1/G,Ts), Bound, Tree1, Solved, Sol).
  136.  
  137. % succlist( G0, [ Node1/Cost1, ...], [ l(BestNode,BestF/G), ...]):
  138. succlist( _, [], []).
  139.  
  140. succlist( G0, [N/C | NCs], Ts) :-
  141. G is G0 + C,
  142. h( N, H), % Heuristic term h(N)
  143. F is G + H,
  144. succlist( G0, NCs, Ts1),
  145. insert( l(N,F/G), Ts1, Ts).
  146.  
  147. insert( T, Ts, [T | Ts]) :-
  148. f( T, F), bestf( Ts, F1),
  149. F =< F1, !.
  150.  
  151. insert( T, [T1 | Ts], [T1 | Ts1]) :-
  152. insert( T, Ts, Ts1).
  153.  
  154.  
  155. % Получение эвристической оценки
  156.  
  157. f( l(_,F/_), F). % f-  эв. оценка листа
  158.  
  159. f( t(_,F/_,_), F). % f- эв. оценка дерква
  160.  
  161. bestf( [T|_], F) :- % Наилучшая эв-оценка для списка дереьев
  162. f( T, F).
  163.  
  164. bestf( [], 9999). % Нет деревьев, плохая эв-оценка
  165.  
  166. min( X, Y, X) :-
  167. X =< Y, !.
  168.  
  169. min( X, Y, Y).
  170.  
  171.  
  172.  
  173. % Некоторые стартовые позиции
  174.  
  175. start1( [2/2,1/3,3/2,2/3,3/3,3/1,2/1,1/1,1/2] ). % Requires 4 steps
  176.  
  177. start2( [2/1,1/2,1/3,3/3,3/2,3/1,2/2,1/1,2/3] ). % Requires 5 steps
  178.  
  179. start3( [2/2,2/3,1/3,3/1,1/2,2/1,3/3,1/1,3/2] ). % Requires 18 steps
  180.  
  181.  
  182. % Пример запроса: ?- start1( Pos), bestfirst( Pos, Sol), showsol( Sol).

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


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

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

6   голосов , оценка 4.333 из 5

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

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

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