このディレクトリの索引
#  
#  Prologデータベースを使い失敗駆動で素数を求める。
#  'm以下の素数'/2は非決定性。全解を得るにはfindall/3を使う。
#  


:- dynamic('$1'/1).

'm以下の素数'(_m,_素数) :-
        abolish('$1'/1),
        素数候補をデータベースに登録(_m),
        '$1'(N),
        '$1'(M),
        'm以下の素数'(M,N,_素数).

'm以下の素数'(N,N,N).
'm以下の素数'(M,N,_) :-
        'MがNで割り切れたらデータベースから削除'(M,N),
        fail.

'MがNで割り切れたらデータベースから削除'(M,N) :-
        0 is M mod N,
        retract('$1'(M)),!.

素数候補をデータベースに登録(_m) :-
        for(2,N,_m),
        assertz('$1'(N)),
        N = _m.


'm以下の素数をすべてリストに得る'(_m,L) :-
        findall(_素数,'m以下の素数'(_m,_素数),L).