Prolog在递归后保持初始状态
Prolog keeps going to initial state after recursion
我正在尝试编写一个 prolog 程序,其中有一个叫 Neo 的人试图拯救人质,return 到一个安全的地方,叫做 booth,neo 有 6 个动作要做,它们是:上、下、左、右、放下和携带。我们正在尝试找出 neo 可以走的所有路径,因此例如 result(drop,result(up,result(carry,result(down,s0))))
是他可以走的路径。
canMove(hostages_loc(H), CAR):-
\+ length(H, 0);
CAR > 0.
%move right
action(state(grid(H,W), neo_loc(X,Y), Hos, Booth, Cap, Car), PATH , VISITED, NEWSTATE, NEWPATH):-
canMove(Hos, Car),
Y < W-1,
X1 is X,
Y1 is Y+1,
NEWPATH = result(right, PATH),
NEWSTATE = state(grid(H,W), neo_loc(X1,Y1), Hos, Booth, Cap, Car),
\+ member(NEWSTATE, VISITED).
%Move left
action(state(grid(H,W), neo_loc(X,Y), Hos, Booth, Cap, Car), PATH , VISITED, NEWSTATE, NEWPATH):-
canMove(Hos, Car),
Y > 0,
X1 is X,
Y1 is Y-1,
NEWPATH = result(left, PATH),
NEWSTATE = state(grid(H,W), neo_loc(X1,Y1), Hos, Booth, Cap, Car),
\+ member(NEWSTATE, VISITED).
%Move Up
action(state(grid(H,W), neo_loc(X,Y), Hos, Booth, Cap, Car), PATH , VISITED, NEWSTATE, NEWPATH):-
canMove(Hos, Car),
X > 0,
X1 is X-1,
Y1 is Y,
NEWPATH = result(up, PATH),
NEWSTATE = state(grid(H,W), neo_loc(X1,Y1), Hos, Booth, Cap, Car),
\+ member(NEWSTATE, VISITED).
% Move down
action(state(grid(H,W), neo_loc(X,Y), Hos, Booth, Cap, Car), PATH , VISITED, NEWSTATE, NEWPATH):-
canMove(Hos, Car),
X < H-1,
X1 is X+1,
Y1 is Y,
NEWPATH = result(down, PATH),
NEWSTATE = state(grid(H,W), neo_loc(X1,Y1), Hos, Booth, Cap, Car),
\+ member(NEWSTATE, VISITED).
% Carry
action(state(GRID, neo_loc(X,Y), hostages_loc(H), Booth, Cap, Car), PATH , VISITED, NEWSTATE, NEWPATH):-
member([X,Y],H),
Car < Cap,
delete(H,[X,Y], NEWH),
NewCar is Car + 1,
NEWPATH = result(carry, PATH),
NEWSTATE = state(GRID, neo_loc(X,Y), hostages_loc(NEWH), Booth, Cap, NewCar),
\+ member(NEWSTATE, VISITED).
% Drop
action(state(GRID, neo_loc(X,Y), Hos, booth(X,Y), Cap, Car), PATH , VISITED, NEWSTATE, NEWPATH):-
Car > 0,
NewCar is 0,
NEWPATH = result(drop, PATH),
NEWSTATE = state(GRID, neo_loc(X,Y), Hos, booth(X,Y), Cap, NewCar),
\+ member(NEWSTATE, VISITED).
path(state(_, neo_loc(X,Y), hostages_loc([]), booth(X,Y), _, 0),PATH,_,_,NEWPATH):-
NEWPATH = PATH.
path(STATE, PATH, VISITED, NEWSTATE, NEWPATH):-
action(STATE, PATH, VISITED, NEWSTATE, NEWPATH),
path(NEWSTATE, NEWPATH, [STATE|VISITED], S, P).
这是我的代码,问题是每当程序到达基本情况时
path(state(_, neo_loc(X,Y), hostages_loc([]), booth(X,Y), _, 0),PATH,_,_,NEWPATH):-
NEWPATH = PATH.
程序不断返回到第一个状态并且 return 仅执行第一个操作,例如,如果预期输出是 result(drop,result(up,result(carry,result(down,s0))))
它 return 返回 result(down,s0)
只有。路径的示例输入是:path(state(grid(2,1),neo_loc(0,0),hostages_loc([[1,0]]),booth(0,0),2,0),s0,[],NS,NP).
其中grid代表格子的大小,neo_loc代表neo在格子上的位置,hostages_loc代表需要解救的人质,booth代表摊位的位置, 2代表neo最多可以携带人质,0代表neo实际携带的人质数量。 s0 是初始路径,[] 代表访问状态。 NS 和 NP 是我需要的输出。
替换:
path(STATE, PATH, VISITED, NEWSTATE, NEWPATH):-
action(STATE, PATH, VISITED, NEWSTATE, NEWPATH),
path(NEWSTATE, NEWPATH, [STATE|VISITED], S, P).
与:
path(STATE, PATH, VISITED, FINALSTATE, FINALPATH):-
action(STATE, PATH, VISITED, NEWSTATE, NEWPATH),
path(NEWSTATE, NEWPATH, [STATE|VISITED], FINALSTATE, FINALPATH).
我正在尝试编写一个 prolog 程序,其中有一个叫 Neo 的人试图拯救人质,return 到一个安全的地方,叫做 booth,neo 有 6 个动作要做,它们是:上、下、左、右、放下和携带。我们正在尝试找出 neo 可以走的所有路径,因此例如 result(drop,result(up,result(carry,result(down,s0))))
是他可以走的路径。
canMove(hostages_loc(H), CAR):-
\+ length(H, 0);
CAR > 0.
%move right
action(state(grid(H,W), neo_loc(X,Y), Hos, Booth, Cap, Car), PATH , VISITED, NEWSTATE, NEWPATH):-
canMove(Hos, Car),
Y < W-1,
X1 is X,
Y1 is Y+1,
NEWPATH = result(right, PATH),
NEWSTATE = state(grid(H,W), neo_loc(X1,Y1), Hos, Booth, Cap, Car),
\+ member(NEWSTATE, VISITED).
%Move left
action(state(grid(H,W), neo_loc(X,Y), Hos, Booth, Cap, Car), PATH , VISITED, NEWSTATE, NEWPATH):-
canMove(Hos, Car),
Y > 0,
X1 is X,
Y1 is Y-1,
NEWPATH = result(left, PATH),
NEWSTATE = state(grid(H,W), neo_loc(X1,Y1), Hos, Booth, Cap, Car),
\+ member(NEWSTATE, VISITED).
%Move Up
action(state(grid(H,W), neo_loc(X,Y), Hos, Booth, Cap, Car), PATH , VISITED, NEWSTATE, NEWPATH):-
canMove(Hos, Car),
X > 0,
X1 is X-1,
Y1 is Y,
NEWPATH = result(up, PATH),
NEWSTATE = state(grid(H,W), neo_loc(X1,Y1), Hos, Booth, Cap, Car),
\+ member(NEWSTATE, VISITED).
% Move down
action(state(grid(H,W), neo_loc(X,Y), Hos, Booth, Cap, Car), PATH , VISITED, NEWSTATE, NEWPATH):-
canMove(Hos, Car),
X < H-1,
X1 is X+1,
Y1 is Y,
NEWPATH = result(down, PATH),
NEWSTATE = state(grid(H,W), neo_loc(X1,Y1), Hos, Booth, Cap, Car),
\+ member(NEWSTATE, VISITED).
% Carry
action(state(GRID, neo_loc(X,Y), hostages_loc(H), Booth, Cap, Car), PATH , VISITED, NEWSTATE, NEWPATH):-
member([X,Y],H),
Car < Cap,
delete(H,[X,Y], NEWH),
NewCar is Car + 1,
NEWPATH = result(carry, PATH),
NEWSTATE = state(GRID, neo_loc(X,Y), hostages_loc(NEWH), Booth, Cap, NewCar),
\+ member(NEWSTATE, VISITED).
% Drop
action(state(GRID, neo_loc(X,Y), Hos, booth(X,Y), Cap, Car), PATH , VISITED, NEWSTATE, NEWPATH):-
Car > 0,
NewCar is 0,
NEWPATH = result(drop, PATH),
NEWSTATE = state(GRID, neo_loc(X,Y), Hos, booth(X,Y), Cap, NewCar),
\+ member(NEWSTATE, VISITED).
path(state(_, neo_loc(X,Y), hostages_loc([]), booth(X,Y), _, 0),PATH,_,_,NEWPATH):-
NEWPATH = PATH.
path(STATE, PATH, VISITED, NEWSTATE, NEWPATH):-
action(STATE, PATH, VISITED, NEWSTATE, NEWPATH),
path(NEWSTATE, NEWPATH, [STATE|VISITED], S, P).
这是我的代码,问题是每当程序到达基本情况时
path(state(_, neo_loc(X,Y), hostages_loc([]), booth(X,Y), _, 0),PATH,_,_,NEWPATH):-
NEWPATH = PATH.
程序不断返回到第一个状态并且 return 仅执行第一个操作,例如,如果预期输出是 result(drop,result(up,result(carry,result(down,s0))))
它 return 返回 result(down,s0)
只有。路径的示例输入是:path(state(grid(2,1),neo_loc(0,0),hostages_loc([[1,0]]),booth(0,0),2,0),s0,[],NS,NP).
其中grid代表格子的大小,neo_loc代表neo在格子上的位置,hostages_loc代表需要解救的人质,booth代表摊位的位置, 2代表neo最多可以携带人质,0代表neo实际携带的人质数量。 s0 是初始路径,[] 代表访问状态。 NS 和 NP 是我需要的输出。
替换:
path(STATE, PATH, VISITED, NEWSTATE, NEWPATH):-
action(STATE, PATH, VISITED, NEWSTATE, NEWPATH),
path(NEWSTATE, NEWPATH, [STATE|VISITED], S, P).
与:
path(STATE, PATH, VISITED, FINALSTATE, FINALPATH):-
action(STATE, PATH, VISITED, NEWSTATE, NEWPATH),
path(NEWSTATE, NEWPATH, [STATE|VISITED], FINALSTATE, FINALPATH).