Может кто-нибудь объяснить, как предопределенный предикат forall должен найти минимальные значения в списке?
forall
Для списка L вы можете использовать:
L
member(Min,L), forall(member(N,L), N>=Min).
Однако, хотя это хорошая демонстрация forall, она неэффективна (квадратная сложность вместо линейной).
или вы можете использовать предикат findall / 3
findall(Value, minimumValues(Value), minimumValuesList)
возвращает список (imumValuesList) с элементами (все минимальные значения, справа)
Почему вы хотите использовать forall/2, чтобы найти минимум?min_list/2:
forall/2
min_list/2
?- listing(min_list). lists:min_list([], A, A). lists:min_list([A|C], B, E) :- D is min(A, B), min_list(C, D, E). lists:min_list([B|A], C) :- min_list(A, B, C).
Просто используйте это:
minlist([X], X). minlist([H|T], Min) :- minlist(T, Tmin), Min is min(H, Tmin), !.