Игра "Пятнашки", ошибки - Prolog
Формулировка задачи:
Всем привет! Сразу говорю, что в прологе полный 0. Код взяла из книги Братко. Проблема с запросом. При запуске выдает вот такую ошибку
.
Может корявый запрос, не знаю. Буду очень благодарна за любые идеи и подсказки. Заранее спасибо!!!
Вот код на SWI-Prolog:
Листинг программы
- % s [ node, SuccessorNode, Cost]
- S( [Empty I Tiles], [Tile ] Tilesl], 1) :- % Стоимости всех дуг равны 1
- swap( Empty, Tile, Tiles, Tilesl). % Поменять местами пустую фишку
- % Empty и фишку Tile в списке Tiles
- swap ( Empty, Tile, [Tile [ Ts], [Empty | Ts] ) :-
- mandist( Empty, Tile, 1). % Манхэттенское расстояние равно 1
- swap( Empty, Tile, [Tl I Ts], [Tl I Tsl] ) :-
- swap( Empty, Tile, Ts, Tsl).
- mandist( X/Y, Xl/Yl, D) :- % D - это манхэттенское расстояние между двумя клетками
- dif ( X, X1, Dx),
- dif ( Y, Y1 , Dy) ,
- D is Dx + Dy.
- dif( A, B, D) :- %равно IA-B|
- D is A-B, D >= 0, !
- D is B-A. •
- % Эвристическая оценка h представляет собой сумму расстояний от каждой фишки
- % до ее "исходной" клетки плис утроенное значение "оценки упорядоченности"
- h [Empty I Tiles], H] :-
- goal( [Emptyl| GoalSquares] ),
- totdist( Tiles, GoalSquares, D), % Суммарное расстояние от исходных клеток
- seq( Tiles, S), %i Оценка упорядоченности
- H is D + 3*S.
- totdist( [], [], 0) .
- totdist( [Tile I Tiles], [Square | Squares], D) :-
- mandist (Tile, Square, D1),
- totdist( Tiles, Squares, D2) ,
- D is Dl + D2.
- % seq( TilePositions, Score): оценка упорядоченности
- seq( [First | Other-Tiles], S) :-
- seq( [First | OtherTiles ], First, S).
- seq( [Tilel, Tile2 | Tiles], First, S) :-
- score( Tilel, Tile2, S1),
- seq( [Tile2 | Tiles], First, S2),
- S is S1 + S2.
- seq( [Last], First, S) :-
- score( Last, First, S).
- score( 2/2, _, 1 :- !. % Оценка фишки, стоящей в центре, равна 1
- score( 1/3, 2/3, 0):-! . % Оценка фишки, за которой следует
- % допустимый преемник, равна 0
- score( 2/3, 3/3, 0) :- ! .
- score( 3/3,3/2,0) :- !.
- score( 3/2, 3/1, 0) :- !.
- score( 3/1, 2/1, 0) :- I.
- score( 2/1, 1/1, 0) :- !.
- score( 1/1,1/2,0) :- !.
- score( 1/2, 1/3, G) :- !.
- score( _, _, 2). % Оценка фишкк, за которой следует
- % недопустимый преемник, равна 2
- goal ( [2/2, 1/3, 2/3, 3/3, 3/2, 3/1, 2/1, 1/1, 1/2] ). % Исходные клетки для фишек
- start1([2/2,1/3,3/2,2/3,3/3,3/1,2/1,1/1,1/2] ). % Требует 4 хода
- start2 ( [2/1,1/2,1/3,3/3,3/2,3/1,2/2,1/1,2/3] ). %Требует 5 ходов
- start3( [2/2,2/3,1/3,3/1,1/2,2/1,3/3,1/1,3/2] ). % Требует 19 ходов
- % Показать путь решения как список позиций на доске
- showsol( [] ).
- showsol( [Р | L] ) :-
- showsol( L),
- n1, write ( ' ----') ,
- showpos(P).
- % Показать позицию на доске
- showpos( [S0,Sl,S2,S3,S4,S5,S6,S7,S8 ] ) : -
- member[ Y, [3,2,1] >, % Последовательность координат Y
- nl, member[ X, [1,2,3] ), % Последовательность координат х
- member( Tile-X/Y), % Фишка в клетке X/Y
- [ ' '-SO,1-S1,2-S2,3-S3,4-S4,5-S5, 6-S6,7-S7, 8-S8 ] ,
- write( Tile),
- fail % Выполнить перебор с возвратом к следующей клетке
- true . % Обработка всех клеток закончена
- % Начальные позиции для некоторых задач
- start1([2/2,1/3,3/2,2/3,3/3,3/1,2/1,1/1,1/2] ). % Требует 4 хода
- start2 ( [2/1,1/2,1/3,3/3,3/2,3/1,2/2,1/1,2/3] ). %Требует 5 ходов
- start3( [2/2,2/3,1/3,3/1,1/2,2/1,3/3,1/1,3/2] ). % Требует 19 ходов
Решение задачи: «Игра "Пятнашки", ошибки»
textual
Листинг программы
- % Автор:
- % Дата: 18.05.2016
- % s( Node, SuccessorNode, Cost)
- s( [Empty | Tiles], [Tile | Tiles1], 1) :- % Стоимость всех дуг =1
- swap( Empty, Tile, Tiles, Tiles1). % Переставив Empty и Tile получаем Tiles
- swap( Empty, Tile, [Tile | Ts], [Empty | Ts] ) :-
- mandist( Empty, Tile, 1). % Манхэттенское расстояние = 1
- swap( Empty, Tile, [T1 | Ts], [T1 | Ts1] ) :-
- swap( Empty, Tile, Ts, Ts1).
- mandist( X/Y, X1/Y1, D) :- % D это манхэттенское расстояние между 2 %клетками
- dif( X, X1, Dx),
- dif( Y, Y1, Dy),
- D is Dx + Dy.
- dif( A, B, D) :- % D is |A-B|
- D is A-B, D >= 0, ! ;
- D is B-A.
- % Эвристическая оценка h равна сумме расстояний фишек от их целевых %клеток плюс степень упорядоченности*3
- h( [Empty | Tiles], H) :-
- goal( [Empty1 | GoalSquares] ),
- totdist( Tiles, GoalSquares, D),
- seq( Tiles, S), % Sequence score
- H is D + 3*S.
- totdist( [], [], 0).
- totdist( [Tile | Tiles], [Square | Squares], D) :-
- mandist( Tile, Square, D1),
- totdist( Tiles, Squares, D2),
- D is D1 + D2.
- % seq( TilePositions, Score):
- seq( [First | OtherTiles], S) :-
- seq( [First | OtherTiles ], First, S).
- seq( [Tile1, Tile2 | Tiles], First, S) :-
- score( Tile1, Tile2, S1),
- seq( [Tile2 | Tiles], First, S2),
- S is S1 + S2.
- seq( [Last], First, S) :-
- score( Last, First, S).
- score( 2/2, _, 1) :- !. % Фишка в центре 1
- score( 1/3, 2/3, 0) :- !. % Правильная последовательность 0
- score( 2/3, 3/3, 0) :- !.
- score( 3/3, 3/2, 0) :- !.
- score( 3/2, 3/1, 0) :- !.
- score( 3/1, 2/1, 0) :- !.
- score( 2/1, 1/1, 0) :- !.
- score( 1/1, 1/2, 0) :- !.
- score( 1/2, 1/3, 0) :- !.
- score( _, _, 2). % Неправильная последовательность 2
- goal( [2/2,1/3,2/3,3/3,3/2,3/1,2/1,1/1,1/2] ). % Цель
- % Отображение решающего пути списком позиций на доске
- showsol( [] ).
- showsol( [P | L] ) :-
- showsol( L),
- nl, write( '---'),
- showpos( P).
- % Отображение позиции на доске
- showpos( [S0,S1,S2,S3,S4,S5,S6,S7,S8] ) :-
- member( Y, [3,2,1] ), % Порядок Y-координаты
- nl, member( X, [1,2,3] ), % Порядок X-координаты
- member( Tile-X/Y, % Фишка в клетке X/Y
- [' '-S0,1-S1,2-S2,3-S3,4-S4,5-S5,6-S6,7-S7,8-S8] ),
- write( Tile),
- fail % Возврат с переходом к следующей клетке
- ;
- true. % Обработка всех клеток закончена
- % Поиск с предпочтением bestfirst
- % bestfirst( Start, Solution): Solution это решение от Start до goal
- bestfirst( Start, Solution) :-
- expand( [], l( Start, 0/0), 9999, _, yes, Solution).
- % 9999 самое большое значение эвристической оценки
- expand( P, l( N, _), _, _, yes, [N|P]) :-
- goal(N).
- expand( P, l(N,F/G), Bound, Tree1, Solved, Sol) :-
- F =< Bound,
- ( bagof( M/C, ( s(N,M,C), not(member(M,P)) ), Succ),
- !,
- succlist( G, Succ, Ts),
- bestf( Ts, F1),
- expand( P, t(N,F1/G,Ts), Bound, Tree1, Solved, Sol)
- ;
- Solved = never % Нет приемников-тупик
- ) .
- expand( P, t(N,F/G,[T|Ts]), Bound, Tree1, Solved, Sol) :-
- F =< Bound,
- bestf( Ts, BF), min( Bound, BF, Bound1), % Bound1 = min(Bound,BF)
- expand( [N|P], T, Bound1, T1, Solved1, Sol),
- continue( P, t(N,F/G,[T1|Ts]), Bound, Tree1, Solved1, Solved, Sol).
- expand( _, t(_,_,[]), _, _, never, _) :- !.
- % Тупиковое дерево-нет решений
- expand( _, Tree, Bound, Tree, no, _) :-
- f( Tree, F), F > Bound. % рост остановлен
- % continue( Path, Tree, Bound, NewTree, SubtreeSolved, TreeSolved, Solution)
- continue( _, _, _, _, yes, yes, Sol).
- continue( P, t(N,F/G,[T1|Ts]), Bound, Tree1, no, Solved, Sol) :-
- insert( T1, Ts, NTs),
- bestf( NTs, F1),
- expand( P, t(N,F1/G,NTs), Bound, Tree1, Solved, Sol).
- continue( P, t(N,F/G,[_|Ts]), Bound, Tree1, never, Solved, Sol) :-
- bestf( Ts, F1),
- expand( P, t(N,F1/G,Ts), Bound, Tree1, Solved, Sol).
- % succlist( G0, [ Node1/Cost1, ...], [ l(BestNode,BestF/G), ...]):
- succlist( _, [], []).
- succlist( G0, [N/C | NCs], Ts) :-
- G is G0 + C,
- h( N, H), % Heuristic term h(N)
- F is G + H,
- succlist( G0, NCs, Ts1),
- insert( l(N,F/G), Ts1, Ts).
- insert( T, Ts, [T | Ts]) :-
- f( T, F), bestf( Ts, F1),
- F =< F1, !.
- insert( T, [T1 | Ts], [T1 | Ts1]) :-
- insert( T, Ts, Ts1).
- % Получение эвристической оценки
- f( l(_,F/_), F). % f- эв. оценка листа
- f( t(_,F/_,_), F). % f- эв. оценка дерква
- bestf( [T|_], F) :- % Наилучшая эв-оценка для списка дереьев
- f( T, F).
- bestf( [], 9999). % Нет деревьев, плохая эв-оценка
- min( X, Y, X) :-
- X =< Y, !.
- min( X, Y, Y).
- % Некоторые стартовые позиции
- start1( [2/2,1/3,3/2,2/3,3/3,3/1,2/1,1/1,1/2] ). % Requires 4 steps
- start2( [2/1,1/2,1/3,3/3,3/2,3/1,2/2,1/1,2/3] ). % Requires 5 steps
- start3( [2/2,2/3,1/3,3/1,1/2,2/1,3/3,1/1,3/2] ). % Requires 18 steps
- % Пример запроса: ?- start1( Pos), bestfirst( Pos, Sol), showsol( Sol).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д