我正在尝试解决加密问题(将数字分配给字母)
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.
答案 0 :(得分: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.
答案 1 :(得分:-1)
除了改变字母外,这个谜题已经解决了
https://github.com/Anniepoo/prolog-examples/blob/master/sendmoremoney.pl