我被要求使用“生成和测试”编写一个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([],[]) :-
!.
但是我有一个错误,我找不到它......你能帮助我吗?
答案 0 :(得分:3)
您的代码存在的问题是,在remove/3
的第二个条款中,您没有保留未删除的项目。
它应该是:
remove(X,[Y|Ys],[Y|Res]):-
remove(X,Ys,Res).
我使用SEND + MORE = MONEY尝试了您的代码,并且在修复该过程后它运行正常。
然而它没有找到ROB + BERT = NORES的解决方案......根据具有许多求解器的this site,你的等式没有解。