すでに投稿されている他のバージョンに加えて、if-then-else を使用せず、リレーションにわかりやすい名前を使用するバージョンも検討してください (リストをその最小値に関連付けます)。
list_min([L|Ls], Min) :- list_min(Ls, L, Min).
list_min([], Min, Min).
list_min([L|Ls], Min0, Min) :-
Min1 is min(L, Min0),
list_min(Ls, Min1, Min).
このようなパターンは(左から)フォールドと呼ばれ、 `foldl/4 を使用して同等に記述できます。
list_min([L|Ls], Min) :- foldl(min_, Ls, L, Min).
min_(A, B, Min) :- Min is min(A, B).
クエリの例:
?- list_min([1,0,2], Min).
Min = 0.
ただし、これは真の関係ではなく、低レベルの算術演算を使用しているため、すべての方向に使用できるわけではないことに注意してください。たとえば、逆方向に使用しようとすると、次のようになります。
?- list_min([X,Y], 3).
エラー: is/2 : 引数が十分にインスタンス化されていません
これを真のソリューションにするには、clpfdやclpqなどの制約を使用します。たとえば、整数に対する解の場合:
:- use_module(library(clpfd)).
list_min([L|Ls], Min) :- foldl(min_, Ls, L, Min).
min_(A, B, Min) :- Min #= min(A, B).
これはすべての方向に機能します。
?- list_min([X,Y], 3).
X in 3..sup,
3#=min(Y, X),
Y in 3..sup.