

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]


CC BY-SA 3.0
2014-12-19T09:22:14.250
2125
2015-03-01T10:37:27.853
2014-12-20T22:07:33.677
5175
5175
question
prolog
findmin/3 の定義


処理系は 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`
の仕様ですね。


CC BY-SA 3.0
2014-12-20T02:51:43.110
2193
2014-12-20T02:51:43.110
2125
answer


この質問は予め答えが用意されていて、質問者、回答者の関係がクイズのそれに近いものものとして設定したつもりです。  
実際にコードの中で使われて具体的な表現から、その述語の定義を想像してみてほしいということです。  
私の用意してあった答えは、

[code]

    findmin(A,P,Min) :-
        findall(A,P,L),
        min_list(L,Min).
    
[/code]

でした。


CC BY-SA 3.0
2015-03-01T10:37:27.853
7274
2015-03-01T10:37:27.853
5175
2125
answer