forall-Prolog
может кто-нибудь объяснить, как должен предикат forall чтобы найти минимальные значения в списке?
4 ответов
список L, вы можете использовать:
member(Min,L), forall(member(N,L), N>=Min).
однако, в то время как это хорошая демонстрация forall, это не эффективно (квадратная сложность вместо линейной).
или вы можете использовать предикат findall / 3
findall(Value, minimumValues(Value), minimumValuesList)
он возвращает список (minimumValuesList) с элементами (все минимальные значения, справа).
почему вы хотите использовать forall/2 найти минимальное?!
для стандартного (линейного) решения для выбора минимального / максимального/... элемент из списка посмотрите на SWI-Prolog 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), !.
