Research-Stack/0-Core-Formalism/lean/Semantics/Semantics/WhitespaceFreeGrammar.lean
2026-05-11 22:08:10 -05:00

78 lines
2.5 KiB
Text

namespace Semantics.WhitespaceFreeGrammar
/-!
Whitespace-free grammar gate.
The intended compression rule is narrow:
* symbol payloads are stored;
* ordinary inter-symbol whitespace is derived from symbol count/order;
* no whitespace symbol is admitted into the payload stream;
* non-canonical spacing needs a residual and therefore remains outside this
zero-whitespace gate.
-/
/-- A finite grammar atom represented by its payload byte count. -/
structure GrammarAtom where
payloadBytes : Nat
deriving Repr, DecidableEq, BEq
/-- Payload cost counts symbols only. Whitespace is not a symbol. -/
def payloadBytes : List GrammarAtom -> Nat
| [] => 0
| atom :: rest => atom.payloadBytes + payloadBytes rest
/-- Number of derivable inter-symbol boundaries. -/
def derivedBoundaryCount : List GrammarAtom -> Nat
| [] => 0
| [_] => 0
| _ :: rest => 1 + derivedBoundaryCount rest
/-- Stored whitespace codes are always zero in this gate. -/
def storedWhitespaceCodes (_atoms : List GrammarAtom) : Nat := 0
/-- Stored cost under the zero-whitespace grammar. -/
def storedBytes (atoms : List GrammarAtom) : Nat :=
payloadBytes atoms + storedWhitespaceCodes atoms
/-- Decoded display bytes if every derived boundary replays as one ASCII space.
This is a replay cost, not a stored cost. -/
def canonicalDisplayBytes (atoms : List GrammarAtom) : Nat :=
payloadBytes atoms + derivedBoundaryCount atoms
def atomA : GrammarAtom := { payloadBytes := 5 }
def atomB : GrammarAtom := { payloadBytes := 4 }
def atomC : GrammarAtom := { payloadBytes := 7 }
def exampleAtoms : List GrammarAtom := [atomA, atomB, atomC]
theorem exampleStoredWhitespaceZero :
storedWhitespaceCodes exampleAtoms = 0 := by
native_decide
theorem exampleStoredCostDropsDerivedSpaces :
storedBytes exampleAtoms = payloadBytes exampleAtoms := by
native_decide
theorem exampleDerivedBoundaryCount :
derivedBoundaryCount exampleAtoms = 2 := by
native_decide
theorem exampleCanonicalDisplayCost :
canonicalDisplayBytes exampleAtoms = storedBytes exampleAtoms + 2 := by
native_decide
theorem emptyHasNoWhitespaceCodes :
storedWhitespaceCodes [] = 0 ∧ derivedBoundaryCount [] = 0 := by
native_decide
theorem singletonHasNoDerivedBoundary :
storedWhitespaceCodes [atomA] = 0 ∧ derivedBoundaryCount [atomA] = 0 := by
native_decide
#eval storedWhitespaceCodes exampleAtoms
#eval payloadBytes exampleAtoms
#eval storedBytes exampleAtoms
#eval derivedBoundaryCount exampleAtoms
#eval canonicalDisplayBytes exampleAtoms
end Semantics.WhitespaceFreeGrammar