密码算术拼图(Prolog)

密码算术拼图(Prolog),prolog,cryptarithmetic-puzzle,Prolog,Cryptarithmetic Puzzle,我被要求编写一个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

我被要求编写一个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([],[]) :-
    !.

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

你的代码的问题是,在
删除/3
的第二条中,你没有保留未删除的项目。 应改为:

remove(X,[Y|Ys],[Y|Res]):-
    remove(X,Ys,Res).
我用SEND+MORE=MONEY尝试了您的代码,在修复该过程后,它运行良好


然而,它并没有为ROB+BERT=NORES找到解决方案。。。根据有许多解算器的,你的方程没有解。

rob+bert=nores没有解:一个非常密切相关的问题:您好,这是一个老问题,但我在理解它时遇到了一个问题。加零([X | Tail1],[Y | Tail2]):-!,Y为X+48,加0(尾1,尾2)。为什么Y是X+48?“add_zero”函数在这里做什么?你能帮我理解吗。非常感谢。