このディレクトリの索引
#  
#  単位節から選択された引数リストの組合せ
#  
#  単位節から選択された引数リストの順列
#  

単位節組合せ(_単位節項,_射影項ならび,_条件,_組合せ数,X) :-
        単位節からならびへの射影(_単位節項,_射影項ならび,_条件,LL),
        組合せ(LL,_組合せ数,X).

単位節順列(_単位節項,_射影項ならび,_条件,_組合せ数,X) :-
        単位節からならびへの射影(_単位節項,_射影項ならび,_条件,LL),
        順列(LL,_組合せ数,X).

単位節からならびへの射影(_単位節項,_射影項ならび,_条件,LL) :-
        list(_射影項ならび),
        _単位節項=..[_|_引数ならび],
        findall(_射影項ならび,(
                    call((_単位節項,_条件))),
                LL).
単位節からならびへの射影(_単位節項,_射影項,_条件,LL) :-
        \+(list(_射影項)),
        _単位節項=..[_|_引数ならび],
        findall(_射影項,(
                    call((_単位節項,_条件))),
                LL).


%
%   単位節組合せ/4と単位節順列/4は高階述語である。
%   高階述語を使用する場合、引数変数の扱いに注意する必要がある。
%
%   射影項ならび、乃ちリストである場合はその要素は必ず単位節項の引数に含まれる必要がある。
%   リストでなく単体で射影項が指定された場合も同様である。
%


組合せ(L,1,[A]) :-
        member(A,L).
組合せ([A|R1],N,[A|R3]) :-
        N > 1,
        M is N - 1,
        組合せ(R1,M,R3).
組合せ([_|R1],N,L) :-
        N > 1,
        組合せ(R1,N,L).


順列(Y,0,_,[]).
順列(Y,N,EL,[A|X]) :-
        \+(member(A,EL)),
        del(Z = Y - A),
        M is N - 1,
        順列(Z,M,EL,X) .
順列(Y,N,EL,[_|X]) :-
        member(A,EL),
        順列(Z,M,EL,X).

順列(Y,0,[]).
順列(Y,N,[A|X]) :-
        N > 0,
        del(A,Y,Z),
        M is N - 1,
        順列(Z,M,X).

del(A,[A|X],X).
del(A,[B|X],[B|Y]) :-
        del(A,X,Y).