Prolog实现5x5迷宫move谓词查询下一步可行移动位置求助
问题诊断
你现有代码的核心错误如下:
- 不需要递归:你的需求是获取相邻一步的合法移动位置,递归调用
move会遍历所有可达点,而非仅相邻位置 - 逻辑连接符误用:四个方向的判断用了逗号(逻辑与),要求四个方向同时满足条件才返回结果,显然不符合需求
- 边界条件错误:你用的
nth1是从1开始计数的,5x5网格的坐标范围是1~5,之前写的X2 >= 5、Y2 >= 0都是错误边界 - 谓词逻辑错误:后续调整的版本直接返回了当前坐标,且第一个子句的第二个参数是匿名变量,会直接返回无意义的
true结果,递归调用还会导致重复输出相同结果
正确实现
四个方向各写一个独立子句,逻辑最清晰,适合初学者理解:
% 上移:X减1,Y不变 move(X/Y, X1/Y) :- X1 is X - 1, between(1, 5, X1), white(X1/Y). % 下移:X加1,Y不变 move(X/Y, X1/Y) :- X1 is X + 1, between(1, 5, X1), white(X1/Y). % 左移:Y减1,X不变 move(X/Y, X/Y1) :- Y1 is Y - 1, between(1, 5, Y1), white(X/Y1). % 右移:Y加1,X不变 move(X/Y, X/Y1) :- Y1 is Y + 1, between(1, 5, Y1), white(X/Y1).
注:between(1,5,Var)是Prolog内置谓词,等价于Var >=1, Var =<5
测试验证
运行你给出的测试用例,结果完全符合预期:
?- move(5/2, NextState). NextState = 4/2 ; NextState = 5/1 ; NextState = 5/3 ; false.
内容的提问来源于stack exchange,提问作者Hyakkimaru
相关产品推荐
相关产品推荐

