このディレクトリの索引
%
% ユーザインターフェイス述語は findmax/3 です。
%
% findmax/3 は集約述語である。findall/3の感覚で第一引数に指定した項の最大値を第三引数に得る。
% 

% *** user: findmax / 3 ***
findmax(V,P,Max) :-
        findall(V,P,L),
        max(L,Max).

% *** user: findmax / 5 ***
findmax([],P,V,P,V) :- !.
findmax([[P,V]|R1],P1,V1,_最大項,_最大値) :-
        number(V),
        number(V1),
        !,
        V >= V1,
        findmax(R1,P,V,_最大項,_最大値).
findmax([[P,V]|R1],P1,V1,_最大項,_最大値) :-
        number(V),
        number(V1),
        !,
        V < V1,
        findmax(R1,P1,V1,_最大項,_最大値).
findmax([[P,V]|R1],P1,V1,_最大項,_最大値) :-
        V @>= V1,
        findmax(R1,P,V,_最大項,_最大値).
findmax([[P,V]|R1],P1,V1,_最大項,_最大値) :-
        V @< V1,
        findmax(R1,P1,V1,_最大項,_最大値).

% *** user: findmax / 4 ***
findmax(_集約項,_項,_最大項,_最大値) :-
        findall([_項,_集約項],_項,_値ならび),
        _値ならび = [[P,V]|R],
        findmax(_値ならび,P,V,_最大項,_最大値).

% *** user: max / 2 ***
max([A|R],X) :-
        max_1(R,A,X) .

% *** user: max_1 / 3 ***
max_1([],X,X) :-
        !.
max_1([A|R],B,X) :-
        A @> B,
        !,
        max_1(R,A,X).
max_1([_|R],A,X) :-
        max_1(R,A,X).