The rounds of a bag recursion that settles are bounded #
A recursive term reads its hole once, so it is linear in the recursive
relation: a round of a bag recursion is the previous round bound through
a function of the row (AggQueryIn.bind_of_body). A row of round j is
therefore the end of a path of j steps from the base, and a path longer
than the number of rows the rounds can hold repeats a row, whose segment
then pumps forever: a recursion that settles does so within |V|^m
rounds, V the values its rounds hold (bindStep_round_eq_zero_of_settles),
and its value is the sum of that many rounds (AggQueryIn.mu_eq_muSum_of_valsIn).
This is what any bounded simulation of a bag recursion rests on – a simulation that settles everywhere and agrees with the recursion wherever the recursion settles.
A body is linear in its hole #
A recursive term is linear in its hole: read at a round X, it is
X bound through a function of the row, plus what it reads at the empty
round. The hole occurs once, under projections, selections, products,
the left of an apply and unions, each of which distributes over the bind.
Dependency graph
Paths through the rounds of a bind #
The round function of a linear term with nothing read at the empty
round: a round is the previous one bound through F.
Instances For
Dependency graph
A row of round j is the end of a path of j steps from the base.
Dependency graph
A repeated row pumps: if a path visits the same row at a < b,
that row is in round b + k (b - a) for every k.
Dependency graph
The bound #
A bag recursion that settles does so within |V|^m rounds, V
holding every value of every round: a row of round |V|^m ends a path of
|V|^m + 1 rows over V^m, two of which coincide, and the segment
between them pumps a non-empty round past every bound.
Dependency graph
A bag recursion that settles is the sum of |V|^m rounds, V
holding every value of every round: the round function of a body that
reads nothing at the empty round is a bind (AggQueryIn.bind_of_body),
so the bound applies.