prolog - Prolog 迷宫问题:代码给出了从头到尾的无限路径并且不会回溯
问题描述
我正在尝试使用回溯解决 Prolog 中的迷宫。
我的问题是,当我运行程序时,它第一次正确运行,但之后它将结束位置作为起始位置并不断从那里寻找路径,因此进入无限循环。当 2 个位置之间不存在路径时,它可以正常工作。我已经尝试了很多东西,但似乎没有任何效果。这是我的代码:
path(Dest, Dest, _, [], _) :- !.
path([Row0,Col0],[Row1,Col1],M,Path,1) :-
next_move([Row0,Col0],[Rnew,Cnew]),
is_available(Rnew, Cnew,Ret),
write(Rnew),
write(Cnew),
not(member([Rnew, Cnew], M)),
path([Rnew, Cnew], [Row1, Col1], [[Rnew,Cnew]|M], Path, Ret).
path([X0,Y0], [X1,Y1], [[X0,Y0]|M], [[X,Y]|Path], 0) :-
path([X,Y],[X1,Y1],M,Path,1).
样本输出:
?- solves([1,1],[1,7],P).
P = [[1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7]] ;
P = [[1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [2, 6], [2, 7], [2|...],
[...|...]|...] ;
P = [[1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [2, 6], [2, 7], [2|...],
[...|...]|...] ;
P = [[1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [2, 6], [2, 7], [2|...],
[...|...]|...] .
执行程序时,如果两个位置之间存在路径,则应显示所有路径。否则它应该返回 false 。正如您在上面看到的,我的代码进入无限循环并不断生成路径。
请帮忙,因为我在 Prolog 方面不是很有经验。谢谢。
解决方案
谓词的第一个子句path/5
及其第二个子句中的递归调用是错误的。它应该是:
path(Dest, Dest, _, [], _) :- !.
path([Row0,Col0],[Row1,Col1],M,[[Rnew,Cnew]|Path],1) :-
next_move([Row0,Col0],[Rnew,Cnew]),
is_available(Rnew, Cnew,Ret),
write(Rnew),
write(Cnew),
\+ member([Rnew, Cnew], M),
path([Rnew, Cnew], [Row1, Col1], [[Rnew,Cnew]|M], Path, Ret).
此外,使用 ISO Prolog 标准\+/1
谓词而不是not/1
旧谓词。
推荐阅读
- reactjs - 在 ReactJS 中登录需要两次单击
- spring-boot - 是否可以将权限映射到与 Spring Boot 集成的 Keycloak 中的 HTTP 方法?
- arrays - 在 Shell 脚本中将字符串转换为数组
- wai-aria - 使 aria-live 区域读取链接
- java - 从 pc 应用程序访问任何智能手机上的联系人和消息
- java - 仅使用队列在所有大小为 K 的连续子数组中查找最大元素
- python - 如果我更改值 test.i,类是否会像对象测试那样?
- python - Alembic 自动生成会在每次迁移时重新创建表
- instruction-set - 需要帮助解决基于8085指令集的汇编语言程序
- excel - fill every empty cell after a range of datas in the same column