File size: 3,378 Bytes
119e586 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | -- 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
|