【问题标题】:Cryptarithmetic puzzle (Prolog)密码算术难题(Prolog)
【发布时间】:2012-08-09 11:48:56
【问题描述】:

我被要求编写一个 Prolog 代码来解决密码学难题,使用“生成和测试”。例如,我得到solve([R,O,B],[B,E,R,T],[N,O,R,E,S]),我需要为这些字母找到一个分配。 所以我写了这段代码:

sum(List1,List2,SumList) :-
    append(List1,List2,List3),
    append(List3,SumList,AllList),
    assign([0,1,2,3,4,5,6,7,8,9],AllList),
    add_zero(List1,List1Z),
    add_zero(List2,List2Z),
    add_zero(SumList,SumListZ),
    name(Num1,List1Z),
    name(Num2,List2Z),
    name(SumNum,SumListZ),
    SumNum is Num1+Num2,
    !.

remove(X,[X|Xs],Xs).
remove(X,[_|Ys],Res) :-
    remove(X,Ys,Res).

assign(Digits,[X|Tail]) :-
    nonvar(X),
    !,
    assign(Digits,Tail).
assign(Digits,[X|Tail]) :-
    remove(X,Digits,D1),
    assign(D1,Tail).
assign(_,[]) :-
    !.

add_zero([X|Tail1],[Y|Tail2]) :-
    !,
    Y is X+48,
    add_zero(Tail1,Tail2).
add_zero([],[]) :-
    !.

但是我有一个错误,我找不到它...你能帮帮我吗?

【问题讨论】:

  • 一个非常相关的问题:stackoverflow.com/questions/10925285/…
  • 您好,这是一个旧问题线程,但我在理解它时遇到了问题。 add_zero([X|Tail1],[Y|Tail2]) :- !,Y 是 X+48,add_zero(Tail1,Tail2)。为什么 Y 是 X+48 ? 'add_zero' 函数在这里有什么作用?你能帮我理解吗。谢谢。

标签: prolog cryptarithmetic-puzzle


【解决方案1】:

您的代码的问题在于,在remove/3 的第二个子句中,您没有保留未删除的项目。 它应该是:

remove(X,[Y|Ys],[Y|Res]):-
    remove(X,Ys,Res).

我使用 SEND + MORE = MONEY 尝试了您的代码,并且在修复该过程后它运行良好。

但是它没有找到 ROB + BERT = NORES 的解...根据this site,它有很多求解器,你的方程没有解。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多