You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 14:36:06