与eclipse的Prolog算法

时间:2018-04-03 09:33:26

标签: prolog

我使用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 个答案:

答案 0 :(得分:1)

我有一些指示。

1.您不必定义volteaL您可以使用reverse

?- reverse([a,b,c],R).
R = [c, b, a].

2.您不必拨打member(R1,L), eliminaElement(R1,L,L2)只需使用select / 3

?- select(Selection,[0,1,2],Rest).
Selection = 0,
Rest = [1, 2] ;
Selection = 1,
Rest = [0, 2] ;
Selection = 2,
Rest = [0, 1] ;
  1. 好像你忽略了三个数字的总和超过20的情况。 ex:9+8+7=24.我认为这是至关重要的部分。
  2. 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.