【问题标题】:Prolog keeps going to initial state after recursionProlog在递归后继续进入初始状态
【发布时间】:2021-12-10 13:12:17
【问题描述】:

我正在尝试编写一个 prolog 程序,其中我们有一个叫 Neo 的人试图拯救人质并将其返回一个称为展位的安全地方,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.

程序继续返回第一个状态并仅返回第一个动作,例如,如果预期输出为result(drop,result(up,result(carry,result(down,s0)))),它仅返回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 是我需要的输出。

【问题讨论】:

  • 当我在 SWI-Prolog 中加载这个程序时,我收到一条警告说foo.pl:67: Singleton variables: [S,P]。如果您使用的 Prolog 不提供此类警告,请切换到提供此类警告的 Prolog。如果您使用的 Prolog 会发出此类警告,请认真对待这些警告。它们通常表明您有一个真正的错误。在这种情况下,这正是您需要修复的地方。

标签: prolog artificial-intelligence


【解决方案1】:

替换:

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).

【讨论】:

    猜你喜欢
    • 2021-04-06
    • 1970-01-01
    • 2015-11-15
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 2022-11-20
    • 1970-01-01
    相关资源
    最近更新 更多