0

我正在尝试解决密码学问题(将数字分配给字母)

杰拉德 + 唐纳德 = 罗伯特

每个字母代表一个不同的数字(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),在那里你会找到一系列非常强大的工具来解决各种难题,但是你有一个非常简单的错误: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 回答