Some checks are pending
Lean Action CI / build (push) Waiting to run
Restructure to engine-only contents. Application code (Topolei.*
namespace, canvas-rs / render Rust crates, Main / ProbeTest, naga IR
pipeline, Selection / Subobject / Trace / Obs.Ctx hypothesis stack,
cells-spec / HYPOTHESES / STATUS / NAGA_IR_PLAN docs) moves to the
sibling repo max/topolei.
What moved:
- `Topolei/Cubical/*.lean` (22 files) → `CubicalTransport/*.lean`
with namespace `Topolei.Cubical.*` renamed to `CubicalTransport.*`.
Fully-qualified test types `TopoleiCubical{FFI,Property}Test` →
`CubicalTransport{FFI,Property}Test` for consistency.
- New root file `CubicalTransport.lean` re-exporting all 22 modules.
- Lakefile: package `cubicalTransport`; lib `CubicalTransport`; only
`cubical-test` and `cubical-bench` exes (no GPU link path).
The split criterion: anything an AI shortcut could break that would
cascade-corrupt downstream proofs lives here. Anything that would
only break the application stays in the topolei interface repo.
cubical-test passes 62/62 (smoke + properties) on the renamed engine.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
135 lines
6.6 KiB
Text
135 lines
6.6 KiB
Text
/-
|
|
Topolei.Cubical.System
|
|
======================
|
|
Step 6 of the transport plan: partial elements — the [φ↦u] of composition.
|
|
|
|
A System is a pair (face formula φ, body term u). It represents a partial
|
|
element defined wherever φ holds. This is the new concept that separates
|
|
composition from transport: transport has no system, composition has one.
|
|
|
|
Compatibility (CompatAt0):
|
|
The system must agree with the base term t₀ on the face φ ∩ (i=0).
|
|
Formally: for every environment where both φ and (i=0) hold, the
|
|
body at i=0 equals t₀. This is the side-condition of the comp rule.
|
|
|
|
Key theorems:
|
|
· compat_bot — empty system [0_F↦u] is compatible with any t₀ (vacuous)
|
|
· compat_top — full system [1_F↦u] requires u[i:=0] = t₀
|
|
· compat_mono — if s is compatible with t₀ and φ' ≤ φ, so is (φ', u)
|
|
· System.Typed — packages the typing judgment on the body
|
|
-/
|
|
|
|
import CubicalTransport.Typing
|
|
-- (Typing.lean is below System in the import chain; System cannot be imported
|
|
-- from Typing. The HasType.comp rule uses raw components. This file provides
|
|
-- the System.Valid → HasType.comp convenience bridge.)
|
|
|
|
-- ── System definition ─────────────────────────────────────────────────────────
|
|
|
|
/-- A partial element: a face formula and a body term.
|
|
Represents the term `u` defined wherever `φ` holds. -/
|
|
structure System where
|
|
face : FaceFormula
|
|
body : CTerm
|
|
|
|
-- ── Compatibility ─────────────────────────────────────────────────────────────
|
|
|
|
/-- Compatibility of system `s` with base term `t₀` along dimension `i`.
|
|
Required side-condition for the composition typing rule.
|
|
Meaning: on the face where both `s.face` and `(i = 0)` hold,
|
|
the body of s substituted at i=0 equals t₀. -/
|
|
def System.CompatAt0 (s : System) (i : DimVar) (t₀ : CTerm) : Prop :=
|
|
∀ env : DimVar → Bool,
|
|
s.face.eval env = true →
|
|
env i = false →
|
|
CTerm.substDimBool i false s.body = t₀
|
|
|
|
-- ── Compatibility lemmas ──────────────────────────────────────────────────────
|
|
|
|
/-- The empty system [0_F↦u] is compatible with any t₀.
|
|
The face 0_F never holds, so the condition is vacuous. -/
|
|
theorem System.compat_bot (i : DimVar) (u t₀ : CTerm) :
|
|
System.CompatAt0 { face := .bot, body := u } i t₀ := by
|
|
intro env hbot _
|
|
simp [FaceFormula.eval] at hbot
|
|
|
|
/-- The full system [1_F↦u] requires u[i:=0] = t₀.
|
|
The face 1_F always holds, so the condition must hold for every env. -/
|
|
theorem System.compat_top_iff (i : DimVar) (u t₀ : CTerm) :
|
|
System.CompatAt0 { face := .top, body := u } i t₀ ↔
|
|
CTerm.substDimBool i false u = t₀ := by
|
|
constructor
|
|
· intro h
|
|
-- apply at any env with env i = false
|
|
have := h (fun _ => false) rfl rfl
|
|
exact this
|
|
· intro heq env _ _
|
|
exact heq
|
|
|
|
/-- The meet system [φ ∧ ψ ↦ u] is compatible if the ψ-system is.
|
|
(Monotonicity: a stronger face formula still satisfies compat.) -/
|
|
theorem System.compat_mono (i : DimVar) (u t₀ : CTerm)
|
|
(φ ψ : FaceFormula)
|
|
(hs : System.CompatAt0 { face := ψ, body := u } i t₀) :
|
|
System.CompatAt0 { face := .meet φ ψ, body := u } i t₀ := by
|
|
intro env hmeet hi
|
|
simp only [FaceFormula.eval, Bool.and_eq_true] at hmeet
|
|
exact hs env hmeet.2 hi
|
|
|
|
/-- If we tighten the face (φ' entails φ), compat is preserved. -/
|
|
theorem System.compat_entails (i : DimVar) (u t₀ : CTerm)
|
|
(φ φ' : FaceFormula)
|
|
(hent : FaceFormula.Entails φ' φ)
|
|
(hs : System.CompatAt0 { face := φ, body := u } i t₀) :
|
|
System.CompatAt0 { face := φ', body := u } i t₀ := by
|
|
intro env hφ' hi
|
|
exact hs env (hent env hφ') hi
|
|
|
|
-- ── Typed system ──────────────────────────────────────────────────────────────
|
|
|
|
/-- A typed system: the body has the 1-end type of the line.
|
|
In the comp rule, the system provides the "target" elements on the face φ. -/
|
|
structure System.Typed (Γ : Ctx) (s : System) (L : DimLine) : Prop where
|
|
body_typed : HasType Γ s.body L.at1
|
|
|
|
-- ── Typed system lemmas ───────────────────────────────────────────────────────
|
|
|
|
/-- Construct a typed system with face `.bot`. The face is irrelevant to the
|
|
`System.Typed` structure — the body must still be typed at `L.at1`. -/
|
|
theorem System.typed_bot (Γ : Ctx) (u : CTerm) (L : DimLine) :
|
|
HasType Γ u L.at1 →
|
|
System.Typed Γ { face := .bot, body := u } L :=
|
|
fun h => { body_typed := h }
|
|
|
|
/-- Weakening for typed systems. -/
|
|
theorem System.Typed.weaken (x : String) (B : CType) (Γ : Ctx)
|
|
(s : System) (L : DimLine)
|
|
(hs : System.Typed Γ s L) :
|
|
System.Typed ((x, B) :: Γ) s L :=
|
|
{ body_typed := HasType.weaken x B hs.body_typed }
|
|
|
|
-- ── Joint compatibility + typing ──────────────────────────────────────────────
|
|
|
|
/-- Package compat and typing together — this is what the comp typing rule needs. -/
|
|
structure System.Valid (Γ : Ctx) (s : System) (L : DimLine) (i : DimVar) (t₀ : CTerm) : Prop where
|
|
typed : System.Typed Γ s L
|
|
compat : System.CompatAt0 s i t₀
|
|
|
|
/-- The empty system is valid for any t₀, given a body typed at L.at1. -/
|
|
theorem System.valid_bot (Γ : Ctx) (u : CTerm) (L : DimLine) (i : DimVar) (t₀ : CTerm)
|
|
(hu : HasType Γ u L.at1) :
|
|
System.Valid Γ { face := .bot, body := u } L i t₀ :=
|
|
{ typed := { body_typed := hu }
|
|
compat := System.compat_bot i u t₀ }
|
|
|
|
-- ── Bridge: System.Valid → HasType.comp ──────────────────────────────────────
|
|
|
|
/-- Convert a System.Valid proof into the raw HasType.comp judgment.
|
|
This is the ergonomic entry point: package everything in System.Valid,
|
|
then call this to produce the typed composition term. -/
|
|
theorem HasType.comp_of_valid
|
|
(Γ : Ctx) (L : DimLine) (s : System) (t₀ : CTerm)
|
|
(ht : HasType Γ t₀ L.at0)
|
|
(hv : System.Valid Γ s L L.binder t₀) :
|
|
HasType Γ (.comp L.binder L.body s.face s.body t₀) L.at1 :=
|
|
HasType.comp L ht hv.typed.body_typed hv.compat
|