getminth([],M,N). getminth([L1|L2],M,N):- getminth(L2,L1,1,M,N). getminth([],M1,N1,M,N). getminth([L1|L2],M1,N1,M,N):- N2 is N1+1, M1 > L1, M is L1, N is N2, getminth(L2,L1,N2,M,N). getminth([L1|L2],M,N,M1,N1):- N2 is N1+1, getminth(L2,M1,N2,M1,N2).
このようにコードを書きましたが、実装できていません。
Mで最小値を、Pで何番目かを表示したいです。
prolog のご質問で java や python のタグをお付けになっているのは何故でしょう。
SWI Prolog であれば、
idxmin(List, Min, Idx) :- min_member(@=<, Min, List), nth0(Idx, List, Min).
でしょうか。最小値が複数ある場合は、最初の最小値のみになりますけれども。
以下に様々な回答があります。
https://stackoverflow.com/questions/3965054/prolog-find-minimum-in-a-list
最近のSWIはfoldlが使えるという情報もあります
ありがとうございます。
min_member、nth0などの述語を使わずに作成したいです。。。
https://teratail.com/questions/346100
関数型言語のfoldlを使うとすれば、アキュムレータとしてタプル
(最小値,最小値の要素番号,現在の要素番号)
を用意してリストの要素を順に処理し最後に(最小値,最小値の要素番号)を採用します
ただし最小値が複数ある場合、判定条件に応じて先頭か末尾の最小値が得られます。複数ある場合は、Prologのユニフィケーションが得意なのでは。