除其他版本的發佈已經,也考慮一個沒有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).
ERROR: is/2: Arguments are not sufficiently instantiated
要使它成爲一個真正的解決方案,使用約束像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.
'= <'似乎解決它,謝謝。但現在我得到了這個錯誤:'錯誤:>/2:算術:'[]/0'不是一個函數'',當我將它分成兩部分時,我得到:' - minimo([1,2, 3],X)。 錯誤:>/2:算術:\'[]/0'不是函數異常:(8)minimo([[3],[]],[3])?'謝謝! +1 – Trufa