| ∀ sk, class, ty, fieldvar, val, st, r, r0. sk .fs = mkfs(class, ty, fieldvar) ∧ oktype(val, ty, st) ∧ goodfieldandtype(r, sk, st) → sk = _type ∨ (goodfieldsandtypes(r0, sks0, st[r -- sk, val]) ↔ goodfieldsandtypes(r0, sks0, st)), sk .fs = mkfs(class, ty, fieldvar), oktype(val, ty, st), goodfieldandtype(r, sk, st) ⊦ sk = _type, goodfieldsandtypes(r0, sk0 + sks0, st[r -- sk, val]) ↔ goodfieldsandtypes(r0, sk0 + sks0, st) |
⊦ goodfieldsandtypes(r, sk ' + sks, st) ↔ goodfieldandtype(r, sk, st) ∧ goodfieldsandtypes(r, sks, st)
⊦ goodfieldsandtypes(r, sk ' + sks, st) ↔ ¬ ¬ (goodfieldandtype(r, sk, st) ∧ goodfieldsandtypes(r, sks, st))
sk .fs = mkfs(class, ty, fieldvar), oktype(val, ty, st), goodfieldandtype(r, sk, st), ∀ sk, class, ty, fieldvar, val, st, r, r0. sk .fs = mkfs(class, ty, fieldvar) ∧ oktype(val, ty, st) ∧ goodfieldandtype(r, sk, st) → sk = _type ∨ (goodfieldsandtypes(r0, sks0, st[r -- sk, val]) ↔ goodfieldsandtypes(r0, sks0, st)) ⊦ sk = _type, goodfieldandtype(r0, sk0, st[r -- sk, val]) ∧ goodfieldsandtypes(r0, sks0, st[r -- sk, val]) ↔ goodfieldandtype(r0, sk0, st) ∧ goodfieldsandtypes(r0, sks0, st)
[[CONCRETESIMPRULES : ([CSIMPSEQ : ⊦ (sks + sks0) + sks1 = sks + sks0 + sks1], [CSIMPSEQ : ⊦ sk + sks = sk ' + sks])]]