0

暗号化(文字に数字を割り当てる)の問題を解決しようとしています

GERALD + DONALD = ROBERT

各文字は異なる数字(0から9の間)を表します。各単語の最初の文字は、0とは異なる数字を表します。

問題 :

ソフトウェアはエラーを表示せず、解決策も表示しません。

    %values between 0 and 9
valeur(0).
valeur(1).
valeur(2).
valeur(3).
valeur(4).
valeur(5).
valeur(6).
valeur(7).
valeur(8).
valeur(9).

%values between 1 and 9
valeur2(1).
valeur2(2).
valeur2(3).
valeur2(4).
valeur2(5).
valeur2(6).
valeur2(7).
valeur2(8).
valeur2(9).

%on définit des valeurs de 0 à 1
valeur3(0).
valeur3(1).

%definition of the sum rule and its equation
somme(RE,X,Y,Z,RS) :- C is RE+X+Y,D is Z+(10*RS),C is D.

%the predicate "solution" will be called for the execution
solution([G,E,R,A,L,D,O,N,B,T]) :- valeur2(R),
valeur2(G),
valeur(E),
valeur(A),
valeur(L),
valeur2(D),
valeur(O),
valeur(N),
valeur(B),
valeur(T),

%on ajoute la contraintes de différence 2 à 2
    G=\=E,
    R=\=E,R=\=G,
    A=\=E,A=\=G,A=\=R,
    L=\=E,L=\=G,L=\=R,L=\=A,
    D=\=E,D=\=G,D=\=R,D=\=A,D=\=L,
    O=\=E,O=\=G,O=\=R,O=\=A,O=\=L,O=\=D,
    N=\=E,N=\=G,N=\=R,N=\=A,N=\=L,N=\=D,N=\=O,
        B=\=E,B=\=G,B=\=R,B=\=A,B=\=L,B=\=D,B=\=O,B=\=N,
        T=\=E,T=\=G,T=\=R,T=\=A,T=\=L,T=\=D,T=\=O,T=\=N,T=\=B,
%-------------------------
valeur3(R5),
valeur3(R4),
valeur3(R3),
valeur3(R2),    
valeur3(R1),

somme(R1,G,D,R,0),
somme(R2,E,O,O,R1),
somme(R3,R,N,B,R2),
somme(R4,A,A,E,R3),
somme(R5,L,L,R,R4),
    somme(0,D,D,T,R5),

    gerald =:= 100000*D+10000*O+1000*N+100*A+10*L+D,
donald =:= 100000*G+10000*E+1000*R+100*A+10*L+D,
    robert =:= 100000*R+10000*O+1000*B+100*E+10*R+T,
robert =:= gerald + donald.
4

2 に答える 2

1

Anniepoo は、CLP(FD) を使用することを提案しています。CLP(FD) では、あらゆる種類のパズルに対してさまざまな非常に強力なツールが見つかりますが、非常に単純なエラーがあります。Prolog では変数を大文字にする必要があり、コードはここで失敗します。

....
gerald =:= 100000*D+10000*O+1000*N+100*A+10*L+D,
donald =:= 100000*G+10000*E+1000*R+100*A+10*L+D,
robert =:= 100000*R+10000*O+1000*B+100*E+10*R+T,
robert =:= gerald + donald.

代わりに試す

Gerald =:= 100000*D+10000*O+1000*N+100*A+10*L+D,
Donald =:= 100000*G+10000*E+1000*R+100*A+10*L+D,
Robert =:= 100000*R+10000*O+1000*B+100*E+10*R+T,
Robert =:= Gerald + Donald.

注意してください、私はそれをテストしませんでした...タスクを説明するときに変数を使用し(GERALD + DONALD = ROBERT)、実際のコードでそれらを忘れたことは注目に値します!

編集

申し訳ありませんが、試してみましたが、コードを適応させるソリューションを得ることができませんでした。生成とテストが遅すぎると思います。

制約を「手で」調整して早期にフィルタリングしましたが、役に立ちませんでした。ここで、中央の述語からのいくつかの行を見てみましょう。「以前にフィルタする」という意味がわかります...

solution([G,E,R,A,L,D,O,N,B,T]) :-
    valeur2(G),
    valeur(E),
    G\=E,
    valeur2(R),
    R\=E,R\=G,
    valeur(A),
    A\=E,A\=G,A\=R,
    valeur(L),
    L\=E,L\=G,L\=R,L\=A,
    valeur2(D),
    D\=E,D\=G,D\=R,D\=A,D\=L,

    valeur3(R1),
    somme(R1,G,D,R,0),
    ...

ここでは、最初の桁の制約を省略した CLP(FD) ソリューションとタイミングを示します。本当に簡単...

solution([G,E,R,A,L,D], [D,O,N,A,L,D], [R,O,B,E,R,T]) :-
    Vs = [G,E,R,A,L,D,O,N,B,T],
    Vs ins 0..9,
    all_different(Vs),
    maplist(mknum,
        [ Gerald,        Donald,        Robert ],
        [[G,E,R,A,L,D], [D,O,N,A,L,D], [R,O,B,E,R,T]]),
    Gerald + Donald #= Robert,
    label(Vs).

mknum(N, [A,B,C,D,E,F]) :- N #= 100000 * A + 10000 * B + 1000 * C + 100 * D + 10 * E + F.

私は得る:

?- time(solution(X,Y,Z)).
% 6,138,531 inferences, 2,482 CPU in 2,484 seconds (100% CPU, 2473552 Lips)
X = [1, 9, 7, 4, 8, 5],
Y = [5, 2, 6, 4, 8, 5],
Z = [7, 2, 3, 9, 7, 0] ;
% 18,267,270 inferences, 7,311 CPU in 7,319 seconds (100% CPU, 2498725 Lips)
false.
于 2012-11-17T22:45:24.177 に答える
-1

文字を変更する以外に、このパズルはで解決されます

https://github.com/Anniepoo/prolog-examples/blob/master/sendmoremoney.pl

于 2012-11-17T22:25:17.843 に答える