| st[r0 -- _type] .type = mkarraytype(ty), 0 ≤ i, 0 < st[r0 -- _length] .intval, validref(str, r2, ty, st), i < st[r0 -- _length] .intval, path∃(str, r, r0, st), path∃(str, r, r1, st[r0 -- i ', refval(r2)]), r2 = jvmref → is_reftype(ty) ⊦ r0 = jvmref, path∃(str, r2, r1, st), path∃(str, r, r1, st) |
⊦ r ≠ r0 → (path∃(str, r, r0, st) ↔ (∃ refs. refs ≠ [] ∧ refs .first = r ∧ refs .last = r0 ∧ ¬ dups(refs) ∧ validrefs(str, refs, st[r -- _type] .type, st)))
⊦ path∃(str, r, r, st) ↔ r = jvmref ∨ r ≠ jvmref ∧ is_valid_ref(str, r, st)
⊦ ¬ is_valid_ref(str, r, st) ∧ r ≠ jvmref → ¬ path∃(str, r, r1, st)
r ≠ r1, st[r0 -- _type] .type = mkarraytype(ty), 0 ≤ i, 0 < st[r0 -- _length] .intval, validref(str, r2, ty, st), i < st[r0 -- _length] .intval, path∃(str, r, r0, st), ∃ refs. refs ≠ [] ∧ refs .first = r ∧ refs .last = r1 ∧ ¬ dups(refs) ∧ validrefs(str, refs, (st[r0 -- i ', refval(r2)][r -- _type]) .type, st[r0 -- i ', refval(r2)]), r2 = jvmref → is_reftype(ty) ⊦ r0 = jvmref, path∃(str, r2, r1, st), path∃(str, r, r1, st)
[[CONCRETESIMPRULES : ()], [EXTRATERMS : (st[r0 -- i ', refval(r2)], r1, r, str)]]