You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
proof(L1.D): preservation_l1 body — 29/33 cases closed, 4 admits surface R-weakening gap (#161)
## Summary
Inlines the per-case proof body of \`preservation_l1\` using the three
swarm helpers from L1.A/B/C (all Qed):
- \`value_R_G_preserving_l1\` (L1.A, PR #158)
- \`region_shrink_preserves_typing_l1\` (L1.B, PR #159)
- \`subst_preserves_typing_l1\` (L1.C, PR #160)
After \`induction Hstep; inversion Ht; subst\` + a light automation
chain (econstructor / values_dont_step / EVar-can't-step), 33 subgoals
remain. This change dispatches all 33 explicitly.
## What lands
**29 closed to Qed** via:
- Inline inversion + T_*_L1 reconstruction (10 cases)
- IH-app + reconstructor (12 congruence cases)
- subst_preserves_typing_l1 (5 β-reduction cases: S_Let_Val,
S_LetLin_Val, S_App_Fun, S_Case_Inl, S_Case_Inr)
- region_shrink_preserves_typing_l1 (S_Region_Exit)
- T_Region_Active_L1 re-application (S_Region_Enter, S_Region_Step
positive)
**4 explicit \`admit.\`** — all bound to the same gap class:
**region-env weakening for non-values**.
| Case | Pattern |
|---|---|
| S_StringConcat_Step2 | value v1 left, e2 steps right |
| S_App_Step2 | value v1 (function) left, e2 steps right |
| S_Pair_Step2 | value v1 left, e2 steps right |
| S_Region_Step (¬ In r R0' branch) | outer ERegion must re-type as
T_Region_L1 — body lifted R0' → r::R0' |
All four reduce to: lift a typing across an R0 → R0' shift caused by
inner region steps. This is the **same structural lemma** that bounds
the residual admits in \`region_shrink_preserves_typing_l1_gen\` (tasks
#25/#26 in the project task list).
S_Region_Step's positive case (\`In r R0'\`) closes via
T_Region_Active_L1 + IH — bullet-split using \`in_dec string_dec\`,
leaving only the negative branch as admit.
## Net admit accounting
| Item | Before | After |
|---|---|---|
| \`region_shrink_preserves_typing_l1_gen\` internal admits | 2 | 2 |
| Axiom \`loc_retype_at_R_l1\` | 1 | 1 |
| \`preservation_l1\` body admits | 0 (single Admitted) | 4 |
| Lemma-level \`Admitted.\` | 2 | 2 |
The Admitted at the end of \`preservation_l1\` is unchanged (already
there before). The 4 new admits are **sub-cases** of the same overall
Admitted — the proof body now documents exactly which sub-cases remain.
## Build
\`coqc Semantics_L1.v\` clean. No new axioms; no new \`Admitted.\`
markers.
## Test plan
- [x] \`make\` in formal/ builds clean
- [x] Counterexample.v, TypingL1.v, Semantics.v unchanged (no co-impact)
- [x] No new axioms introduced
## Follow-up
Once the L1.B region-env weakening lemma lands (tasks #25/#26), all four
L1.D admits should discharge by the same structural argument. After
that, \`preservation_l1\` closes to Qed and the file's net admit count
drops to 0 (modulo the loc_retype_at_R_l1 Axiom from L1.C).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
0 commit comments