Prolog在递归后不断回到初始状态

我正在尝试编写一个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).

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注