Splits aligned with gates of support at most two #
A program whose gates each read at most two inputs defines the support graph on the inputs:
two inputs are adjacent when some gate reads both. Every gate with nonempty support lies inside
a single connected component. A component with v inputs is connected, so it contains at least
v - 1 edges; distinct edges come from distinct gates of support exactly two inside the
component, so the component carries at least v - 1 input-reading gates. Summing over the
components, the number of components with exactly v - 1 gates ("tree components") is at
least n - |inputGates|. Taking L tree components for the side U of a split gives
|U| = (number of gates with nonempty support inside U) + L, and no gate straddles the split.
The main result is exists_split_of_support_card_le_two_internal.
The support graph of a program: two inputs are adjacent when some gate reads both.
Equations
Instances For
The inputs of a connected component of the support graph, as a finset.
Equations
- C.componentInputs c = {u : Fin n | C.supportGraph.connectedComponentMk u = c}
Instances For
The gates with nonempty support inside a connected component of the support graph.
Equations
- C.componentGates c = {j : Fin s | C.support j ≠ ∅ ∧ C.support j ⊆ C.componentInputs c}
Instances For
The support of a gate lies in the component of any of its inputs.
(F1) The components partition the inputs.
(F2) The input-reading gates are partitioned by the components.
When every gate reads at most two inputs, every edge of a component is the support of a gate of the component.
(F3) A component with v inputs carries at least v - 1 gates: it is connected, so it has
at least v - 1 edges, and distinct edges come from distinct gates.
A program whose gates each read at most two inputs admits, for every L ≤ n - |inputGates|,
a split U of the inputs that no gate straddles, with |U| exceeding the number of gates
reading inputs inside U by exactly L.