Prolog - 解决迷宫
Prolog - Solve labyrinth
我需要有关序言问题的帮助。
问题的内容是:
编写一个名为 Labyrinth(Lab, From, To) 的谓词 Prolog,它在输入中接收迷宫、初始位置和结束位置,并打印可能的移动列表(上、右、下、左)。迷宫是一个 7x7 矩阵,包含行列表和列列表。如果是墙,每个单元格包含 'w',否则如果是空的,则包含 'e'。
开始和结束位置用函数 in/2 描述,该函数的参数是行和列。
这是一个矩阵示例(索引从 0 开始)
Labyrinth([
[e,e,w,w,w,w,w],
[w,e,w,e,w,e,w],
[w,e,w,e,w,e,w],
[w,e,e,e,w,e,w],
[w,e,w,e,w,e,w],
[w,e,e,e,e,e,w],
[e,w,w,w,w,e,e]
], in(0,0), in(6,6)
我理解需要:
- 四个谓词,每个动作一个(上、下、左、右);
一个测试当前单元格是== 'w'还是== 'e';
检查当前位置是否为最终位置的目标测试
我一直在写正确的序列和谓词来解决问题。
有人有什么提示吗?
/******* 更新 ******************/
@CapelliC 这是我的代码。我寻找编写必要的谓词,但我陷入了回溯
get_cell([R,C], Data,L):-
nth1(R,Data,L1),
nth1(C,L1,L).
labyrinth(Map, Start, Finish, Move) :-
move(Start, Move),
update(Start, Move, NewState),
legal(NewState, Map),
\+ member(NewState, Finish),
labyrinth(Map, NewState, [NewState|Finish], Move).
legal( p(X,Y), Map) :-
X > 0,
Y > 0,
get_cell([X,Y], Map, Z),
%write(Z),
Z \= w .
% UP
update( p(X, Y), up, p(X_new, Y) ) :-
write('up '),
X_new is X - 1.
% DOWN
update( p(X,Y), down, p(X_new, Y) ) :-
write('down '),
X_new is X + 1.
% LEFT
update( p(X,Y), left, p(X, Y_new) ) :-
write('left '),
Y_new is Y - 1.
% RIGHT
update( p(X,Y), right, p(X, Y_new) ) :-
write('right '),
Y_new is Y + 1.
move( p( _, _ ), up ).
move( p( _, _ ), down ).
move( p( _, _ ), left ).
move( p( _, _ ), right ).
我这样调用程序:
labyrinth([
[e,e,w,w,w,w,w],
[w,e,w,e,w,e,w],
[w,e,w,e,w,e,w],
[w,e,e,e,w,e,w],
[w,e,w,e,w,e,w],
[w,e,e,e,e,e,w],
[e,w,w,w,w,e,e]
], p(1,2), p(6,6), _)
一些整体变化,这可能是一种在迷宫中实现回溯的方法。如果之前已经访问过某个位置,则有一个额外的位置列表可以跟踪,如果迷宫没有循环,则没有必要。
get_cell([R,C], Data,L):-
nth0(R,Data,L1),
nth0(C,L1,L).
labyrinth(Map, Start, Finish):-
labyrinth(Map, Start, Finish,[], [],Solution),!,
reverse(Solution,S),
print(S).
labyrinth(_, Finish, Finish,_, Out,Out). %Unification of solution
labyrinth(Map, Start, Finish, Positions,Moves,Out) :-
move(Move),
update(Start, Move, NewState),
\+ member(NewState, Positions),
legal(NewState, Map),
labyrinth(Map, NewState, Finish,[NewState|Positions],[Move|Moves],Out).
legal( p(X,Y), Map) :-
X >= 0, 7>X,
Y >= 0, 7>Y,
get_cell([X,Y], Map, Z),
%write(Z),
Z \= w .
% UP
update( p(X, Y), up, p(X_new, Y) ) :-
X_new is X - 1.
% DOWN
update( p(X,Y), down, p(X_new, Y) ) :-
X_new is X + 1.
% LEFT
update( p(X,Y), left, p(X, Y_new) ) :-
Y_new is Y - 1.
% RIGHT
update( p(X,Y), right, p(X, Y_new) ) :-
Y_new is Y + 1.
move( up ).
move( down ).
move( left ).
move( right ).
我需要有关序言问题的帮助。
问题的内容是: 编写一个名为 Labyrinth(Lab, From, To) 的谓词 Prolog,它在输入中接收迷宫、初始位置和结束位置,并打印可能的移动列表(上、右、下、左)。迷宫是一个 7x7 矩阵,包含行列表和列列表。如果是墙,每个单元格包含 'w',否则如果是空的,则包含 'e'。 开始和结束位置用函数 in/2 描述,该函数的参数是行和列。
这是一个矩阵示例(索引从 0 开始)
Labyrinth([
[e,e,w,w,w,w,w],
[w,e,w,e,w,e,w],
[w,e,w,e,w,e,w],
[w,e,e,e,w,e,w],
[w,e,w,e,w,e,w],
[w,e,e,e,e,e,w],
[e,w,w,w,w,e,e]
], in(0,0), in(6,6)
我理解需要:
- 四个谓词,每个动作一个(上、下、左、右);
一个测试当前单元格是== 'w'还是== 'e';
检查当前位置是否为最终位置的目标测试
我一直在写正确的序列和谓词来解决问题。 有人有什么提示吗?
/******* 更新 ******************/ @CapelliC 这是我的代码。我寻找编写必要的谓词,但我陷入了回溯
get_cell([R,C], Data,L):-
nth1(R,Data,L1),
nth1(C,L1,L).
labyrinth(Map, Start, Finish, Move) :-
move(Start, Move),
update(Start, Move, NewState),
legal(NewState, Map),
\+ member(NewState, Finish),
labyrinth(Map, NewState, [NewState|Finish], Move).
legal( p(X,Y), Map) :-
X > 0,
Y > 0,
get_cell([X,Y], Map, Z),
%write(Z),
Z \= w .
% UP
update( p(X, Y), up, p(X_new, Y) ) :-
write('up '),
X_new is X - 1.
% DOWN
update( p(X,Y), down, p(X_new, Y) ) :-
write('down '),
X_new is X + 1.
% LEFT
update( p(X,Y), left, p(X, Y_new) ) :-
write('left '),
Y_new is Y - 1.
% RIGHT
update( p(X,Y), right, p(X, Y_new) ) :-
write('right '),
Y_new is Y + 1.
move( p( _, _ ), up ).
move( p( _, _ ), down ).
move( p( _, _ ), left ).
move( p( _, _ ), right ).
我这样调用程序:
labyrinth([
[e,e,w,w,w,w,w],
[w,e,w,e,w,e,w],
[w,e,w,e,w,e,w],
[w,e,e,e,w,e,w],
[w,e,w,e,w,e,w],
[w,e,e,e,e,e,w],
[e,w,w,w,w,e,e]
], p(1,2), p(6,6), _)
一些整体变化,这可能是一种在迷宫中实现回溯的方法。如果之前已经访问过某个位置,则有一个额外的位置列表可以跟踪,如果迷宫没有循环,则没有必要。
get_cell([R,C], Data,L):-
nth0(R,Data,L1),
nth0(C,L1,L).
labyrinth(Map, Start, Finish):-
labyrinth(Map, Start, Finish,[], [],Solution),!,
reverse(Solution,S),
print(S).
labyrinth(_, Finish, Finish,_, Out,Out). %Unification of solution
labyrinth(Map, Start, Finish, Positions,Moves,Out) :-
move(Move),
update(Start, Move, NewState),
\+ member(NewState, Positions),
legal(NewState, Map),
labyrinth(Map, NewState, Finish,[NewState|Positions],[Move|Moves],Out).
legal( p(X,Y), Map) :-
X >= 0, 7>X,
Y >= 0, 7>Y,
get_cell([X,Y], Map, Z),
%write(Z),
Z \= w .
% UP
update( p(X, Y), up, p(X_new, Y) ) :-
X_new is X - 1.
% DOWN
update( p(X,Y), down, p(X_new, Y) ) :-
X_new is X + 1.
% LEFT
update( p(X,Y), left, p(X, Y_new) ) :-
Y_new is Y - 1.
% RIGHT
update( p(X,Y), right, p(X, Y_new) ) :-
Y_new is Y + 1.
move( up ).
move( down ).
move( left ).
move( right ).