| st[(r ' + refs) .last -- _type] .type = mkclasstype(class), validrefs(str, r ' + refs, mkclasstype(`java.lang.Object' .class), st), validrefs(str, r ' + refs + r0 ', mkclasstype(`java.lang.Object' .class), st), is_valid_ref(str, r, st), validrefs(str, (r ' + refs) .last ' + r0 ', mkclasstype(class), st), is_obj(str, (r ' + refs) .last, st) ⊦ r = r0, r = jvmref, (r ' + refs) .last = jvmref, ∃ fs. fs ' ∈ instfields(class) ∧ is_referencevalue(st[(r ' + refs) .last -- fs ']) ∧ st[(r ' + refs) .last -- fs '] .refval = r0 |
⊦ is_obj(str, r, st) ∧ st[r -- _type] .type ≤ ty → ( validrefs(str, r ' + refs, ty, st) ↔ refs = [] ∨ (∃ fs. fs ' ∈ instfields(st[r -- _type] .type .class) ∧ is_referencevalue(st[r -- fs ']) ∧ refs .first = st[r -- fs '] .refval ∧ validrefs(str, refs, fs .type, st)))
is_obj(str, (r ' + refs) .last, st) ∧ st[(r ' + refs) .last -- _type] .type ≤ mkclasstype(class), st[(r ' + refs) .last -- _type] .type = mkclasstype(class), validrefs(str, r ' + refs, mkclasstype(`java.lang.Object' .class), st), validrefs(str, r ' + refs + r0 ', mkclasstype(`java.lang.Object' .class), st), is_valid_ref(str, r, st), r0 ' = [] ∨ (∃ fs. fs ' ∈ instfields(st[(r ' + refs) .last -- _type] .type .class) ∧ is_referencevalue(st[(r ' + refs) .last -- fs ']) ∧ r0 ' .first = st[(r ' + refs) .last -- fs '] .refval ∧ validrefs(str, r0 ', fs .type, st)), is_obj(str, (r ' + refs) .last, st) ⊦ r = r0, r = jvmref, (r ' + refs) .last = jvmref, ∃ fs. fs ' ∈ instfields(class) ∧ is_referencevalue(st[(r ' + refs) .last -- fs ']) ∧ st[(r ' + refs) .last -- fs '] .refval = r0
[[CONCRETESIMPRULES : ([CSIMPSEQ : ⊦ mkclasstype(class1) ≤ mkclasstype(class2) ↔ class1 ≤ class2], [CSIMPSEQ : ⊦ class ≤ class])], [EXTRATERMS : (st, mkclasstype(class), r0 ', (r ' + refs) .last, str)]]