このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1284632294/642
#  [1] 授業単元:プログラミング実習 
#  [2] 問題文(含コード&リンク):以下の式が成り立つように英字に数字をあてはめよ。 
#  ただし同じ英字には同じ数字が当てはまる。 
#    send 
#  +)more 
#  ------ 
#   money 
#  

'以下の式(send+more=money)が成り立つように英字に数字をあてはめよ。ただし同じ英字には同じ数字が当てはまる。'(_数1,_数2,_数3) :-
        abolish(アルファベット数値対応/2),
        アルファベットを得る([send,more,money],_アルファベット),
        アルファベット対応数値候補表の定義(_アルファベット),
        語彙に対応する数を得る(send,_数1),
        語彙に対応する数を得る(more,_数2),
        語彙に対応する数を得る(money,_数3),
        _数3 is _数1 + _数2.

アルファベット対応数値候補表の定義(_アルファベット) :-
        append(_,[_文字|R],_アルファベット),
        for(0,N,9),
        assertz(アルファベット数値対応(_文字,N)),
        R = [],!.

語彙に対応する数を得る(_語彙,_数) :-
        atom_chars(_語彙,_文字ならび),
        アルファベットを基礎に数のならびを得る(_文字列ならび,_数ならび),
        数字ならびから10進数を得る(_数ならび,_,_数).

アルファベットを基礎に数のならびを得る([],[]) :- !.
アルファベットを基礎に数のならびを得る([A|R1],[N|R2]) :-
        アルファベット数値対応(A,N),
        アルファベットを基礎に数のならびを得る(R1,R2).

数字ならびから10進数を得る([N],0,N) :- !.
数字ならびから10進数を得る([M|R],J,N) :-
        数字ならびから10進数を得る(R,J1,N1),
        J is J1 + 1,
        N is M * truncate(10 ^ J1) + N1.

アルファベットを得る(_語彙ならび,_アルファベット) :-
        concat_atom(_語彙ならび,S),
        atom_hcars(S,Chars),
        setof(_文字,member(_文字,Chars),_アルファベット).