| st[r -- _type] .type = mkclasstype(class0), class0 ≤ class1, is_valid_ref(str, r, st), mkfs(class, mkclasstype(class1), fieldvar) ' ∈ instfields(class0) ⊦ r = jvmref, validrefs(str, r ' + r ', mkclasstype(class0), st[r -- mkfs(class, mkclasstype(class1), fieldvar) ', refval(r)]), is_obj(str, r, st[r -- mkfs(class, mkclasstype(class1), fieldvar) ', refval(r)]) |
⊦ is_obj(str, r, st) ∧ oktype(val, fs .type, st) ∧ fs ' ≠ _type → is_obj(str, r, st[r -- fs ', val])
[[CONCRETESIMPRULES : ([CSIMPSEQ : ⊦ mkfs(class, ty, fieldvar) .type = ty], [CSIMPSEQ : ⊦ oktype (val, mkclasstype(class1), st) ↔ is_referencevalue(val)], [CSIMPSEQ : ⊦ is_referencevalue(refval(r))], [CSIMPSEQ : ⊦ mkfs (class1, mkclasstype(class0), fieldvar) ' ≠ _type], [CSIMPSEQ : ⊦ ¬ is_obj(str, r, st) → ( is_valid_ref(str, r, st) ↔ is_array(str, r, st))], [CSIMPSEQ : ⊦ st[r -- _type] .type = mkclasstype(class) → ¬ is_array(str, r, st)])], [EXTRATERMS : (refval(r), mkfs(class, mkclasstype(class1), fieldvar), st, r, str)]]