| ⊦ r ≠ r0 → (reachable(r, r0, H) ↔ r ≠ null ∧ r ∈ H ∧ (∃ r1. H[r].nxt = r1 ∧ r1 ∈ H ∧ r1 ≠ null ∧ reachable(r1, r0, H))) |
r0 ∈ H, reachable(r, r0, H), r ∈ H ⊦ r = r0, H[r].nxt = null, r = null, H[r].nxt ∈ H
Used simplifier rules: fromnext-reachable: ⊦ reachable(r, r0, H) ∧ r ≠ r0 → (¬ reachable(H[r].nxt, r0, H) ↔ false);%fromnext-reachable-rev: ⊦ reachable(H[r].nxt, r0, H) ∧ r ≠ r0 ∧ r ≠ null ∧ r ∈ H → (¬ reachable(r, r0, H) ↔ false);%reach-alloc: ⊦ reachable(r, r1, H) → r1 ∈ H;%notnull-reachable: ⊦ ¬ reachable(null, r1, H);%startnotinH-notreachable: ⊦ ¬ r ∈ H → (reachable(r, r0, H) ↔ false);%id-reachable: ⊦ H[r].nxt = null → (reachable(r, r0, H) ↔ ¬ ¬(r ∈ H ∧ r ≠ null ∧ r = r0));