このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1354393458/650
#  
#  81以下の自然数で九九に現れない数を昇順にすべて表示せよ。
#  

'81以下の自然数で九九に現れない数を昇順にすべて表示せよ。' :-
        '81以下の自然数ならび'(_81以下の自然数ならび),
        '81以下の自然数で九九に現れない数を昇順にすべて'([_],[_],_81以下の自然数ならび,_81以下の自然数で九九に現れない数ならび),
        '表示せよ。'(_81以下の自然数で九九に現れない数ならび).

'81以下の自然数ならび'(_81以下の自然数ならび) :-
        findall(_数,between(1,81,_数),_81以下の自然数ならび).

'81以下の自然数で九九に現れない数を昇順にすべて'([_,_,_,_,_,_,_,_,_],[_,_,_,_,_,_,_,_,_,_],_81以下の自然数で九九に現れない数ならび,_81以下の自然数で九九に現れない数ならび).
'81以下の自然数で九九に現れない数を昇順にすべて'(Ln1,[_,_,_,_,_,_,_,_,_,_],L1,L) :-
        '81以下の自然数で九九に現れない数を昇順にすべて'([_|Ln1],[_],L1,L).
'81以下の自然数で九九に現れない数を昇順にすべて'(Ln1,Ln2,L1,L) :-
        九九に現れる数を削除(Ln1,Ln2,L1,L2),
        '81以下の自然数で九九に現れない数を昇順にすべて'(Ln1,[_|Ln2],L2,L).

九九に現れる数を削除(Ln1,Ln2,L1,L2) :-
        ならびの要素数表現を数表現に変換(Ln1,Ln2,_数_1,_数_2),
        _九九に現れる数 is _数_1 * _数_2,
        数をL1から削除してL2とする(_九九に現れる数,L1,L2),!.
九九に現れる数を削除(_,_,L,L).

ならびの要素数表現を数表現に変換(Ln1,Ln2,_数_1,_数_2) :-
        length(Ln1,_数_1),
        length(Ln2,_数_2).

数をL1から削除してL2とする(_数,L1,L2) :-
        append(L0,[_数|R],L1),
        append(L0,R,L2).

'表示せよ。'(_81以下の自然数で九九に現れない数ならび) :-
        atomic_list_concat(_81以下の自然数で九九に現れない数ならび,' ',_表示文字列),
        writef('%t\n',[_表示文字列]).