このディレクトリの索引

'SEND + MORE = MONEY'(S,E,N,D,M,O,R,E,M,O,N,E,Y) :-
覆面に数字を当てはめる([S,E,N,D,M,O,R,Y],[1,2,3,4,5,6,7,8,9,0]),
演算は整合する(S,E,N,D,M,O,R,Y).

演算は整合する(S,E,N,D,M,O,R,Y) :-
繰り上がり足し算(D,E,0,_繰り上がり_1,Y),
繰り上がり足し算(N,R,_繰り上がり_1,_繰り上がり_2,E),
繰り上がり足し算(E,O,_繰り上がり_2,_繰り上がり_3,N),
繰り上がり足し算(S,M,_繰り上がり_3,M,O).

覆面に数字を当てはめる([],_).
覆面に数字を当てはめる([V|R1],_数字ならび) :-
'Vが変数の場合は新たな数字を整数の場合はそれを利用'(V,_数字ならび,_残り数字ならび),
覆面に数字を当てはめる(R1,_残り数字ならび).

'Vが変数の場合は新たな数字を整数の場合はそれを利用'(V,_数字ならび,_数字ならび) :-
'Vが整数の場合はそれを利用'(V).
'Vが変数の場合は新たな数字を整数の場合はそれを利用'(V,_数字ならび,_残り数字ならび) :-
'Vが変数の場合は新たな数字を'(V,_数字ならび,_残り数字ならび).

'Vが整数の場合はそれを利用'(V) :-
integer(V).

'Vが変数の場合は新たな数字を'(V,_数字ならび,_残り数字ならび) :-
var(V),
select(V,_数字ならび,_残り数字ならび).


繰り上がり足し算(A,B,C,E,F) :-
D is A + B + C,
E is D // 10,
F is D mod 10.