このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1267796762/186
#  【課題 】ネストを用いて九九を出力するためのプログラムを2種類作成 
#  【 補足】出力画面は1行で1*1=1〜1*9、2行目は1*2=2〜9*2となるように表示するプログラムと(下は例)  
#  1*1=1  2*1=1  3*1=3 4*1=4  5*1=5  6*1=6    7*1=7   8*1=8  9*1=9 
#  1*2=2  2*2=2 3*2=6 4*2=8  5*2=10 6*2=12  7*2=14 8*2=16 9*2=18 
#  ・ 
#  1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 8*9=72 
#  1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9*=81 
#  もうひとつは下記みたいに数字が横3つごとにに出力されるプログラムです 
#  1*1=1          2*1=2      3*1=3 
#  1*2=2          2*2=4      3*2=6 
#  ・   ・    ・ 
#  1*8=8          2*8=16    3*8=24 
#  1*9=9          2*9=18    3*9=27   
#   
#  4*1=4          5*1=5      6*1=6 
#  4*2=8          5*2=10    6*2=12 
#  ・   ・    ・ 
#  4*8=32         5*8=40    6*8=48 
#  4*9=36         5*9=45    6*9=54 
#   
#  7*1=7          8*1=8      9*1=9 
#  ・   ・    ・ 
#  7*9=63         8*9=72    9*9=81 
#  行数の関係で・・と省略したところもありますが実際は・を省略せずに作成してください 
#  それではよろしくお願いします 
# 
# 

九九 :- 九九([_],[_]).

九九([a,a,a,a,a,a,a,a,a,a],_) :- !.
九九(L1,[a,a,a,a,a,a,a,a,a,a]) :-
        write('\n'),
        九九([a|L1],[a]),!.
九九(L1,L2) :-
        掛け算(L1,L2,LX),
        '式をN1*N2=N3で表現する'(L1,L2,LX,N1,N2,N3),
        九九(L1,[a|L2]).

掛け算(L1,L2,X) :- list(L1),list(L2),掛け算(L1,L2,[],X).

掛け算([],_,LX,LX) :- !.
掛け算([a|R1],L2,LY,LX) :-
        append(L2,LY,LY2),
        掛け算(R1,L2,LY2,LX).

'式をN1*N2=N3で表現する'(L1,L2,L3,N1,N2,N3) :-
        割り算(L1,[a,a,a,a,a,a,a,a,a,a],LM1),
        ならびによる数表現を数値文字列に変換(LM1,S1),
        割り算(L2,[a,a,a,a,a,a,a,a,a,a],LM2),
        ならびによる数表現を数値文字列に変換(LM2,S2),
        割り算(L3,[a,a,a,a,a,a,a,a,a,a],LM3),
        ならびによる数表現を数値文字列に変換(LM3,S3),
        writef('%t*%t=%2s ',[S1,S2,S3]),!.

割り算(L1,L2,L) :-
        list(L1),
        list(L2),
        割り算(L1,L2,[],[],L).

割り算([],_,_,U,U) :- !.
割り算(L1,L2,LD1,U,X) :-
        append(L2,R1,L1),
        割り算(R1,L2,[a|LD1],U,X).
割り算(LM,L2,LD,U,X) :-
        割り算(LD,L2,[],[LM|U],X).

ならびと数字の対応([],'0').
ならびと数字の対応([a],'1').
ならびと数字の対応([a,a],'2').
ならびと数字の対応([a,a,a],'3').
ならびと数字の対応([a,a,a,a],'4').
ならびと数字の対応([a,a,a,a,a],'5').
ならびと数字の対応([a,a,a,a,a,a],'6').
ならびと数字の対応([a,a,a,a,a,a,a],'7').
ならびと数字の対応([a,a,a,a,a,a,a,a],'8').
ならびと数字の対応([a,a,a,a,a,a,a,a,a],'9').

ならびによる数表現を数値文字列に変換([],'') :- !.
ならびによる数表現を数値文字列に変換([L|R],_数値文字列) :-
        ならびと数字の対応(L,S),
        ならびによる数表現を数値文字列に変換(R,_数値文字列2),
        concat_atom([S,_数値文字列2],_数値文字列).

九九_3 :- 九九([a],[a],[a,a,a,a],[a]).

九九([a,a,a,a,a,a,a,a,a,a],_,_,_) :- !.
九九(LK,L11,LK,L2) :-
        write('\n'),
        九九(L11,L11,LK,[a|L2]).
九九(L1,L11,LK,[a,a,a,a,a,a,a,a,a,a]) :-
        九九([a,a,a|L11],[a,a,a|L11],[a,a,a|LK],[a]),!.
九九(L1,L11,LK,L2) :-
        掛け算(L1,L2,LX),
        '式をN1*N2=N3で表現する'(L1,L2,LX,N1,N2,N3),
        九九([a|L1],L11,LK,L2).