Prolog-解决迷宫

问题描述 投票:0回答:1

我需要解决序言问题。

问题文字为:编写一个称为迷宫的谓词Prolog(Lab,From,To),在输入中接收迷宫,初始位置和结束位置,并打印可能的动作列表(上,右,下,左)。迷宫是一个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)

我了解需要:

  1. 四个谓词,每个动作一个(上,下,左,右);
  2. 一个测试当前单元格是=='w'还是=='e';

  3. 用于检查当前位置是否为最终位置的目标测试

我被迫写下正确的顺序并断言要解决问题。有人有提示吗?

/ *******更新****************** /@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), _)
prolog backtracking
1个回答
0
投票

您快到了。此简化的代码以相反的顺序生成路径。更大的错误是缺少拜访的电池累加器(在以下子句中称为SoFar)。最好避免在每次猜测时都印出方向,因为在回溯的情况下,此类信息的价值很小。

:- module(labyrinth,
          [ labyrinth/4
          ]).

labyrinth(Map, Start, Finish, Path) :-
    explore(Map, Start, Finish, [], Path).

explore(_Map, Finish, Finish, SoFar, Path) :-
   reverse([Finish|SoFar], Path).
explore(Map, CurPos, Finish, SoFar, Path) :-
   update(CurPos, NewPos),
   legal(NewPos, Map),
   \+ memberchk(NewPos, SoFar),
   explore(Map, NewPos, Finish, [CurPos|SoFar], Path).

legal( p(X,Y), Map) :-
   get_cell([X,Y], Map, Z),
   Z \= w .

get_cell([R,C], Data,L):-
   nth1(R,Data,L1),
   nth1(C,L1,L).

update(  p(X, Y), p(X_new, Y)  ) :-
   X_new is X - 1.
update(  p(X,Y), p(X_new, Y) ) :-
   X_new is X + 1.
update(  p(X,Y), p(X, Y_new)  ) :-
   Y_new is Y - 1.
update(  p(X,Y), p(X, Y_new)  ) :-
   Y_new is Y + 1.

有2个解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.