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 age16.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)).