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), !.