OctiveLean/Core/Preservation.lean — the TOC analogue of TGC's
preservation. Statement:
HasType Γ e T ∧ HasTypeEnv env Γ ∧ BigStep env e v env'
⟹ HasTypeV v T ∧ HasTypeEnv env' Γ
No heap-typing extension (Octave has no heap). Γ is unchanged across
big-steps (assign requires x already typed).
Three structural changes were required to make preservation provable
under env-mutation, all small:
* letIn semantics shifted to scope-restoring: BigStep.letInR now
returns env1 (the env after evaluating the bound expression)
rather than env2 (after the body). This drops body's mutations
at scope-end, matching the lambda-calculus tradition. Determinism
and Eval updated to match.
* HasTypeV.vClos uses a two-part premise (he_dom + he_typed)
instead of nested ∃ — the kernel rejects nested inductive
parameters with locally-bound vars. The two parts are equivalent
to HasTypeEnv via the new HasTypeV.vClos_to_env inversion lemma.
* Inversion via HasTypeV.vClos_to_env exposes the closure's typing
context as an existential — preservation's appR case uses this
to construct the body's HasTypeEnv via extend_letIn.
The cross-language symmetry that emerged:
TGC preservation : threads heap-typings, weakens via extension.
TOC preservation : threads env directly, no extension needed.
In both, the rule cases collapse into the same three structural
shapes — terminal, IH-chain, contradiction-collapse. The case bodies
differ in HOW state is propagated (heap-typing for TGC, env for TOC)
but the SHAPE of each case is identical. That's the cross-language
abstraction speaking.
Zero sorries / axioms / admits across both projects.
25 lines
684 B
Text
25 lines
684 B
Text
import OctiveLean.Error
|
|
import OctiveLean.AST
|
|
import OctiveLean.Value
|
|
import OctiveLean.Env
|
|
import OctiveLean.Lexer
|
|
import OctiveLean.Parser
|
|
import OctiveLean.Eval
|
|
import OctiveLean.Builtins
|
|
import OctiveLean.REPL
|
|
import OctiveLean.PureEval
|
|
import OctiveLean.BigStep
|
|
import OctiveLean.ValueEquiv
|
|
import OctiveLean.PlotData
|
|
import OctiveLean.PlotSVG
|
|
import OctiveLean.PlotWidget
|
|
import OctiveLean.PlotBuiltins
|
|
import OctiveLean.DSL
|
|
import OctiveLean.Corpus
|
|
import OctiveLean.Core.Syntax
|
|
import OctiveLean.Core.Semantics
|
|
import OctiveLean.Core.Determinism
|
|
import OctiveLean.Core.Eval
|
|
import OctiveLean.Core.Types
|
|
import OctiveLean.Core.TypeSoundness
|
|
import OctiveLean.Core.Preservation
|