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/agda/CNO.agda`|**type-checks clean** — 0 postulates, 0 holes, 0 unsolved metas. This is the file `echo-types` depends on (`depend: absolute-zero`). |
25
+
|`proofs/coq/common/CNO.v`|**compiles clean** (one cosmetic `non-recursive fixpoint` warning on `verification_complexity` base case). |
26
+
27
+
## Soundness fix (semantic change — deliberate)
28
+
29
+
`state_eq` previously required `state_pc s1 = state_pc s2`. But `step`
30
+
advances the program counter for **every** instruction (`step_nop` →
31
+
`S (state_pc s)`). Therefore *no non-empty program could ever satisfy
32
+
`is_CNO`* and `nop_is_cno` was **false as stated** — its old "proof" never
33
+
discharged `s.pc = S s.pc`, which is the real reason `CNO.v` never compiled.
34
+
35
+
**Decision (2026-05-18):**`state_eq` now compares **memory + registers +
36
+
I/O only**; the program counter is control-flow bookkeeping, not an
37
+
observable side effect. This makes the non-trivial CNO claims *genuinely
38
+
provable*. All dependents must be re-verified under the new `state_eq`.
39
+
40
+
## Bugs fixed in `CNO.v`
41
+
42
+
1.`eval_app` (→): relied on inversion-autogenerated name `H3` (Coq-version
43
+
dependent) → rewritten to grab the recursive premise by shape.
44
+
2.`eval_app` (←): same class → re-proved by induction on the derivation.
45
+
3.`state_eq_refl`: dead `unfold mem_eq. reflexivity.` → "No such goal" →
46
+
version-safe finisher.
47
+
4.`cno_composition`: fragile `repeat split` over the 4-way conjunction +
48
+
name reuse → explicit nested `split`, fresh names.
49
+
5.`empty_is_cno`: same idiom → robust; reuses `state_eq_refl`.
50
+
6.`nop_is_cno`: **false** under old `state_eq`; now genuinely provable
51
+
after the PC-exclusion fix; re-proved robustly.
52
+
7.`cno_equiv_sym`: `symmetry` needs a `Symmetric` instance (none) and
53
+
`state_eq_sym` is defined later → inline component-wise flip.
54
+
8.`cno_eval_on_equal_states`: **real logic bug** — both branches
55
+
`exists`-ed the wrong witness (`s'`/`s` instead of the end-state `sx`).
0 commit comments