Prolog を使用して、宿題の一般的な暗号算術パズルを解いています。これについては、 のコンテキストで説明しSEND + MORE = MONEY
ます。
私の教授が私にくれた部分的なコードは、3 つの入力リスト、つまり[S,E,N,D]
、[M,O,R,E]
を[M,O,N,E,Y]
一意の変数リスト 、つまりに減らします[S,E,N,D,M,O,R,Y]
。削減されたリストの各変数に 0 から 9 までの一意の値を再帰的に割り当てるところまで到達しました。
私の質問は、縮小されたリストの値を 3 つの入力リストのそれぞれの値に再割り当てするにはどうすればよいですか? 私のコードは次のとおりです。
solve_expression(L1,L2,L3) :-
variables(L1,L2,L3,L),
bind(L).
bind(L) :-
assign_members(L,[0,1,2,3,4,5,6,7,8,9]),
is_unique(L).
assign_members([],L) :-
is_unique(L).
assign_members([H|T],L) :-
member(H,L),
assign_members(T,L).
is_unique([H|T]) :-
unique(H,T),
is_unique(T).
is_unique([]).
/** professor's code below */
unique(_,[]).
unique(X,[Y|Z]) :-
X \== Y,
unique(X,Z).
merge([],L,L).
merge([X|Y],Z,[X|L]) :-
unique(X,Z),
!,
merge(Y,Z,L).
merge([_|Y],Z,L) :-
merge(Y,Z,L).
variables(A,B,C,V) :-
merge(A,B,W),
merge(C,W,V).
これは宿題のためであることを覚えておいてください。答えを探しているわけではありません。これをどのように達成できるかについてのヒントです. また、私は Prolog を約 1 週間しか使用していません。
ありがとうございました!