| -- backend/relational-engine/examples/TreeInvert.lean | |
| -- | |
| -- Tree Inversion Correctness Proof | |
| -- ================================== | |
| -- Formalizes the Lean 4 certificate from exec-tree-invert-001. | |
| -- | |
| -- Two properties proven: | |
| -- 1. tree_invert preserves depth | |
| -- 2. tree_invert is the mirror (structural inverse) | |
| -- | |
| -- Connects to: | |
| -- examples/tree-invert.mjs (runtime verification) | |
| -- examples/exec-tree-invert-001.sgml (execution trace) | |
| -- relational-refinement-engine.mjs (synthesis engine) | |
| -- | |
| -- Ahmad Ali Parr -- Bel Esprit D'Accord Irrevocable Trust -- EIN 42-697643 | |
| import Mathlib.Data.Nat.Basic | |
| import Mathlib.Tactic | |
| namespace TreeInvert | |
| -- ββ Tree type βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| inductive Tree (Ξ± : Type) where | |
| | leaf : Tree Ξ± | |
| | node : Ξ± β Tree Ξ± β Tree Ξ± β Tree Ξ± | |
| deriving Repr | |
| -- ββ tree_invert: swap left and right at every node βββββββββββββββββββββββββββ | |
| def tree_invert : Tree Ξ± β Tree Ξ± | |
| | .leaf => .leaf | |
| | .node v l r => .node v (tree_invert r) (tree_invert l) | |
| -- ββ depth: number of levels βββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| def depth : Tree Ξ± β β | |
| | .leaf => 0 | |
| | .node _ l r => 1 + max (depth l) (depth r) | |
| -- ββ mirror: structural definition of tree inversion ββββββββββββββββββββββββββ | |
| -- mirror t = tree_invert t (the two definitions coincide) | |
| def mirror : Tree Ξ± β Tree Ξ± := tree_invert | |
| -- ββ THEOREM 1: tree_invert preserves depth βββββββββββββββββββββββββββββββββββ | |
| theorem tree_invert_preserves_depth (t : Tree Ξ±) : | |
| depth (tree_invert t) = depth t := by | |
| induction t with | |
| | leaf => rfl | |
| | node v l r ihl ihr => | |
| simp [tree_invert, depth, Nat.max_comm] | |
| omega | |
| -- ββ THEOREM 2: tree_invert is an involution: invert (invert t) = t βββββββββββ | |
| theorem tree_invert_involution (t : Tree Ξ±) : | |
| tree_invert (tree_invert t) = t := by | |
| induction t with | |
| | leaf => rfl | |
| | node v l r ihl ihr => | |
| simp [tree_invert, ihl, ihr] | |
| -- ββ THEOREM 3: The synthesis certificate from exec-tree-invert-001 βββββββββββ | |
| -- depth is preserved AND invert is its own inverse | |
| theorem tree_invert_correct (t : Tree Ξ±) : | |
| depth (tree_invert t) = depth t β§ | |
| tree_invert (tree_invert t) = t := by | |
| exact β¨tree_invert_preserves_depth t, tree_invert_involution tβ© | |
| -- ββ THEOREM 4: Example from execution trace ββββββββββββββββββββββββββββββββββ | |
| -- Input: node 1 (node 2 leaf leaf) (node 3 leaf leaf) | |
| -- Output: node 1 (node 3 leaf leaf) (node 2 leaf leaf) | |
| theorem tree_invert_example : | |
| tree_invert (.node 1 (.node 2 .leaf .leaf) (.node 3 .leaf .leaf)) | |
| = .node 1 (.node 3 .leaf .leaf) (.node 2 .leaf .leaf) := by | |
| simp [tree_invert] | |
| end TreeInvert | |