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
proofs(P06): state step_pop_disjoint_from_type_l1 + partial proof (Admitted) (#280)
## Summary
Closes **P06** from the comprehensive proof inventory (partial — "useful
partial progress, not a stuck session"): STATES the
`step_pop_disjoint_from_type_l1` auxiliary lemma referenced by
`preservation_l1`'s S_StringConcat_Step2 case per
`PRESERVATION-DESIGN.md §4.7` ("L1.G follow-up").
```coq
Lemma step_pop_disjoint_from_type_l1 :
forall mu R e mu' R' e' m G T R_final G',
(mu, R, e) -->> (mu', R', e') ->
has_type_l1 m R G e T R_final G' ->
forall r, In r (Typing.free_regions T) -> In r R -> In r R'.
```
The lemma is `Admitted` (overall marker) but with a *structured* proof
body: the easy cases are Qed-closed, and the hard cases admit with
one-line per-case comments mapping cleanly to follow-up issues (#240 /
#241 / #242). `Print Assumptions step_pop_disjoint_from_type_l1.` is
emitted at file-end to certify the dependency audit.
### Easy cases CLOSED Qed (no internal admit)
- Atomic non-region step rules (R' = R)
- S_Region_Enter (R' = r' :: R)
- S_Region_Exit / Exit_Echo (typing-rule premise `~ In r' (free_regions
T)` discriminates the popped region from `r0`)
- Same-type congruences: S_StringConcat_Step1 / Step2 (with
`value_R_G_preserving_l1` for Step2), S_App_Step1, S_Fst_Step /
Snd_Step, S_Drop_Step (Echo path), S_Copy_Step
- S_Borrow_Step (via `values_dont_step`)
- **PARTIAL** closure on S_Pair_Step1 / Step2 / S_Inl_Step / S_Inr_Step:
the IH-tractable half (Hfree in the matching component's free_regions)
closes; the cross-component half admits.
- **PARTIAL** closure on S_Region_Step: T_Region_Active_L1 /
Active_L1_Echo sub-cases close (body at outer R); T_Region_L1 / L1_Echo
sub-cases admit (body at r' :: R, step at R — MISMATCH).
### Hard cases ADMITTED (10 internal `admit.` lines)
S_Let_Step, S_LetLin_Step, S_App_Step2, S_If_Step, S_Pair_Step1 (T2-only
branch), S_Pair_Step2 (T1-only branch), S_Inl_Step (T2-only branch),
S_Inr_Step (T1-only branch), S_Case_Step, S_Region_Step (T_Region_L1 /
L1_Echo sub-cases).
All ten ride the **same §4.8 lambda-rigidity / variable-typing soundness
gap**: the inner step's typing-rule type `T_inner` is not necessarily
related to outer `T_outer` by `free_regions` inclusion, so an inner step
can pop a region in `free_regions T_outer` without violating any
inner-typing side condition. Concrete blockers tracked at ephapax issues
#240 / #241 / #242.
### Effect on `preservation_l1`
`preservation_l1`'s `admit.` count is **UNCHANGED (1 → 1)**. Rationale:
the lemma being itself `Admitted` means using it in the
S_StringConcat_Step2 case would only *relay* the admit one level up — no
net axiom-count improvement. The commit's value is:
1. The lemma statement crystallises the obligation in mechanised form.
2. The ~70%-Qed sub-proof covers the operationally trivial /
structurally trivial cases.
3. The per-case `admit.` comments map cleanly to follow-up issues #240 /
#241 / #242 (Phase 3b Stage 2 / 3 / 4).
4. The `preservation_l1` header comment is updated to reference the new
lemma.
The "if stuck" escape clause of the original P06 brief explicitly allows
this path:
> If the S_StringConcat_Step2 case turns out to require additional
non-trivial lemmas you didn't expect, STOP after stating the lemma
cleanly. Submit a commit that adds the lemma statement + a precise
structured `Admitted.` body documenting the obstacles you found.
That's what landed here.
## Owner-directive compliance
- ✅ Modifies only `formal/Semantics_L1.v` (post-redesign).
- ✅ DOES NOT TOUCH `Semantics.v` / `Typing.v` / `Counterexample.v`
(sacrosanct legacy).
- ✅ ZERO new `Axiom` declarations.
- ✅ ZERO new admits in any CLOSED lemma; all 10 new admits are inside
the explicitly-Admitted `step_pop_disjoint_from_type_l1`.
- ✅ Per-case `admit.` comments specifically reference Phase 3b Stage 2 /
3 / 4 and ephapax issues #240 / #241 / #242.
- ✅ GPG-signed commit (key `4A03639C…`).
## Build oracle
`just -f formal/Justfile all` GREEN — 12/12 modules compile. `Print
Assumptions step_pop_disjoint_from_type_l1.` is emitted at file end and
shows the lemma as the single new admitted statement (no additional
axioms beyond pre-existing main).
## Admit count audit
```
pre-PR (origin/main): 5 admits across the file
(region_shrink_preserves_typing_l1_gen_m × 2,
region_liveness_at_split_l1_gen × 1,
inline at line ~2014 × 1,
preservation_l1 × 1)
post-PR (this branch): 15 admits across the file
(pre-existing 5 unchanged +
step_pop_disjoint_from_type_l1 × 10)
```
The 10 new admits are NOT scattered — they cluster inside the single new
lemma, each tagged with a specific follow-up issue.
## Test plan
- [x] `cd formal && rm -f build.mk && just all` GREEN locally (12/12
modules)
- [x] `Print Assumptions step_pop_disjoint_from_type_l1.` emitted at
file end
- [x] No new `Axiom` declarations
- [x] No modifications to legacy `Semantics.v` / `Typing.v` /
`Counterexample.v`
- [ ] CI `coq-build.yml` workflow GREEN (will verify on merge attempt)
## Follow-up
Issue to file post-merge: "P06 follow-up: discharge
step_pop_disjoint_from_type_l1's 10 internal admits as §4.8 path (3)
lands". Will link from ephapax#240 / #241 / #242.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
0 commit comments