findmin/3 の定義


findmin/3という述語が出てきますが、定義が載っていませんでした。この定義を教えてください。  
findmin/3は、第二引数を非決定性でcallを実行し、その時点の第一引数項をリストに収集した上でその中の最小値を第三引数に単一化する、というものの筈です。

[code]

    チーム(1,巨人).  
    チーム(2,阪神).  
    チーム(3,中日).  
    
    選手(1,1,阿部,10).   
    選手(2,1,杉内,18).  
    選手(3,2,金本,6).  
    選手(4,2,鳥谷,1).  
    選手(5,3,岩瀬,13).  
    選手(6,3,谷繁,27).   
    
    各チームから背番号最少の選手を抽出する(_チーム,_選手名,_チーム最小背番号) :-  
    チーム(_チームID,_チーム),  
    findmin([_背番号,_選手名],選手( _,_チームID,_選手名,_背番号),[_チーム最小背番号,_選手名]).  
    
[/code]




処理系は SWI-Prolog 6.6.4 です。`bagof/3` を使ってみました。もっと簡潔な方法があるかとは思いますが、ご参考までにどうぞ。

[code]

    findmin([Num, Name], Y, [Min, Name]) :-
      functor(Y, FY, _),
      arg(2, Y, Team_ID),
      term_variables(Y, [ID, Name, Num]),
      bagof(Num, (ID, Name)^call(FY, ID, Team_ID, Name, Num), NumList),
      min_list(NumList, Min), call(FY, ID, Team_ID, Name, Min).
    
[/code]

※ 同じチームで背番号が同じで、かつ最小値の選手レコード(現実にはあり得ませんが)を登録した場合、それら全てが抽出されます。`min_list/2`
の仕様ですね。

