All-Solutions Predicates

findall/4 appends to a tail (difference list).

age(peter, 7). age(ann, 11). age(pat, 8). age(tom, 5). age(mike, 11).

16.1 findall/3

findall/4 appends to a tail (difference list).

?- findall(N, age(N, _), Names).            % [peter, ann, pat, tom, mike]
?- findall(N-A, age(N, A), Pairs).
?- findall(X, member(X, []), L).            % L = [] (never fails)
?- findall(X, (member(X, [1,2,3,4]), X > 2), L).   % L = [3, 4]

16.2 bagof/3 — groups by free variables; fails if no solutions

?- bagof(N, age(N, A), Ns).
A = 5, Ns = [tom] ;
A = 7, Ns = [peter] ;
A = 8, Ns = [pat] ;
A = 11, Ns = [ann, mike].

?- bagof(N, A^age(N, A), Ns).    % A^ = "there exists A" → one group
Ns = [peter, ann, pat, tom, mike].

16.3 setof/3 — like bagof, but sorted & deduplicated

?- setof(A, N^age(N, A), Ages).          % [5, 7, 8, 11]
?- setof(A-N, age(N, A), Sorted).        % sorted by age

16.4 aggregate_all/3 and library(aggregate)

?- aggregate_all(count, age(_, _), C).          % 5
?- aggregate_all(sum(A), age(_, A), S).         % 42
?- aggregate_all(max(A), age(_, A), M).         % 11
?- aggregate_all(max(A, N), age(N, A), max(MaxA, Who)).
?- aggregate_all(bag(N), age(N, 11), L).
?- aggregate_all(set(A), age(_, A), Set).
?- aggregate(count, N^age(N, A), C).            % grouped by A (backtracks)

16.5 Other

forall/2, findnsols/4 (first N solutions), limit/2 and offset/2 (library(solution_sequences)), order_by/2, distinct/1,2, call_nth/2.

?- limit(2, member(X, [a, b, c])).
?- distinct(X, member(X, [a, b, a])).
?- order_by([desc(A)], age(N, A)).