| is_obj(str, r, st[r -- mkfs(class, mkclasstype(class1), fieldvar) ', refval(r)]) ∧ (st[r -- mkfs(class, mkclasstype(class1), fieldvar) ', refval(r)][r -- _type]) .type ≤ mkclasstype(class0), st[r -- _type] .type = mkclasstype(class0), mkfs(class, mkclasstype(class1), fieldvar) ' ∈ instfields(class0), is_valid_ref(str, r, st), class0 ≤ class1 ⊦ r = jvmref, r ' = [] ∨ (∃ fs. fs ' ∈ instfields((st[r -- mkfs(class, mkclasstype(class1), fieldvar) ', refval(r)][r -- _type]) .type .class) ∧ is_referencevalue(st[r -- mkfs(class, mkclasstype(class1), fieldvar) ', refval(r)][r -- fs ']) ∧ r ' .first = (st[r -- mkfs(class, mkclasstype(class1), fieldvar) ', refval(r)][r -- fs ']) .refval ∧ validrefs(str, r ', fs .type, st[r -- mkfs(class, mkclasstype(class1), fieldvar) ', refval(r)])) |
st[r -- _type] .type = mkclasstype(class0), is_obj(str, r, st[r -- mkfs(class, mkclasstype(class1), fieldvar) ', refval(r)]), is_valid_ref(str, r, st), mkfs(class, mkclasstype(class1), fieldvar) ' ∈ instfields(class0), class0 ≤ class1 ⊦ r = jvmref, ∃ fs. fs ' ∈ instfields(class0) ∧ is_referencevalue(st[r -- mkfs(class, mkclasstype(class1), fieldvar) ', refval(r)][r -- fs ']) ∧ r = (st[r -- mkfs(class, mkclasstype(class1), fieldvar) ', refval(r)][r -- fs ']) .refval ∧ validrefs(str, r ', fs .type, st[r -- mkfs(class, mkclasstype(class1), fieldvar) ', refval(r)])
[[CONCRETESIMPRULES : ([CSIMPSEQ : ⊦ mkclasstype(class) .class = class], [CSIMPSEQ : ⊦ class ≤ class], [CSIMPSEQ : ⊦ mkclasstype(class1) ≤ mkclasstype(class2) ↔ class1 ≤ class2], [CSIMPFORWARD : ⊦ ty ≤ mkclasstype(class1) ∧ class1 ≤ class → ty ≤ mkclasstype(class)], [CSIMPSEQ : ⊦ r ' .first = r], [CSIMPSEQ : ⊦ (st[ r0 -- mkfs (class, mkclasstype(class0), fieldvar) ', val] [r -- _type ] ) = st[r -- _type]], [CSIMPSEQ : ⊦ r ' ≠ []])]]