2012-08-09 128 views
3

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

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([],[]) :- 
    !. 

但我有一个错误,我无法找到它......你能帮助我吗?

+2

一个非常密切相关的问题:http://stackoverflow.com/questions/10925285/faster-implementation-of-verbal-arithmetic-in-prolog – 2012-08-09 20:35:21

回答

2

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

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

我想你的代码SEND + MORE = MONEY,并修复该程序后运行良好。

然而,它没有找到解决方案ROB + BERT = NORES ...根据this site,其中有许多求解器,您的方程没有解决方案。

+1

有没有解决方案抢+ bert = nores:http://巴赫.istc.kobe-u.ac.jp/llp/crypt.html – Haile 2012-08-09 17:56:13

+1

@Haile:感谢您的链接。我改进了这个信息的答案... – gusbro 2012-08-09 18:20:25

+0

@gusbro谢谢! – Ygandelsman 2012-08-10 07:44:41