Machine-facing encoding of Boolean formulas #
This file defines a canonical postfix encoding of BoolFormula. Six three-bit
tags represent variables, constants, and connectives. A variable tag is
followed by the existing terminated-unary natural code. The complete stream
starts with its terminated-unary token count.
Postfix order makes decoding iterative: the parser first reads a flat token stream, then a stack machine reconstructs the formula. This avoids a recursive on-tape tree parser and gives the later Barrington generator a simple, self-delimiting input language.
Equations
- Complexity.FormulaCode.instDecidableEqToken.decEq (Complexity.FormulaCode.Token.var a) (Complexity.FormulaCode.Token.var b) = if h : a = b then h ▸ isTrue ⋯ else isFalse ⋯
- Complexity.FormulaCode.instDecidableEqToken.decEq (Complexity.FormulaCode.Token.var index) Complexity.FormulaCode.Token.tru = isFalse ⋯
- Complexity.FormulaCode.instDecidableEqToken.decEq (Complexity.FormulaCode.Token.var index) Complexity.FormulaCode.Token.fls = isFalse ⋯
- Complexity.FormulaCode.instDecidableEqToken.decEq (Complexity.FormulaCode.Token.var index) Complexity.FormulaCode.Token.neg = isFalse ⋯
- Complexity.FormulaCode.instDecidableEqToken.decEq (Complexity.FormulaCode.Token.var index) Complexity.FormulaCode.Token.conj = isFalse ⋯
- Complexity.FormulaCode.instDecidableEqToken.decEq (Complexity.FormulaCode.Token.var index) Complexity.FormulaCode.Token.disj = isFalse ⋯
- Complexity.FormulaCode.instDecidableEqToken.decEq Complexity.FormulaCode.Token.tru (Complexity.FormulaCode.Token.var index) = isFalse ⋯
- Complexity.FormulaCode.instDecidableEqToken.decEq Complexity.FormulaCode.Token.tru Complexity.FormulaCode.Token.tru = isTrue ⋯
- Complexity.FormulaCode.instDecidableEqToken.decEq Complexity.FormulaCode.Token.tru Complexity.FormulaCode.Token.fls = isFalse Complexity.FormulaCode.instDecidableEqToken.decEq._proof_10
- Complexity.FormulaCode.instDecidableEqToken.decEq Complexity.FormulaCode.Token.tru Complexity.FormulaCode.Token.neg = isFalse Complexity.FormulaCode.instDecidableEqToken.decEq._proof_11
- Complexity.FormulaCode.instDecidableEqToken.decEq Complexity.FormulaCode.Token.tru Complexity.FormulaCode.Token.conj = isFalse Complexity.FormulaCode.instDecidableEqToken.decEq._proof_12
- Complexity.FormulaCode.instDecidableEqToken.decEq Complexity.FormulaCode.Token.tru Complexity.FormulaCode.Token.disj = isFalse Complexity.FormulaCode.instDecidableEqToken.decEq._proof_13
- Complexity.FormulaCode.instDecidableEqToken.decEq Complexity.FormulaCode.Token.fls (Complexity.FormulaCode.Token.var index) = isFalse ⋯
- Complexity.FormulaCode.instDecidableEqToken.decEq Complexity.FormulaCode.Token.fls Complexity.FormulaCode.Token.tru = isFalse Complexity.FormulaCode.instDecidableEqToken.decEq._proof_15
- Complexity.FormulaCode.instDecidableEqToken.decEq Complexity.FormulaCode.Token.fls Complexity.FormulaCode.Token.fls = isTrue ⋯
- Complexity.FormulaCode.instDecidableEqToken.decEq Complexity.FormulaCode.Token.fls Complexity.FormulaCode.Token.neg = isFalse Complexity.FormulaCode.instDecidableEqToken.decEq._proof_16
- Complexity.FormulaCode.instDecidableEqToken.decEq Complexity.FormulaCode.Token.fls Complexity.FormulaCode.Token.conj = isFalse Complexity.FormulaCode.instDecidableEqToken.decEq._proof_17
- Complexity.FormulaCode.instDecidableEqToken.decEq Complexity.FormulaCode.Token.fls Complexity.FormulaCode.Token.disj = isFalse Complexity.FormulaCode.instDecidableEqToken.decEq._proof_18
- Complexity.FormulaCode.instDecidableEqToken.decEq Complexity.FormulaCode.Token.neg (Complexity.FormulaCode.Token.var index) = isFalse ⋯
- Complexity.FormulaCode.instDecidableEqToken.decEq Complexity.FormulaCode.Token.neg Complexity.FormulaCode.Token.tru = isFalse Complexity.FormulaCode.instDecidableEqToken.decEq._proof_20
- Complexity.FormulaCode.instDecidableEqToken.decEq Complexity.FormulaCode.Token.neg Complexity.FormulaCode.Token.fls = isFalse Complexity.FormulaCode.instDecidableEqToken.decEq._proof_21
- Complexity.FormulaCode.instDecidableEqToken.decEq Complexity.FormulaCode.Token.neg Complexity.FormulaCode.Token.neg = isTrue ⋯
- Complexity.FormulaCode.instDecidableEqToken.decEq Complexity.FormulaCode.Token.neg Complexity.FormulaCode.Token.conj = isFalse Complexity.FormulaCode.instDecidableEqToken.decEq._proof_22
- Complexity.FormulaCode.instDecidableEqToken.decEq Complexity.FormulaCode.Token.neg Complexity.FormulaCode.Token.disj = isFalse Complexity.FormulaCode.instDecidableEqToken.decEq._proof_23
- Complexity.FormulaCode.instDecidableEqToken.decEq Complexity.FormulaCode.Token.conj (Complexity.FormulaCode.Token.var index) = isFalse ⋯
- Complexity.FormulaCode.instDecidableEqToken.decEq Complexity.FormulaCode.Token.conj Complexity.FormulaCode.Token.tru = isFalse Complexity.FormulaCode.instDecidableEqToken.decEq._proof_25
- Complexity.FormulaCode.instDecidableEqToken.decEq Complexity.FormulaCode.Token.conj Complexity.FormulaCode.Token.fls = isFalse Complexity.FormulaCode.instDecidableEqToken.decEq._proof_26
- Complexity.FormulaCode.instDecidableEqToken.decEq Complexity.FormulaCode.Token.conj Complexity.FormulaCode.Token.neg = isFalse Complexity.FormulaCode.instDecidableEqToken.decEq._proof_27
- Complexity.FormulaCode.instDecidableEqToken.decEq Complexity.FormulaCode.Token.conj Complexity.FormulaCode.Token.conj = isTrue ⋯
- Complexity.FormulaCode.instDecidableEqToken.decEq Complexity.FormulaCode.Token.conj Complexity.FormulaCode.Token.disj = isFalse Complexity.FormulaCode.instDecidableEqToken.decEq._proof_28
- Complexity.FormulaCode.instDecidableEqToken.decEq Complexity.FormulaCode.Token.disj (Complexity.FormulaCode.Token.var index) = isFalse ⋯
- Complexity.FormulaCode.instDecidableEqToken.decEq Complexity.FormulaCode.Token.disj Complexity.FormulaCode.Token.tru = isFalse Complexity.FormulaCode.instDecidableEqToken.decEq._proof_30
- Complexity.FormulaCode.instDecidableEqToken.decEq Complexity.FormulaCode.Token.disj Complexity.FormulaCode.Token.fls = isFalse Complexity.FormulaCode.instDecidableEqToken.decEq._proof_31
- Complexity.FormulaCode.instDecidableEqToken.decEq Complexity.FormulaCode.Token.disj Complexity.FormulaCode.Token.neg = isFalse Complexity.FormulaCode.instDecidableEqToken.decEq._proof_32
- Complexity.FormulaCode.instDecidableEqToken.decEq Complexity.FormulaCode.Token.disj Complexity.FormulaCode.Token.conj = isFalse Complexity.FormulaCode.instDecidableEqToken.decEq._proof_33
- Complexity.FormulaCode.instDecidableEqToken.decEq Complexity.FormulaCode.Token.disj Complexity.FormulaCode.Token.disj = isTrue ⋯
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
Serialize one postfix token. Tags 110 and 111 are reserved.
Equations
- (Complexity.FormulaCode.Token.var index).encode = [false, false, false] ++ Complexity.CircuitCode.NatCode.encode index
- Complexity.FormulaCode.Token.tru.encode = [false, false, true]
- Complexity.FormulaCode.Token.fls.encode = [false, true, false]
- Complexity.FormulaCode.Token.neg.encode = [false, true, true]
- Complexity.FormulaCode.Token.conj.encode = [true, false, false]
- Complexity.FormulaCode.Token.disj.encode = [true, false, true]
Instances For
Parse one token prefix and return the unused suffix.
Equations
- One or more equations did not get rendered due to their size.
- Complexity.FormulaCode.Token.decodePrefix? (false :: false :: true :: rest) = some (Complexity.FormulaCode.Token.tru, rest)
- Complexity.FormulaCode.Token.decodePrefix? (false :: true :: false :: rest) = some (Complexity.FormulaCode.Token.fls, rest)
- Complexity.FormulaCode.Token.decodePrefix? (false :: true :: true :: rest) = some (Complexity.FormulaCode.Token.neg, rest)
- Complexity.FormulaCode.Token.decodePrefix? (true :: false :: false :: rest) = some (Complexity.FormulaCode.Token.conj, rest)
- Complexity.FormulaCode.Token.decodePrefix? (true :: false :: true :: rest) = some (Complexity.FormulaCode.Token.disj, rest)
- Complexity.FormulaCode.Token.decodePrefix? x✝ = none
Instances For
The exact number of bits in a token encoding.
Equations
- (Complexity.FormulaCode.Token.var index).codeLength = index + 4
- x✝.codeLength = 3
Instances For
Apply one postfix token to a formula stack.
Equations
- (Complexity.FormulaCode.Token.var index).apply? x✝ = some (Complexity.BoolFormula.var index :: x✝)
- Complexity.FormulaCode.Token.tru.apply? x✝ = some (Complexity.BoolFormula.tru :: x✝)
- Complexity.FormulaCode.Token.fls.apply? x✝ = some (Complexity.BoolFormula.fls :: x✝)
- Complexity.FormulaCode.Token.neg.apply? (formula :: stack) = some (formula.neg :: stack)
- Complexity.FormulaCode.Token.conj.apply? (right :: left :: stack) = some (left.conj right :: stack)
- Complexity.FormulaCode.Token.disj.apply? (right :: left :: stack) = some (left.disj right :: stack)
- x✝¹.apply? x✝ = none
Instances For
Canonical postfix tokens of a formula.
Equations
- Complexity.FormulaCode.tokens (Complexity.BoolFormula.var index) = [Complexity.FormulaCode.Token.var index]
- Complexity.FormulaCode.tokens Complexity.BoolFormula.tru = [Complexity.FormulaCode.Token.tru]
- Complexity.FormulaCode.tokens Complexity.BoolFormula.fls = [Complexity.FormulaCode.Token.fls]
- Complexity.FormulaCode.tokens formula.neg = Complexity.FormulaCode.tokens formula ++ [Complexity.FormulaCode.Token.neg]
- Complexity.FormulaCode.tokens (left.conj right) = Complexity.FormulaCode.tokens left ++ Complexity.FormulaCode.tokens right ++ [Complexity.FormulaCode.Token.conj]
- Complexity.FormulaCode.tokens (left.disj right) = Complexity.FormulaCode.tokens left ++ Complexity.FormulaCode.tokens right ++ [Complexity.FormulaCode.Token.disj]
Instances For
Execute a postfix token stream from an initial formula stack.
Equations
- Complexity.FormulaCode.run? [] x✝ = some x✝
- Complexity.FormulaCode.run? (token :: tokens) x✝ = do let stack ← token.apply? x✝ Complexity.FormulaCode.run? tokens stack
Instances For
Reconstruct exactly one formula from a postfix token stream.
Equations
- Complexity.FormulaCode.build? stream = do let stack ← Complexity.FormulaCode.run? stream [] match stack with | [formula] => some formula | x => none
Instances For
Decode exactly count token prefixes and return the unused bit suffix.
Equations
Instances For
Canonically encode a Boolean formula.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Decode one complete formula prefix and return the unused suffix.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Decode exactly one formula. Trailing bits are rejected.