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

AM+PM=DAY密码算术谜题Prolog代码输出格式优化求助

解决AM + PM = DAY密码算术谜题的Prolog输出格式问题

我懂你已经把约束求解的核心逻辑搞定了,就差最后一步把结果输出成你要的格式对吧?其实只需要在变量绑定成功后,加上格式化输出的代码就行,下面给你两种实用的方案:

方案一:直接在求解谓词里集成输出

修改后的代码会在找到解后自动打印符合要求的格式:

:- use_module(library(clpfd)).

puzzle :-
    % 定义变量与约束条件
    Vars = [A,P,M,D,Y], 
    Vars ins 0..9, 
    all_different(Vars), 
    A*10 + M + P*10 + M #= D*100 + A*10 + Y, 
    A #\= 0, P #\= 0, D #\= 0, 
    % 绑定变量到具体数值
    label([A,P,M,D,Y]),
    % 格式化输出指定格式的结果
    format('A = ~w, M = ~w, P = ~w, D = ~w, Y = ~w, [~w,~w]+[~w,~w]=[~w,~w,~w];~n', 
           [A,M,P,D,Y,A,M,P,M,D,A,Y]).

运行方式:在Prolog解释器里输入puzzle.,就会输出所有符合条件的解,每个解的格式都和你给出的示例完全一致。

方案二:模块化分离求解与输出

如果你想保留原有的求解逻辑,单独处理输出流程,这个方案会更灵活:

:- use_module(library(clpfd)).

% 原有的求解谓词,专注于约束定义与变量绑定
puzzle([A,M] + [P,M] = [D,A,Y]) :- 
    Vars = [A,P,M,D,Y], 
    Vars ins 0..9, 
    all_different(Vars), 
    A*10 + M + P*10 + M #= D*100 + A*10 + Y, 
    A #\= 0,P #\= 0, D #\= 0, 
    label([A,P,M,D,Y]).

% 专门的打印谓词,遍历所有解并格式化输出
print_puzzle_solutions :-
    puzzle(Solution),
    % 从解结构中提取各个变量
    Solution = [A,M] + [P,M] = [D,A,Y],
    % 生成指定格式的输出字符串
    format('A = ~w, M = ~w, P = ~w, D = ~w, Y = ~w, [~w,~w]+[~w,~w]=[~w,~w,~w];~n', 
           [A,M,P,D,Y,A,M,P,M,D,A,Y]),
    fail. % 触发回溯,继续寻找下一个解
print_puzzle_solutions. % 所有解打印完成后,成功终止程序

运行方式:输入print_puzzle_solutions.,同样会输出所有符合要求的结果。

关键说明

原代码里的label/1只是把变量绑定到具体数值,但不会自动生成你要的格式。我们用Prolog的format/2谓词来实现格式化输出:

  • ~w是通用格式占位符,会依次替换成后面列表里的变量值
  • 格式字符串完全按照你给的示例拼接,确保输出样式完全符合要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:32:10