Boolean formulas and formula size #
Boolean formulas as trees over ∧, ∨, ¬, variables, and constants, with a
tree size (total node count) and leaves count (roadmap track L4). Formula
size is deliberately kept separate from DAG circuit size: a formula counts
every occurrence of a subformula, whereas a DAG-shaped Circuit may share a
subcircuit among several parents. Consequently formula size can be
exponentially larger than the size of an equivalent circuit, and the two
measures must not be conflated in lower-bound arguments.
Main definitions and results #
BoolFormula— the tree syntax,BoolFormula.evalits semanticsBoolFormula.size,BoolFormula.leaves,BoolFormula.depth— tree-size, leaf-count, and depth measuresBoolFormula.leaves_le_size,BoolFormula.one_le_size,BoolFormula.leaves_le_two_pow_depth,BoolFormula.size_lt_two_pow_depth_succ,BoolFormula.depth_le_sizeBoolFormula.vars,BoolFormula.eval_eq_of_agree— the variable set and the locality property (evaluation depends only on the variables that occur)
A Boolean formula: a tree over variables, the constants ⊤/⊥, and the
connectives ¬, ∧, ∨. Unlike a Circuit, subformulas are not shared.
- var
(i : ℕ)
: BoolFormula
The variable
x_i. - tru : BoolFormula
The constant
⊤. - fls : BoolFormula
The constant
⊥. - neg
(φ : BoolFormula)
: BoolFormula
Negation.
- conj
(φ ψ : BoolFormula)
: BoolFormula
Conjunction.
- disj
(φ ψ : BoolFormula)
: BoolFormula
Disjunction.
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
Equations
- One or more equations did not get rendered due to their size.
- Complexity.instDecidableEqBoolFormula.decEq (Complexity.BoolFormula.var a) (Complexity.BoolFormula.var b) = if h : a = b then h ▸ isTrue ⋯ else isFalse ⋯
- Complexity.instDecidableEqBoolFormula.decEq (Complexity.BoolFormula.var i) Complexity.BoolFormula.tru = isFalse ⋯
- Complexity.instDecidableEqBoolFormula.decEq (Complexity.BoolFormula.var i) Complexity.BoolFormula.fls = isFalse ⋯
- Complexity.instDecidableEqBoolFormula.decEq (Complexity.BoolFormula.var i) φ.neg = isFalse ⋯
- Complexity.instDecidableEqBoolFormula.decEq (Complexity.BoolFormula.var i) (φ.conj ψ) = isFalse ⋯
- Complexity.instDecidableEqBoolFormula.decEq (Complexity.BoolFormula.var i) (φ.disj ψ) = isFalse ⋯
- Complexity.instDecidableEqBoolFormula.decEq Complexity.BoolFormula.tru (Complexity.BoolFormula.var i) = isFalse ⋯
- Complexity.instDecidableEqBoolFormula.decEq Complexity.BoolFormula.tru Complexity.BoolFormula.tru = isTrue ⋯
- Complexity.instDecidableEqBoolFormula.decEq Complexity.BoolFormula.tru Complexity.BoolFormula.fls = isFalse Complexity.instDecidableEqBoolFormula.decEq._proof_10
- Complexity.instDecidableEqBoolFormula.decEq Complexity.BoolFormula.tru φ.neg = isFalse ⋯
- Complexity.instDecidableEqBoolFormula.decEq Complexity.BoolFormula.tru (φ.conj ψ) = isFalse ⋯
- Complexity.instDecidableEqBoolFormula.decEq Complexity.BoolFormula.tru (φ.disj ψ) = isFalse ⋯
- Complexity.instDecidableEqBoolFormula.decEq Complexity.BoolFormula.fls (Complexity.BoolFormula.var i) = isFalse ⋯
- Complexity.instDecidableEqBoolFormula.decEq Complexity.BoolFormula.fls Complexity.BoolFormula.tru = isFalse Complexity.instDecidableEqBoolFormula.decEq._proof_15
- Complexity.instDecidableEqBoolFormula.decEq Complexity.BoolFormula.fls Complexity.BoolFormula.fls = isTrue ⋯
- Complexity.instDecidableEqBoolFormula.decEq Complexity.BoolFormula.fls φ.neg = isFalse ⋯
- Complexity.instDecidableEqBoolFormula.decEq Complexity.BoolFormula.fls (φ.conj ψ) = isFalse ⋯
- Complexity.instDecidableEqBoolFormula.decEq Complexity.BoolFormula.fls (φ.disj ψ) = isFalse ⋯
- Complexity.instDecidableEqBoolFormula.decEq φ.neg (Complexity.BoolFormula.var i) = isFalse ⋯
- Complexity.instDecidableEqBoolFormula.decEq φ.neg Complexity.BoolFormula.tru = isFalse ⋯
- Complexity.instDecidableEqBoolFormula.decEq φ.neg Complexity.BoolFormula.fls = isFalse ⋯
- Complexity.instDecidableEqBoolFormula.decEq a.neg b.neg = if h : a = b then h ▸ have inst := Complexity.instDecidableEqBoolFormula.decEq a a; isTrue ⋯ else isFalse ⋯
- Complexity.instDecidableEqBoolFormula.decEq φ.neg (φ_1.conj ψ) = isFalse ⋯
- Complexity.instDecidableEqBoolFormula.decEq φ.neg (φ_1.disj ψ) = isFalse ⋯
- Complexity.instDecidableEqBoolFormula.decEq (φ.conj ψ) (Complexity.BoolFormula.var i) = isFalse ⋯
- Complexity.instDecidableEqBoolFormula.decEq (φ.conj ψ) Complexity.BoolFormula.tru = isFalse ⋯
- Complexity.instDecidableEqBoolFormula.decEq (φ.conj ψ) Complexity.BoolFormula.fls = isFalse ⋯
- Complexity.instDecidableEqBoolFormula.decEq (φ.conj ψ) φ_1.neg = isFalse ⋯
- Complexity.instDecidableEqBoolFormula.decEq (φ.conj ψ) (φ_1.disj ψ_1) = isFalse ⋯
- Complexity.instDecidableEqBoolFormula.decEq (φ.disj ψ) (Complexity.BoolFormula.var i) = isFalse ⋯
- Complexity.instDecidableEqBoolFormula.decEq (φ.disj ψ) Complexity.BoolFormula.tru = isFalse ⋯
- Complexity.instDecidableEqBoolFormula.decEq (φ.disj ψ) Complexity.BoolFormula.fls = isFalse ⋯
- Complexity.instDecidableEqBoolFormula.decEq (φ.disj ψ) φ_1.neg = isFalse ⋯
- Complexity.instDecidableEqBoolFormula.decEq (φ.disj ψ) (φ_1.conj ψ_1) = isFalse ⋯
Instances For
Evaluate a formula under an assignment α : ℕ → Bool.
Equations
- Complexity.BoolFormula.eval α (Complexity.BoolFormula.var i) = α i
- Complexity.BoolFormula.eval α Complexity.BoolFormula.tru = true
- Complexity.BoolFormula.eval α Complexity.BoolFormula.fls = false
- Complexity.BoolFormula.eval α φ.neg = !Complexity.BoolFormula.eval α φ
- Complexity.BoolFormula.eval α (φ.conj ψ) = (Complexity.BoolFormula.eval α φ && Complexity.BoolFormula.eval α ψ)
- Complexity.BoolFormula.eval α (φ.disj ψ) = (Complexity.BoolFormula.eval α φ || Complexity.BoolFormula.eval α ψ)
Instances For
The tree size: the total number of nodes (leaves and connectives).
Equations
Instances For
The number of leaf nodes (variables and constants).
Equations
Instances For
The depth of a formula: the longest root-to-leaf path (the NC¹
complexity measure). Leaves have depth 0; each connective adds 1.
Equations
Instances For
The set of variables occurring in a formula.
Equations
Instances For
Every formula has at least one node.
The leaf count never exceeds the tree size (leaves are among the nodes).
A formula of depth d has at most 2 ^ d leaves (a depth-d binary tree has
at most 2 ^ d leaves).
A formula of depth d has fewer than 2 ^ (d + 1) total nodes. This is
the tree-size counterpart of leaves_le_two_pow_depth.
Depth never exceeds size: a longest path uses at most every node.