Prolog实现7球称重问题搜索空间时查询返回false问题排查
问题核心原因
- 致命错误:
statechange谓词的参数误用了小写原子left、right。Prolog中小写开头的标识符属于常量原子,你写的规则强制要求第二个参数必须等于原子left、第三个参数必须等于原子right,但查询时传入的第二、第三个参数是球编号列表,完全无法匹配,自然返回false。 - 逻辑优化点:称重结果应该单独作为独立参数,不要和左右侧球列表的变量名混淆,避免后续逻辑混乱。
修正后的完整代码
% 原有测试正常的辅助谓词保留 isMember([A|_],A). isMember([_|X],A):- isMember(X,A). removeOrderedList(X,[],X). removeOrderedList([B|X], [A|Y], [B|Z]):- removeOrderedList(X, [A|Y], Z). removeOrderedList([A|X], [A|Y], Z):- removeOrderedList(X, Y , Z). % 修正参数定义:左右侧球列表改为大写变量Left/Right,新增WeighResult参数表示称重结果(left=左重/right=右重/balance=平衡) statechange(Secret, Left, Right, _, WeighResult, Left):- WeighResult = left, isMember(Left,Secret), !. statechange(Secret, Left, Right, _, WeighResult, Right):- WeighResult = right, isMember(Right,Secret), !. statechange(_, Left, Right, X, WeighResult, N):- WeighResult = balance, removeOrderedList(X,Left,Inter), removeOrderedList(Inter,Right,N).
测试用例
左重场景(异常球1在左侧)
查询语句:statechange(1,[1,2,3,4],[5,6,7,8],[1,2,3,4,5,6,7,8,9,10], left, A).
返回结果:A = [1,2,3,4],符合预期。
平衡场景(异常球不在左右侧)
查询语句:statechange(9,[1,2,3,4],[5,6,7,8],[1,2,3,4,5,6,7,8,9,10], balance, A).
返回结果:A = [9,10],符合预期。
内容的提问来源于stack exchange,提问作者Lin
相关产品推荐
相关产品推荐

