このディレクトリの索引

#  FizzBuzzは有名問題すぎるので良くないという話があったので、
#  じゃあちょっと問題を変えて、
#  x1..xnとnを入力にとり、xiのいずれかで割り切れる自然数のうち
#  小さいものからn番目の数を出力とかどうだろう。

'x1..xnとnを入力にとり、xiのいずれかで割り切れる自然数のうち小さいものからn番目の数を出力する'(XL,_n) :-
        'XLの何れかで割り切れる自然数のうち小さいものからn番目の数'(XL,_n,_n番目の数),
        'n番目の数を出力する'(_n,_n番目の自然数).

'XLの何れかで割り切れる自然数のうち小さいものからn番目の数'(XL,_n,_n番目の自然数) :-
        length([_n番目の数|R],_n),
        'XLの任意の要素で割り切れる自然数ならびを要素数nまで成長させる'(XL,1,[],[_n番目の自然数|R]),!.

'XLの任意の要素で割り切れる自然数ならびを要素数nまで成長させる'(_,_,L,L) :- !.
'XLの任意の要素で割り切れる自然数ならびを要素数nまで成長させる'(XL,M,L1,L) :-
        'MはXLの任意の要素で割り切れる'(M,XL),
        M2 is M + 1,
        'XLの任意の要素で割り切れる自然数ならびを要素数nまで成長させる'(XL,M2,[M|L1],L).
'XLの任意の要素で割り切れる自然数ならびを要素数nまで成長させる'(XL,M,L1,L) :-
        M2 is M + 1,
        'XLの任意の要素で割り切れる自然数ならびを要素数nまで成長させる'(XL,M2,L1,L).

'NはXLの任意の要素で割り切れる'(N,[M|R]) :- 0 is N mod M,!.
'NはXLの任意の要素で割り切れる'(N,[_|R]) :-
        'NはXLの任意の要素で割り切れる'(N,R).

'n番目の数を出力する'(_n,_n番目の自然数) :-
        writef('%t番目の自然数は %t です\n',[_n,_n番目の自然数]),!.