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

使用Prolog解决逻辑推理任务求助:万圣节服装分配问题

Prolog实现万圣节服装逻辑推理题

问题回顾

Bob、Mark、Alex三人选择幽灵(ghost)、僵尸(zombie)、狼人(werewolf)三种万圣节服装,需满足以下约束:

  1. Bob是三人中最高的
  2. 穿狼人服装的人比穿幽灵服装的人矮
  3. Alex不穿狼人服装
  4. 无人选择与自己名字同名的角色服装

Prolog实现代码

% 定义可选服装与身高排名(1=最高,3=最矮)
outfit(ghost).
outfit(zombie).
outfit(werewolf).
rank(1).
rank(2).
rank(3).

% 求解主函数,返回结构为 [bob(服装, 排名), mark(服装, 排名), alex(服装, 排名)]
solve(Solution) :-
    Solution = [bob(BobOutfit, BobRank), mark(MarkOutfit, MarkRank), alex(AlexOutfit, AlexRank)],
    
    % 条件1:Bob是最高的
    BobRank = 1,
    
    % 条件3:Alex不穿狼人服装
    AlexOutfit \= werewolf,
    
    % 条件4:无人选同名角色(若实际约束是首字母/其他关联,可在此修改规则)
    % 示例:若Bob不能选zombie、Mark不能选werewolf、Alex不能选ghost,取消以下注释:
    % BobOutfit \= zombie,
    % MarkOutfit \= werewolf,
    % AlexOutfit \= ghost,
    
    % 隐含约束:三人服装互不重复
    all_different([BobOutfit, MarkOutfit, AlexOutfit]),
    % 隐含约束:三人身高排名互不重复
    all_different([BobRank, MarkRank, AlexRank]),
    
    % 条件2:穿狼人的人比穿幽灵的人矮(排名数值越大,身高越矮)
    (   % 找到穿狼人的人,确认其排名大于穿幽灵的人的排名
        member(werewolf, [BobOutfit, MarkOutfit, AlexOutfit]),
        member(ghost, [BobOutfit, MarkOutfit, AlexOutfit]),
        find_rank(Solution, werewolf, WolfRank),
        find_rank(Solution, ghost, GhostRank),
        WolfRank > GhostRank
    ).

% 辅助函数:检查列表元素是否互不相同
all_different([]).
all_different([H|T]) :-
    \+ member(H, T),
    all_different(T).

% 辅助函数:根据服装查找对应人的排名
find_rank([bob(Outfit, R)|_], Outfit, R).
find_rank([mark(Outfit, R)|_], Outfit, R).
find_rank([alex(Outfit, R)|_], Outfit, R).
find_rank([_|T], Outfit, R) :-
    find_rank(T, Outfit, R).

代码解释

  1. 基础定义:先声明所有可选的服装类型和身高排名规则,用1代表最高,3代表最矮。
  2. 解决方案结构:用结构化列表存储每个人的服装选择和身高排名,便于后续约束校验。
  3. 约束映射:
    • 直接通过赋值满足条件1(Bob排名为1)。
    • 用不等号排除Alex选择狼人服装的可能,满足条件3。
    • 条件4若存在更具体的关联(比如首字母匹配),可在注释位置添加对应的排除规则。
    • 通过all_different确保服装和排名无重复,符合“三人选三种不同服装、身高排名唯一”的隐含逻辑。
    • 条件2通过查找穿狼人和幽灵的人的排名,验证狼人排名数值更大(即身高更矮)。

运行结果

在Prolog解释器中执行solve(S).,会得到唯一有效解:

S = [bob(ghost, 1), mark(werewolf, 2), alex(zombie, 3)]

验证该解完全符合所有约束:

  • Bob排名1(最高):满足条件1
  • 狼人(Mark,排名2)比幽灵(Bob,排名1)矮:满足条件2
  • Alex穿僵尸服装,未选狼人:满足条件3
  • 无人选择与自己名字同名的服装:满足条件4

内容的提问来源于stack exchange,提问作者Tempos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 11:45:29