このディレクトリの索引
#  述語 全ての要素についてPである (引数の数は任意) を定義してください。
#  条件 第一引数には リストがきます。このリストの要素を全て満足する目標が
#       最後の引数Pとなります。
%
%  ?- 全ての要素についてPである([1,2,3],_要素,member(_要素,[2,2,4,1,3])).
%  _要素 = _1001
%  true
%  

全ての要素についてPである([],_,_).
全ての要素についてPである([_要素|R],_要素,P) :-
        項複写((_要素,P),(_要素1,P1)),
        call_P(P),
        全ての要素についてPである(R,_要素1,P1).

call_P(P) :- call(P),!.

% *** user: 項複写 / 6 ***

項複写(M,N,P,P1,VarList,VarList) :-
        M > N,!.
項複写(M,N,P,P1,VarList1,VarList2) :-
        arg(M,P,T),
        arg(M,P1,T1),
        項複写(T,T1,VarList1,VarList3),
        M1 is M + 1,
        項複写(M1,N,P,P1,VarList3,VarList2),!.

% *** user: 項複写 / 4 ***

項複写(P,P1,VarList1,VarList2) :-
        struct(P),
        functor(P,F,A),
        functor(P1,F,A),
        項複写(1,A,P,P1,VarList1,VarList2),!.
項複写(P,P1,VarList1,[(P,P1)|Varlist2]) :-
        var(P),
        変数リストの更新(P,P1,VarList1,VarList2),!.
項複写(P,P1,VarList,VarList) :-
        \+(var(P)),
        atom_to_term(P,Q,_),
        \+(P == Q),
        sprintf(%q,[P],P1),!.
項複写(P,P,Varlist,VarList).

% *** user: 項複写 / 2 ***

項複写(_項1,_項2) :-
        項複写(_項1,_項2,[],VarList),!.

% *** user: 変数リストの更新 / 4 ***

変数リストの更新(P1,P2,[],[]) :- !.
変数リストの更新(P1,P2,[(V1,V2)|R3],[(V1,V2)|R4]) :-
        V1 == P1,
        V2 = P2,
        変数リストの更新(P1,P2,R3,R4),!.
変数リストの更新(P1,P2,[(V1,V2)|R3],[(V1,V2)|R4]) :-
        \+(V1 == P1),
        変数リストの更新(P1,P2,R3,R4),!.