1

Prolog の clfpd ライブラリを使用した暗号演算パズル ソルバーの例をいくつか見てきました。たとえば、AM + PM = DAY というパズルがある場合、A*10+M + P*10+M = D*100+A*10+Y のように、0 から 9 までのさまざまな値のセットをさまざまなアルファベットに割り当てることができます。 . 私はそれの一般化されたバージョンを書こうとしています。私は Prolog や clfpd の経験がほとんどないことに注意してください。

入力に基づいて制約を生成するつもりです。たとえば、A*10+M + P*10+M = D*100+A*10+Y は、入力 puzzle1([A,M]+[P,M]=[D,A,Y] に基づいて生成されます。 ]))。しかし、私はそれを行う方法がわかりません。入力に基づいて制約を作成する Prolog 関数 (convert と呼ばれる) を作成しました。しかし、それは機能せず、エラーが発生し続けます

clpfd_expression' expected, found `convert([_818,_894])
:- use_module(library(clpfd)).
%calculate correct multiplier
%For example if AM, multipler of A is 10 and of M is 1 
multiple(1,10). 
multiple(N,F) :-  
    N#>0, 
    N1 #= N-1, 
    multiple(N1,F1), 
    F #= 10 * F1.
%convert accepts input as a list. For instance [A,M]
%outputs a constraint of the form A*10 + M*1
convert([H|T], Ans):-
    length(T, Len),
    Len #= 0,
    Ans #= H * 1.

convert([H|T], Ans):-
    length([H|T], Len1),
    Len2 #= Len1-1,
    multiple(Len2,Multiplier),
    convert(T, Ans1),
    Ans #= Ans1 + H * Multiplier.

%add should imply constraint A*10+M+P*10+M=D*100+A*10+Y.
add(Exp1, Exp2, Exp3):-
    Exp1 + Exp2 #= Exp3.

puzzle1(As + Bs = Cs) :- 
   append([As,Bs,Cs],Ds),
   term_variables(Ds,Var),   %% this will get all Var
   Var ins 0..9, 
   all_different(Var), 
   Exp01 #= convert(As),
   Exp02 #= convert(Bs),
   Exp03 #= convert(Cs),
   add(Exp01, Exp02, Exp03),
   %add constraint first member of each list cant be asigned a value 0
   As #= [H1|_],
   Bs #= [H2|_],
   Cs #= [H3|_],
   H1 #\=0,
   H2 #\=0,
   H3 #\=0.

誰かが私を正しい方向に導くことができますか.

4

2 に答える 2