4

「生成とテスト」を使用して、暗号算術パズルを解く 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([],[]) :-
    !.

しかし、バグがあり、見つけることができません...助けてもらえますか?

4

1 に答える 1

3

コードの問題は、2 番目の句で、remove/3削除されていないアイテムを保持していないことです。それは読むべきです:

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

SEND + MORE = MONEY でコードを試してみましたが、その手順を修正した後、問題なく動作しました。

しかし、ROB + BERT = NORES の解が見つかりませんでした...多くのソルバーを持っているこのサイトによると、方程式には解がありません。

于 2012-08-09T15:20:34.670 に答える