| sk0 = fs ', is_fskey(sk0), r -- mkfs(class, ty, fieldvar) ' ∈ st, okval(val, ty), r ∈ st, okval(st[r -- mkfs(class, ty, fieldvar) '], ty) ⊦ mkfs(class, ty, fieldvar) ' = _type, r0 -- sk0 ∈ st[r -- mkfs(class, ty, fieldvar) ', val] ∧ okval(st[r -- mkfs(class, ty, fieldvar) ', val][r0 -- sk0], fs .type) ↔ goodfieldandtype(r0, sk0, st) |
⊦ goodfieldandtype(r, fs ', st) ↔ ¬ ¬ (r -- fs ' ∈ st ∧ okval(st[r -- fs '], fs .type))
r -- mkfs(class, ty, fieldvar) ' ∈ st, okval(val, ty), r ∈ st, okval(st[r -- mkfs(class, ty, fieldvar) '], ty) ⊦ mkfs(class, ty, fieldvar) ' = _type, r0 -- fs ' ∈ st[r -- mkfs(class, ty, fieldvar) ', val] ∧ okval(st[r -- mkfs(class, ty, fieldvar) ', val][r0 -- fs '], fs .type) ↔ r0 -- fs ' ∈ st ∧ okval(st[r0 -- fs '], fs .type)
[[CONCRETESIMPRULES : ([CSIMPSEQ : ⊦ is_fskey(fs ')])]]