我正在尝试编写一个Prolog程序,其中有一个名叫Neo的人试图救出人质并将他们带到一个安全的地方,称为“展位”。Neo有六个可以执行的动作:向上、向下、向左、向右、放下和携带。我们试图找出Neo可以采取的所有路径,例如result(drop,result(up,result(carry,result(down,s0))))
就是他可以采取的一条路径。
canMove(hostages_loc(H), CAR):- \+ length(H, 0); CAR > 0.%向右移动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).%向左移动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).%向上移动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).%向下移动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).%携带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).%放下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.
程序就会不断回到初始状态,并且只返回最初执行的动作。例如,如果预期输出是result(drop,result(up,result(carry,result(down,s0))))
,它只会返回result(down,s0)
。path的一个示例输入是: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).