我使用Eclipse与Swipl。代码试图解决此
d o s
+ d o s
+ t r e s
= s i e t e
生成输出:
?- criptograma(L).
L = [[s, 3], [e, 9], [o, 2], [t, 7], [d, 4], [r, 5], [i, 8]]
而不是正确的答案
我在哪里错了?:(
我有一些指向。
1.您不必定义volteaL
您只能使用reverse
?- reverse([a,b,c],R).
R = [c, b, a].
2.您不必致电member(R1,L), eliminaElement(R1,L,L2)
只需使用选择/3
?- select(Selection,[0,1,2],Rest).
Selection = 0,
Rest = [1, 2] ;
Selection = 1,
Rest = [0, 2] ;
Selection = 2,
Rest = [0, 1] ;
- 似乎您忽略了三个数字的案例总和超过20。
ex:9+8+7=24.
我认为这是关键的部分。
4.此信息是多余的,但是您可以使用CLPFD更容易解决此问题(请参见下文(。我在2个端口中编写了此代码。
:-use_module(library(clpfd)).
solve([D,O,S,T,R,E,I]):-
[D,O,S,T,R,E,I] ins 0..9,
all_different([D,O,S,T,R,E,I]),
100*D + 10*O + S +
100*D + 10*O + S +
1000*T + 100*R + 10*E + S #=
10000*S + 1000*I + 100*E + 10*T + E,
D #> 0,
T #> 0,
S #> 0,
labeling([ffc],[D,O,S,T,R,E,I]).
测试:
?- solve([D,O,S,T,R,E,I]).
D = 5,
O = 8,
S = 1,
T = 9,
R = 2,
E = 3,
I = 0 ;
false.