De Morgan expressions compiled to circuits #
This is a small tree language for Boolean formulas over the manuscript's
actual basis. Unlike the Boolean-ring compiler, it emits NOT, AND, and
OR directly, which is useful for zero tests, comparisons, selectors, and
sorting-network records. Constants are represented by nullary gates but are
free under DeMorgan.standardCost.
Tree-shaped expressions over the De Morgan basis.
- input {n : ℕ} (index : Fin n) : Expression n
- constant {n : ℕ} (value : Bool) : Expression n
- not {n : ℕ} (child : Expression n) : Expression n
- and {n : ℕ} (left right : Expression n) : Expression n
- or {n : ℕ} (left right : Expression n) : Expression n
Instances For
Number of program gates emitted by tree compilation.
Equations
Instances For
Standard charged cost: constants and inputs are free, and each logical operation costs one.
Equations
- (Algebraic.DeMorgan.Expression.input index).standardCost = 0
- (Algebraic.DeMorgan.Expression.constant value).standardCost = 0
- child.not.standardCost = child.standardCost + 1
- (left.and right).standardCost = left.standardCost + right.standardCost + 1
- (left.or right).standardCost = left.standardCost + right.standardCost + 1
Instances For
Direct Boolean semantics.
Equations
- Algebraic.DeMorgan.Expression.eval input (Algebraic.DeMorgan.Expression.input index) = input index
- Algebraic.DeMorgan.Expression.eval input (Algebraic.DeMorgan.Expression.constant value) = value
- Algebraic.DeMorgan.Expression.eval input child.not = !Algebraic.DeMorgan.Expression.eval input child
- Algebraic.DeMorgan.Expression.eval input (left.and right) = (Algebraic.DeMorgan.Expression.eval input left && Algebraic.DeMorgan.Expression.eval input right)
- Algebraic.DeMorgan.Expression.eval input (left.or right) = (Algebraic.DeMorgan.Expression.eval input left || Algebraic.DeMorgan.Expression.eval input right)
Instances For
Rename the input coordinates of an expression.
Equations
- Algebraic.DeMorgan.Expression.mapInputs inputMap (Algebraic.DeMorgan.Expression.input index) = Algebraic.DeMorgan.Expression.input (inputMap index)
- Algebraic.DeMorgan.Expression.mapInputs inputMap (Algebraic.DeMorgan.Expression.constant value) = Algebraic.DeMorgan.Expression.constant value
- Algebraic.DeMorgan.Expression.mapInputs inputMap child.not = (Algebraic.DeMorgan.Expression.mapInputs inputMap child).not
- Algebraic.DeMorgan.Expression.mapInputs inputMap (left.and right) = (Algebraic.DeMorgan.Expression.mapInputs inputMap left).and (Algebraic.DeMorgan.Expression.mapInputs inputMap right)
- Algebraic.DeMorgan.Expression.mapInputs inputMap (left.or right) = (Algebraic.DeMorgan.Expression.mapInputs inputMap left).or (Algebraic.DeMorgan.Expression.mapInputs inputMap right)
Instances For
constantCircuit is a single constant gate.
One direct NOT gate.
Equations
- One or more equations did not get rendered due to their size.
Instances For
notCircuit is a single gate.
One direct AND gate.
Equations
- One or more equations did not get rendered due to their size.
Instances For
andCircuit is a single gate.
One direct OR gate.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Compile an expression into a one-output De Morgan circuit.
Equations
- (Algebraic.DeMorgan.Expression.input index).circuit = (Cslib.Circuits.Circuit.id Algebraic.DeMorgan.signature n).mapOutputs fun (x : Fin 1) => index
- (Algebraic.DeMorgan.Expression.constant value).circuit = Algebraic.DeMorgan.Expression.constantCircuit value n
- child.not.circuit = Algebraic.DeMorgan.Expression.notCircuit.comp child.circuit
- (left.and right).circuit = Algebraic.DeMorgan.Expression.andCircuit.comp (left.circuit.parallel right.circuit)
- (left.or right).circuit = Algebraic.DeMorgan.Expression.orCircuit.comp (left.circuit.parallel right.circuit)
Instances For
Compilation emits exactly gateCount program gates.
Compilation preserves Boolean semantics.
Compilation realizes the expression's standard charged cost exactly.
De Morgan implementation of Boolean XOR.
Instances For
XOR a finite expression family, with false for the empty family.
Equations
- Algebraic.DeMorgan.Expression.finXor 0 x_2 = Algebraic.DeMorgan.Expression.constant false
- Algebraic.DeMorgan.Expression.finXor count.succ terms = (Algebraic.DeMorgan.Expression.finXor count fun (index : Fin count) => terms index.castSucc).xor (terms (Fin.last count))
Instances For
Conjunction of a finite expression family, with true as the empty
conjunction.
Equations
- Algebraic.DeMorgan.Expression.finAnd 0 x_2 = Algebraic.DeMorgan.Expression.constant true
- Algebraic.DeMorgan.Expression.finAnd count.succ terms = (Algebraic.DeMorgan.Expression.finAnd count fun (index : Fin count) => terms index.castSucc).and (terms (Fin.last count))
Instances For
Disjunction of a finite expression family, with false as the empty
disjunction.
Equations
- Algebraic.DeMorgan.Expression.finOr 0 x_2 = Algebraic.DeMorgan.Expression.constant false
- Algebraic.DeMorgan.Expression.finOr count.succ terms = (Algebraic.DeMorgan.Expression.finOr count fun (index : Fin count) => terms index.castSucc).or (terms (Fin.last count))
Instances For
Boolean fold matching finAnd's constructor order.
Equations
- Algebraic.DeMorgan.Expression.finAndValue 0 x_2 = true
- Algebraic.DeMorgan.Expression.finAndValue count.succ values = ((Algebraic.DeMorgan.Expression.finAndValue count fun (index : Fin count) => values index.castSucc) && values (Fin.last count))
Instances For
Boolean fold matching finOr's constructor order.
Equations
- Algebraic.DeMorgan.Expression.finOrValue 0 x_2 = false
- Algebraic.DeMorgan.Expression.finOrValue count.succ values = ((Algebraic.DeMorgan.Expression.finOrValue count fun (index : Fin count) => values index.castSucc) || values (Fin.last count))
Instances For
A disjunction selected by a one-hot flag family returns the selected value.
Exact charged cost of a finite conjunction.
Exact charged cost of a finite disjunction.