| 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 |
st[(r ' + refs) .last -- _type] .type = mkclasstype(class), is_obj(str, (r ' + refs) .last, st), is_valid_ref(str, r, st), validrefs(str, r ' + refs + st[(r ' + refs) .last -- fs '] .refval ', mkclasstype(`java.lang.Object' .class), st), validrefs(str, r ' + refs, mkclasstype(`java.lang.Object' .class), st), validrefs(str, st[(r ' + refs) .last -- fs '] .refval ', fs .type, st), is_referencevalue(st[(r ' + refs) .last -- fs ']), fs ' ∈ instfields(class) ⊦ (r ' + refs) .last = jvmref, r = jvmref, r = st[(r ' + refs) .last -- fs '] .refval, ∃ fs0. fs0 ' ∈ instfields(class) ∧ is_referencevalue(st[(r ' + refs) .last -- fs0 ']) ∧ st[(r ' + refs) .last -- fs0 '] .refval = st[(r ' + refs) .last -- fs '] .refval
[[CONCRETESIMPRULES : ([CSIMPSEQ : ⊦ class ≤ class], [CSIMPSEQ : ⊦ mkclasstype(class1) ≤ mkclasstype(class2) ↔ class1 ≤ class2], [CSIMPSEQ : ⊦ mkclasstype(class) .class = class], [CSIMPSEQ : ⊦ r ' .first = r], [CSIMPSEQ : ⊦ r ' ≠ []])]]