このディレクトリの索引

#  御題 
#  
#  1から100までの数を出力するプログラムを書け。 
#  ただしフィボナッチ数列に現れる数のときは数の代わりに 'Fib' と、 
#  素数のときは 'Prime' と出力し、 
#  フィボナッチ数列に現れて且つ素数の場合には 'FibPrime' と出力すること。 
#  また出力先は'fibprime.bz2'というファイル名のbzip2圧縮形式ファイルとする。


'1から100までの数を出力するプログラムを書け。
ただしフィボナッチ数列に現れる数のときは数の代わりに \'Fib\' と、
素数のときは \'Prime\' と出力し、
フィボナッチ数列に現れて且つ素数の場合には \'FibPrime\' と出力すること。' :-
        '100以下のフィボナッチ数列を得る'(_100以下のフィボナッチ数ならび),
        '100以下の素数を得る'(_100以下の素数ならび),
        between(1,100,_数),
        'フィボナッチ数列に現れる数のときは数の代わりに \'Fib\' と、素数のときは \'Prime\' と出力し、フィボナッチ数列に現れて且つ素数の場合には \'FibPrime\' と出力すること。'(_数,_100以下のフィボナッチ数ならび,_100以下の素数ならび,L),
        'Nが100になるまで出力する'(_数,L).

'フィボナッチ数列に現れる数のときは数の代わりに \'Fib\' と、素数のときは \'Prime\' と出力し、フィボナッチ数列に現れて且つ素数の場合には \'FibPrime\' と出力すること。'(_数,_100以下のフィボナッチ数ならび,_100以下の素数ならび,L) :-
        'フィボナッチ数列に現れる数のときは数の代わりに \'Fib\' と'(_数,_100以下のフィボナッチ数ならび,L),
        '素数のときは \'Prime\' と'(_数,_100以下の素数ならび,L),
        それ以外の場合は数を(_数,L).

'フィボナッチ数列に現れる数のときは数の代わりに \'Fib\' と'(_数,_100以下のフィボナッチ数ならび,['Fib',_,_]) :-
        member(_数,_100以下のフィボナッチ数ならび),!.
'フィボナッチ数列に現れる数のときは数の代わりに \'Fib\' と'(_,_,['',_,_]).

'素数のときは \'Prime\' と'(_数,_100以下の素数ならび,[_,'Prime',_]) :-
        member(_数,_100以下の素数ならび),!.
'素数のときは \'Prime\' と'(_,_,[_,'',_]).

それ以外の場合は数を(_数,['','',_数]) :- !.
それ以外の場合は数を(_,[_,_,'']).

'100以下のフィボナッチ数列を得る'(L) :-
        '100以下のフィボナッチ数列'([1,0],L).

'100以下のフィボナッチ数列'([B,A|R],L) :-
        C is A + B,
        C =< 100,
        '100以下のフィボナッチ数列'([C,B,A|R],L),!.
'100以下のフィボナッチ数列'(L,L).

'100以下の素数を得る'(L) :-
        findall(N,(
                    between(1,100,N),
                    素数である(N)),
                L).

素数である(1) :- !.
素数である(X) :-
        X > 0,
        Y is X - 1,
        階乗(Y,Z),
        0 is (Z + 1) mod X.

階乗(_n,X) :-
        findall(M,between(1,_n,M),L),
        atomic_list_concat(L,*,S),
        atom_to_term(S,_式,_),
        X is _式.

'Nが100になるまで出力する'(N,L) :-
        atomic_list_concat(L,_表示文字列),
        writef('%w ',[_表示文字列]),
        N = 100.