[Imprint][Data Privacy Statement][E-Mail]

Back to main index. View the specification. View theorem base summary, View theorem base listing, the used properties by spec, the dependency list, the symbol table,

Theorem base for Specification junkrefs

This is a listing of all goals defined over the current specification. Axioms are yellow, proof obligations purple and theorems green. Click on individual names to get more information on the proof.

Name: Sequent: Type:
⊦ junkref(str, r, st) ↔ (∃ refs. refs ≠ [] ∧ refs .first = r ∧ junkrefs(str, refs, st[r -- _type] .type, st)) An Axiom
⊦ is_array(str, r, st) ∧ st[r -- _type] .type ≤ ty → ( junkrefs(str, r ' + refs, ty, st) ↔ refs ≠ [] ∧ (∃ i. 0 ≤ i ∧ i < st[r -- _length] .intval ∧ is_referencevalue(st[r -- i ']) ∧ refs .first = st[r -- i '] .refval ∧ junkrefs(str, refs, st[r -- _type] .type .type, st))) An Axiom
⊦ is_obj(str, r, st) ∧ st[r -- _type] .type ≤ ty → ( junkrefs(str, r ' + refs, ty, st) ↔ refs ≠ [] ∧ (∃ fs. fs ' ∈ instfields(st[r -- _type] .type .class) ∧ is_referencevalue(st[r -- fs ']) ∧ refs .first = st[r -- fs '] .refval ∧ junkrefs(str, refs, fs .type, st))) An Axiom
⊦ r ≠ jvmref ∧ (¬ is_valid_ref(str, r, st) ∨ ¬ st[r -- _type] .type ≤ ty) → junkrefs(str, r ' + refs, ty, st) An Axiom
⊦ r = jvmref → ¬ junkrefs(str, r ' + refs, ty, st) An Axiom
⊦ ¬ junkrefs(str, [], ty, st) An Axiom
⊦ validref(str, r, ty, st) ↔ r = jvmref ∨ st[r -- _type] .type ≤ ty ∧ ¬ junkref(str, r, st) An Axiom
⊦ validrefnotnull(str, r, ty, st) ↔ r ≠ jvmref ∧ validref(str, r, ty, st) An Axiom
⊦ validrefkeynotnull(str, rk, ty, st) ↔ rk ∈ st ∧ validrefvalnotnull(str, st[rk], ty, st) An Axiom
⊦ validrefval(str, val, ty, st) ↔ is_referencevalue(val) ∧ validref(str, val .refval, ty, st) An Axiom
⊦ validrefvalnotnull(str, val, ty, st) ↔ is_referencevalue(val) ∧ validrefnotnull(str, val .refval, ty, st) An Axiom
⊦ validreflist(str, vals, ty, st) ↔ (∀ val. val ∈ vals → is_referencevalue(val) ∧ validref(str, val .refval, ty, st)) An Axiom
⊦ validstatfields(str, st) ↔ (∀ class. tdname∃(str, class) ∧ initdone(class, st) → validfieldlist(str, jvmref, statfields(class), st)) An Axiom
⊦ validmode(str, val, st) ↔ val = noval ∨ is_break_mode(val) ∨ val = return(noval, void_type) ∨ is_return_mode(val) ∧ validref(str, val .refval, val .type, st) ∨ is_throw_mode(val) ∧ val .refval ≠ jvmref ∧ validref(str, val .refval, val .type, st) ∧ val .type ≤ mkclasstype(`java.lang.Throwable' .class) An Axiom
⊦ validmode(str, st) ↔ _mode ∈ st ∧ validmode(str, st[_mode], st) An Axiom
⊦ validfield(str, r, sk, st) ↔ goodfieldandtype(r, sk, st) ∧ type∃(str, sk .fs .type) ∧ sk .fs .type ≠ void_type ∧ (is_reftype(sk .fs .type) → validrefval(str, st[r -- sk], sk .fs .type, st)) An Axiom
⊦ validstatfields(str, class, st) ↔ validfieldlist(str, jvmref, statfields(class), st) An Axiom
⊦ init⊆(str, st, st0) ↔ (∀ class. initdone(class, st) → initdone(class, st0)) ∧ (∀ class. initerror(class, st) → initerror(class, st0)) ∧ (∀ class. ¬ initdone(class, st) ∧ initdone(class, st0) ∧ tdname∃(str, class) → validstatfields(str, statfields(class), st0)) ∧ (∀ class, sk. initdone(class, st) ∧ initdone(class, st0) ∧ tdname∃(str, class) ∧ sk ∈ statfields(class) ∧ validstatfield(str, sk, st) → validstatfield(str, sk, st0)) An Axiom
⊦ valid⊆(str, st, st0) ↔ (∀ r, ty. validref(str, r, ty, st) → validref(str, r, ty, st0)) ∧ (∀ r. ¬ r ∈ st ∧ r ∈ st0 → ¬ junkref(str, r, st0)) An Axiom
⊦ validval(str, val, ty, st) ↔ okval(val, ty) ∧ (is_referencevalue(val) → validrefval(str, val, ty, st)) An Axiom
⊦ junkrefs(str, vals, st) ↔ (∃ r. refval(r) ∈ vals ∧ junkref(str, r, st)) An Axiom
⊦ validfieldinits(str, fis, st) ↔ (∀ sk, val. sk × val ∈ fis → is_fskey(sk) ∧ type∃(str, sk .fs .type) ∧ validval(str, val, sk .fs .type, st)) An Axiom
⊦ validfieldlist(str, r, sks, st) ↔ (∀ sk. sk ∈ sks → validfield(str, r, sk, st)) An Axiom
⊦ validstatfields(str, sks, st) ↔ (∀ sk. sk ∈ sks → validstatfield(str, sk, st)) An Axiom
⊦ validstatfield(str, sk, st) ↔ is_fskey(sk) ∧ sk ∈ statfields(sk .fs .class) ∧ tdname∃(str, sk .fs .class) ∧ (initdone(sk .fs .class, st) → validfield(str, jvmref, sk, st)) An Axiom
⊦ same-subclasses(class, str, str0) ↔ (∀ class0. class∃(str0, class0) ∧ class0 ≤ class → class∃(str, class0)) ∧ (∀ class0. interface∃(str0, class0) ∧ class0 ≤ class → interface∃(str, class0)) An Axiom
⊦ level⊆(str, str0) ↔ (∀ class. class∃(str, class) → class∃(str0, class)) ∧ (∀ class. interface∃(str, class) → interface∃(str0, class)) An Axiom
⊦ validvals(str, rkvs, st) ↔ (∀ rkv. rkv ∈ rkvs → validval(str, rkv .1, rkv .2, st)) An Axiom
⊦ validval(str, r -- sk, val, st) ↔ (is_fskey(sk) → validval(str, val, sk .fs .type, st) ∧ sk .fs .type ≠ void_type ∧ sk ≠ _length) ∧ (is_indexkey(sk) → validval(str, val, st[r -- _type] .type .type, st)) An Axiom
⊦ okbytearray(r, st) → ¬ junkref(str, r, st) A User Theorem
⊦ validfieldinits(str, fis, st) ∧ fis .keys = statfields(class) ∧ initundone(class, st) ∧ class ≠ `java.lang.Object' .class → init⊆(str, st, addclass(class, fis, st)) A User Theorem
⊦ init⊆(str, st, st0) ∧ validfieldinits(str, fis, st0) ∧ fis .keys = statfields(class) ∧ initundone(class, st0) ∧ class ≠ `java.lang.Object' .class → init⊆(str, st, addclass(class, fis, st0)) A User Theorem
⊦ init⊆(str, st, st0) ∧ newref(r, st0) → init⊆(str, st, addobj(r, class, fis, st0)) A User Theorem
⊦ newref(r, st0) → init⊆(str, st0, addobj(r, class, fis, st0)) A User Theorem
⊦ init⊆(str, st, st0) ∧ init(str0, st) → init(str0, st0) A User Theorem
⊦ init⊆(str, st, st0) ∧ init(str, st) → init(str, st0) A User Theorem
⊦ init⊆(str, st, st0) ∧ initdone(class, st) → initdone(class, st0) A User Theorem
⊦ ¬ initdone(class, st) → init⊆(str, st, st[jvmref -- mkfs(class, void_type, `initstate' .field) ', initval(error)]) A User Theorem
⊦ init⊆(str, st, st0) ∧ ¬ initdone(class, st0) → init⊆(str, st, st0[jvmref -- mkfs(class, void_type, `initstate' .field) ', initval(error)]) A User Theorem
⊦ ¬ initdone(class, st) ∧ class ≠ `java.lang.Object' .class ∧ ¬ mkfs(class, void_type, `initstate' .field) ' ∈ fis → init⊆(str, st, addclass(class, fis + (mkfs(class, void_type, `initstate' .field) ' × initval(error)) ', st)) A User Theorem
⊦ init⊆(str, st, st0) ∧ ¬ initdone(class, st0) ∧ class ≠ `java.lang.Object' .class ∧ ¬ mkfs(class, void_type, `initstate' .field) ' ∈ fis → init⊆(str, st, addclass(class, fis + (mkfs(class, void_type, `initstate' .field) ' × initval(error)) ', st0)) A User Theorem
⊦ init⊆(str, st, st0) ∧ ¬ initdone(class, st) → init⊆(str, st, st0[jvmref -- mkfs(class, void_type, `initstate' .field) ', initval(error)]) A User Theorem
⊦ init⊆(str, st, st0[_mode, val]) ↔ init⊆(str, st, st0) A User Theorem
⊦ init⊆(str, st, st[_mode, val]) A User Theorem
⊦ init⊆(str, st[_mode, val], st) A User Theorem
⊦ validstatfield(str, rk .key, st0[rk, val]) ∧ init⊆(str, st, st0) ∧ rk .ref = jvmref ∧ (¬ is_fskey(rk .key) ∨ rk .key .fs .type ≠ void_type ∨ rk .key .fs .field ≠ `initstate' .field ∧ rk ≠ _uninit) → init⊆(str, st, st0[rk, val]) A User Theorem
⊦ init⊆(str, st, st0) ∧ (¬ rk .key ∈ statfields(rk .key .fs .class) ∨ ¬ tdname∃(str, rk .key .fs .class)) ∧ rk .ref = jvmref ∧ is_fskey(rk .key) ∧ (rk .key .fs .type ≠ void_type ∨ rk .key .fs .field ≠ `initstate' .field ∧ rk ≠ _uninit) → init⊆(str, st, st0[rk, val]) A User Theorem
⊦ init⊆(str, st, st0) → init⊆(str, st, st0[jvmref -- mkfs(class, int_type, fieldvar) ', intval(i)]) A User Theorem
⊦ init⊆(str, st, st) A User Theorem
⊦ init⊆(str, st, st0) ∧ init⊆(str, st0, st1) → init⊆(str, st, st1) A User Theorem
⊦ init⊆(str, st, st0) ∧ validstatfield(str, sk, st) → validstatfield(str, sk, st0) A User Theorem
⊦ init⊆(str, st, st0) ∧ validstatfields(str, sks, st) → validstatfields(str, sks, st0) A User Theorem
⊦ level⊆(str, str0) ∧ is_valid_ref(str, r, st) → is_valid_ref(str0, r, st) A User Theorem
⊦ st[r -- _type] .type = mkarraytype(abstract_type) ∧ r ≠ jvmref → junkref(str, r, st) A User Theorem
⊦ junkref(str, r, addclass(class, fis, st)) ↔ junkref(str, r, st) A User Theorem
⊦ newref(r, st) ∧ (∀ val. val ∈ vals → ¬ junkref(str, val .refval, st) ∧ is_referencevalue(val) ∧ (val .refval ≠ jvmref → st[val .refval -- _type] .type ≤ ty)) ∧ is_classtype(ty) ∧ class∃(str, ty .class) → ¬ junkref(str, r, addarray(r, ty, vals, st)) A User Theorem
⊦ ¬ junkref(str, r, st) ∧ newref(r0, st) → ¬ junkref(str, r, addarray(r0, ty, i, st)) A User Theorem
⊦ type∃(str, ty) ∧ r ≠ jvmref ∧ 0 ≤ i ∧ ty .jtelemtype ≠ abstract_type ∧ ty .jtelemtype ≠ void_type → ¬ junkref(str, r, addarray(r, ty, i, st)) A User Theorem
⊦ validreflist(str, vals, ty, st) ∧ newref(r, st) ∧ type∃(str, ty) ∧ is_reftype(ty) ∧ ty .jtelemtype ≠ abstract_type ∧ ty .jtelemtype ≠ void_type → ¬ junkref(str, r, addarray(r, ty, vals, st)) A User Theorem
⊦ ¬ junkref(str, r, st) ∧ newref(r0, st) → ¬ junkref(str, r, addarray(r0, ty0, vals, st)) A User Theorem
⊦ ¬ junkref(str, r, st) ∧ newref(r0, st) ∧ fs .type = mkarraytype(byte_type) ∧ is_bytelist(vals) → ¬ junkref(str, r, addarray(r0, byte_type, vals, st)[r1 -- fs ', refval(r0)]) A User Theorem
⊦ (∀ val. val ∈ vals → okprimtype(val, ty0)) ∧ is_primtype(ty0) → ¬ junkref(str, r, addarray(r, ty0, vals, st)) A User Theorem
⊦ ¬ junkref(str, r, addarray(r, byte_type, mkjavavalues(bytes), st)) A User Theorem
⊦ ¬ junkref(str, r, st) ∧ newref(r0, st) → ¬ junkref(str, r, addobj(r0, class, fis, st)) A User Theorem
⊦ newref(r, st) ∧ class+∃(str, class) ∧ fis .keys = instfields(class) ∧ validfieldinits(fis, st) ∧ ¬ is_abstract(class) ∧ (∀ sk, r1. sk × refval(r1) ∈ fis → ¬ junkref(str, r1, st)) → ¬ junkref(str, r, addobj(r, class, fis, st)) A User Theorem
⊦ is_array(str, r, st) → ( junkref(str, r, st) ↔ (∃ i. 0 ≤ i ∧ i < st[r -- _length] .intval ∧ is_referencevalue(st[r -- i ']) ∧ st[r -- i '] .refval ≠ jvmref ∧ (¬ st[st[r -- i '] .refval -- _type] .type ≤ st[r -- _type] .type .type ∨ junkref(str, st[r -- i '] .refval, st)))) A User Theorem
⊦ ¬ is_classtype(st[r -- _type] .type) ∧ ¬ is_arraytype(st[r -- _type] .type) → (junkref(str, r, st) ↔ r ≠ jvmref) A User Theorem
⊦ is_obj(str, r, st) → ( junkref(str, r, st) ↔ (∃ fs. fs ' ∈ instfields(st[r -- _type] .type .class) ∧ is_referencevalue(st[r -- fs ']) ∧ st[r -- fs '] .refval ≠ jvmref ∧ (¬ st[st[r -- fs '] .refval -- _type] .type ≤ fs .type ∨ junkref(str, st[r -- fs '] .refval, st)))) A User Theorem
⊦ is_obj(str, r, st) → ( junkref(str, r, st) ↔ (∃ fs. fs ' ∈ instfields(st[r -- _type] .type .class) ∧ (is_reftype(fs .type) ∨ fs .type = abstract_type) ∧ st[r -- fs '] .refval ≠ jvmref ∧ (¬ is_referencevalue(st[r -- fs ']) ∨ ¬ st[st[r -- fs '] .refval -- _type] .type ≤ fs .type ∨ junkref(str, st[r -- fs '] .refval, st)))) A User Theorem
⊦ is_obj(str, r, st) → ( junkref(str, r, st) ↔ (∃ fs. fs ' ∈ instfields(st[r -- _type] .type .class) ∧ is_reftype(fs .type) ∧ st[r -- fs '] .refval ≠ jvmref ∧ (¬ is_referencevalue(st[r -- fs ']) ∨ ¬ st[st[r -- fs '] .refval -- _type] .type ≤ fs .type ∨ junkref(str, st[r -- fs '] .refval, st)))) A User Theorem
⊦ ¬ is_obj(r, class, st) ∧ st[r -- _type] .type ≤ mkclasstype(class) ∧ st[r -- _type] .type = mkclasstype(class) ∧ r ≠ jvmref → junkref(str, r, st) A User Theorem
⊦ r ≠ jvmref ∧ st[r -- mkfs(class0, ty, fieldvar) '] = refval(r3) ∧ mkfs(class0, ty, fieldvar) ' ∈ instfields(class) ∧ st[r -- _type] .type = mkclasstype(class) ∧ ¬ junkref(str, r, st) → is_reftype(ty) A User Theorem
⊦ r ≠ jvmref ∧ ¬ is_valid_ref(str, r, st) → junkref(str, r, st) A User Theorem
⊦ ¬ is_array(str, r, st) ∧ st[r -- _type] .type = mkarraytype(ty) → (junkref(str, r, st) ↔ r ≠ jvmref) A User Theorem
⊦ is_array(r3, st) ∧ st[r3 -- i '] .refval ≠ jvmref ∧ 0 ≤ i ∧ i < st[r3 -- _length] .intval ∧ is_referencevalue(st[r3 -- i ']) ∧ ¬ junkref(str, r3, st) → type∃(str, st[st[r3 -- i '] .refval -- _type] .type) A User Theorem
⊦ ¬ r -- _type ∈ st → (junkref(str, r, st) ↔ r ≠ jvmref) A User Theorem
⊦ level⊆(str, str0) ∧ ¬ junkref(str, r, st) → ¬ junkref(str0, r, st) A User Theorem
⊦ level⊆(str, str0) ∧ ¬ junkref(str, r, st) → (junkref(str0, r, st) ↔ false) A User Theorem
⊦ newref(r, st) → junkref(str, r, st) A User Theorem
⊦ ¬ is_reftype(st[r -- _type] .type) ∧ r ≠ jvmref → junkref(str, r, st) A User Theorem
⊦ ¬ has_classtype(st[r -- _type] .type) ∧ r ≠ jvmref → (junkref(str, r, st) ↔ junkref(str0, r, st)) A User Theorem
⊦ ¬ has_classtype(st[r -- _type] .type) ∧ r ≠ jvmref ∧ ¬ junkref(str, r, st) → ¬ junkref(str0, r, st) A User Theorem
⊦ ¬ is_array(r, st) ∧ st[r -- _type] .type = mkarraytype(ty) → (junkref(str, r, st) ↔ r ≠ jvmref) A User Theorem
⊦ ¬ okreftype(refval(r), ty, st) ∧ st[r -- _type] .type ≤ ty ∧ type∃(str, st[r -- _type] .type) → junkref(str, r, st) A User Theorem
⊦ ¬ okreftype(refval(r), ty, st) ∧ (st[r -- _type] .type ≤ ty ∨ ¬ type∃(str, st[r -- _type] .type)) → junkref(str, r, st) A User Theorem
⊦ ¬ is_valid_ref(r, st) ∧ r ≠ jvmref → junkref(str, r, st) A User Theorem
⊦ ¬ is_valid_ref(str, r, st) ∧ r ≠ jvmref → junkref(str, r, st) A User Theorem
⊦ ¬ r ∈ st → (junkref(str, r, st) ↔ r ≠ jvmref) A User Theorem
⊦ ¬ type∃(str, st[r -- _type] .type) ∧ r ≠ jvmref → junkref(str, r, st) A User Theorem
⊦ ¬ junkref(str, jvmref, st) A User Theorem
⊦ okarray(val, byte_type, i, st) ∧ is_referencevalue(val) → ¬ junkref(str, val .refval, st) A User Theorem
⊦ ¬ junkref(str, r, st) ∧ st[r -- _type] .type = mkarraytype(byte_type) ∧ r ≠ jvmref → (¬ okbytearray(r, st) ↔ false) A User Theorem
⊦ is_predefined_class(class) ∧ newref(r, st) → ¬ junkref(str, r, addobj(r, class, [], st)) A User Theorem
⊦ ¬ has_classtype(st[r -- _type] .type) → (junkref(str, r, st) ↔ junkref(str1, r, st)) A User Theorem
⊦ ¬ has_classtype(st[r -- _type] .type) ∧ junkref(str, r, st) → junkref(str1, r, st) A User Theorem
⊦ is_primtype(ty) ∧ st[r -- _type] = typeval(mkarraytype(ty)) → (junkref(str, r, st) ↔ junkref(str1, r, st)) A User Theorem
⊦ ¬ is_referencevalue(val) ∧ ¬ junkref(str, r, st) ∧ okval(val, st[r1 -- _type] .type .type) → ¬ junkref(str, r, st[r1 -- i ', val]) A User Theorem
⊦ ¬ junkref(str, r, st) ∧ fs .type = mkarraytype(byte_type) ∧ is_array(r0, st) ∧ st[r0 -- _type] = typeval(mkarraytype(byte_type)) → ¬ junkref(str, r, st[r1 -- fs ', refval(r0)]) A User Theorem
⊦ ¬ junkref(str, r, st) ∧ fs ' ≠ _type ∧ is_arraytype(st[r0 -- _type] .type) ∧ fs ' ≠ _length → ¬ junkref(str, r, st[r0 -- fs ', val]) A User Theorem
⊦ ¬ junkref(str, r, st) ∧ ¬ is_array(str, r0, st) → ¬ junkref(str, r, st[r0 -- i ', val]) A User Theorem
⊦ ¬ junkref(str, r, st) ∧ fs ' ≠ _type ∧ is_classtype(st[r0 -- _type] .type) ∧ ¬ fs ' ∈ instfields(st[r0 -- _type] .type .class) → ¬ junkref(str, r, st[r0 -- fs ', val]) A User Theorem
⊦ ¬ junkref(str, r, st) ∧ ¬ (is_typevalue(st[r0 -- _type]) ∧ is_reftype(st[r0 -- _type] .type)) → ¬ junkref(str, r, st[r0 -- fs ', val]) A User Theorem
⊦ ¬ junkref(str, r0, st) ∧ ¬ junkref(str, r, st) ∧ is_obj(r, st) ∧ st[r0 -- _type] .type ≤ fs .type ∧ fs ' ∈ instfields(st[r -- _type] .type .class) ∧ r0 ≠ jvmref → ¬ junkref(str, r, st[r -- fs ', refval(r0)]) A User Theorem
⊦ ¬ is_referencevalue(val) ∧ ¬ junkref(str, r, st) ∧ is_fskey(sk) ∧ oktype(val, sk .fs .type, st) ∧ sk .fs .type ≠ void_type ∧ sk ≠ _length → ¬ junkref(str, r, st[r1 -- sk, val]) A User Theorem
⊦ ¬ is_referencevalue(val) ∧ ¬ junkref(str, r, st) ∧ is_fskey(sk) ∧ okval(val, sk .fs .type) ∧ sk .fs .type ≠ void_type ∧ sk ≠ _length → ¬ junkref(str, r, st[r1 -- sk, val]) A User Theorem
⊦ okval(st[r1 -- sk], sk .fs .type) ∧ r1 -- sk ∈ st ∧ ¬ is_referencevalue(val) ∧ is_fskey(sk) ∧ okval(val, sk .fs .type) ∧ sk .fs .type ≠ void_type ∧ sk ≠ _length → (junkref(str, r, st[r1 -- sk, val]) ↔ junkref(str, r, st)) A User Theorem
⊦ ¬ junkref(str, r, st) ∧ is_reftype(fs .type) → ¬ junkref(str, r, st[r0 -- fs ', refval(jvmref)]) A User Theorem
⊦ ¬ junkref(str, r, st) ∧ validref(str, r1, ty, st) ∧ ty ≤ fs .type ∧ is_reftype(fs .type) → ¬ junkref(str, r, st[r0 -- fs ', refval(r1)]) A User Theorem
⊦ ¬ junkref(str, r, st) ∧ validref(str, r1, ty, st) ∧ mkarraytype(ty) ≤ st[r0 -- _type] .type ∧ r0 ≠ jvmref ∧ is_arraytype(st[r0 -- _type] .type) ∧ (r1 = jvmref → is_reftype(ty)) → ¬ junkref(str, r, st[r0 -- i ', refval(r1)]) A User Theorem
⊦ ¬ junkref(str, r, st) → ¬ junkref(str, r, st[jvmref -- sk, val]) A User Theorem
⊦ junkref(str, r, st[jvmref -- sk, val]) → junkref(str, r, st) A User Theorem
⊦ rk1 .ref = jvmref ∧ r ≠ jvmref → (junkref(str, r, st[rk1, val]) ↔ junkref(str, r, st)) A User Theorem
⊦ okbytearray(r2, st) ∧ junkref(`docs2store', r, putByteArray(bytes1, r2, i, st)) → junkref(`docs2store', r, st) A User Theorem
⊦ okbytearray(r0, st) ∧ ¬ junkref(str, r, st) → ¬ junkref(str, r, putByteArray(bytes, r0, i, st)) A User Theorem
⊦ junkref(str, r, st) ↔ r ≠ jvmref ∧ ¬ is_valid_ref(str, r, st) ∨ r ≠ jvmref ∧ is_obj(str, r, st) ∧ (∃ fs. fs ' ∈ instfields(st[r -- _type] .type .class) ∧ is_referencevalue(st[r -- fs ']) ∧ st[r -- fs '] .refval ≠ jvmref ∧ (¬ st[st[r -- fs '] .refval -- _type] .type ≤ fs .type ∨ junkref(str, st[r -- fs '] .refval, st))) ∨ r ≠ jvmref ∧ is_array(str, r, st) ∧ (∃ i. 0 ≤ i ∧ i < st[r -- _length] .intval ∧ is_referencevalue(st[r -- i ']) ∧ st[r -- i '] .refval ≠ jvmref ∧ (¬ st[st[r -- i '] .refval -- _type] .type ≤ st[r -- _type] .type .type ∨ junkref(str, st[r -- i '] .refval, st))) A User Theorem
⊦ junkref(str, r, st) ↔ junkref(str, r, st) ∨ r ≠ jvmref ∧ ¬ is_valid_ref(str, r, st) ∨ r ≠ jvmref ∧ is_obj(str, r, st) ∧ (∃ fs. fs ' ∈ instfields(st[r -- _type] .type .class) ∧ is_referencevalue(st[r -- fs ']) ∧ st[r -- fs '] .refval ≠ jvmref ∧ (¬ st[st[r -- fs '] .refval -- _type] .type ≤ fs .type ∨ junkref(str, st[r -- fs '] .refval, st))) ∨ r ≠ jvmref ∧ is_array(str, r, st) ∧ (∃ i. 0 ≤ i ∧ i < st[r -- _length] .intval ∧ is_referencevalue(st[r -- i ']) ∧ st[r -- i '] .refval ≠ jvmref ∧ (¬ st[st[r -- i '] .refval -- _type] .type ≤ st[r -- _type] .type .type ∨ junkref(str, st[r -- i '] .refval, st))) A User Theorem
⊦ ¬ junkref(str, r, st) ∧ st ⊆ st1 → ¬ junkref(str, r, st1) A User Theorem
⊦ ¬ tdname∃(str, class) ∧ ¬ is_predefined_class(class) ∧ st[r -- _type] .type = mkclasstype(class) → (junkref(str, r, st) ↔ r ≠ jvmref) A User Theorem
⊦ ¬ junkref(str, r, st) → ¬ junkref(str, r, st0 ∪ st) A User Theorem
⊦ st1 .refs ∩ st .refs = ∅ ∧ r ∈ st1 ∧ junkref(str, r, st1 ∪ st) → junkref(str, r, st1) A User Theorem
⊦ ¬ junkref(str, r, st) ∧ r ≠ jvmref → st[r -- _type] ≠ typeval(void_type) A User Theorem
⊦ ¬ junkref(str, r, st) ∧ r ≠ jvmref → st[r -- _type] .type ≠ mkarraytype(void_type) A User Theorem
⊦ ¬ junkrefs(str, [], st) A User Theorem
⊦ junkrefs(str, val ' + vals, st) ↔ is_referencevalue(val) ∧ junkref(str, val .refval, st) ∨ junkrefs(str, vals, st) A User Theorem
⊦ ¬ junkrefs(str, refs, ty, st) ∧ newref(r0, st) → ¬ junkrefs(str, refs, ty, addarray(r0, ty0, vals, st)) A User Theorem
⊦ ¬ junkrefs(str, refs, ty, st) ∧ newref(r0, st) ∧ fs .type = mkarraytype(byte_type) ∧ is_bytelist(vals) → ¬ junkrefs(str, refs, ty, addarray(r0, byte_type, vals, st)[r1 -- fs ', refval(r0)]) A User Theorem
⊦ (∀ val. val ∈ vals → okprimtype(val, ty0)) ∧ mkarraytype(ty0) ≤ ty ∧ is_primtype(ty0) → ¬ junkrefs(str, r ' + refs, ty, addarray(r, ty0, vals, st)) A User Theorem
⊦ ¬ junkrefs(str, refs, ty, st) ∧ newref(r0, st) → ¬ junkrefs(str, refs, ty, addobj(r0, class, fis, st)) A User Theorem
⊦ junkrefs(str, refs, ty, st) → junkrefs(str, refs + refs0, ty, st) A User Theorem
⊦ junkrefs(str, r ' + refs, mkarraytype(byte_type), st) ↔ r ≠ jvmref ∧ ¬ okbytearray(r, st) A User Theorem
⊦ junkrefs(str, refs, ty, st -- r) ∧ ¬ r ∈ refs → junkrefs(str, refs, ty, st) A User Theorem
⊦ ¬ junkrefs(str, refs, ty, st) ∧ ¬ r ∈ refs → ¬ junkrefs(str, refs, ty, st -- r) A User Theorem
⊦ junkrefs(str, refs, ty, st) → junkrefs(str, refs, ty, st -- r) A User Theorem
⊦ refs = [] → ¬ junkrefs(str, refs, ty, st) A User Theorem
⊦ refs ≠ [] ∧ refs .first ≠ jvmref → junkrefs(str, refs, int_type, st) A User Theorem
⊦ ¬ junkref(str, r, st) → (junkrefs(str, r ' + refs0, st[r -- _type] .type, st) ↔ false) A User Theorem
⊦ level⊆(str, str0) ∧ ¬ junkrefs(str, refs, ty, st) → ¬ junkrefs(str0, refs, ty, st) A User Theorem
⊦ level⊆(str, str0) ∧ ¬ junkrefs(str, refs, ty, st) → (junkrefs(str0, refs, ty, st) ↔ false) A User Theorem
⊦ newref(r, st) → (junkrefs(str, refs + r ' + refs0, ty, st) ↔ junkrefs(str, refs + r ', ty, st)) A User Theorem
⊦ newref(r, st) → junkrefs(str, r ', ty, st) A User Theorem
⊦ newref(r, st) → junkrefs(str, r ' + refs, ty, st) A User Theorem
⊦ newref(r, st) → (¬ junkrefs(str, r ' + refs, ty, st) ↔ false) A User Theorem
⊦ newref(r, st) → (¬ junkrefs(str, r ', ty, st) ↔ false) A User Theorem
⊦ ¬ r ∈ st → (junkrefs(str, refs + r ' + refs0, ty, st) ↔ junkrefs(str, refs + r ', ty, st)) A User Theorem
⊦ ¬ r ∈ st → (junkrefs(str, r ' + refs, ty, st) ↔ r ≠ jvmref) A User Theorem
⊦ ¬ r ∈ st → (junkrefs(str, r ', ty, st) ↔ r ≠ jvmref) A User Theorem
⊦ junkrefs(str, refs + r ' + refs0, ty, st -- r) ↔ junkrefs(str, refs + r ', ty, st -- r) A User Theorem
⊦ junkrefs(str, refs + jvmref ' + refs0, ty, st) ↔ junkrefs(str, refs, ty, st) A User Theorem
⊦ ¬ junkrefs(str, jvmref ' + refs, ty, st) A User Theorem
⊦ refs .first = jvmref ∧ refs ≠ [] → ¬ junkrefs(str, refs, ty, st) A User Theorem
⊦ junkrefs(str, r ', ty, st) ↔ r ≠ jvmref ∧ (¬ is_valid_ref(str, r, st) ∨ ¬ st[r -- _type] .type ≤ ty) A User Theorem
⊦ is_primtype(ty) → (junkrefs(str, r ' + refs, mkarraytype(ty), st) ↔ r ≠ jvmref ∧ ¬ okarray(r, ty, st)) A User Theorem
⊦ ¬ is_referencevalue(val) ∧ ¬ junkrefs(str, refs, ty, st) ∧ okval(val, st[r1 -- _type] .type .type) → ¬ junkrefs(str, refs, ty, st[r1 -- i ', val]) A User Theorem
⊦ ¬ junkrefs(str, refs, ty, st) ∧ fs .type = mkarraytype(byte_type) ∧ is_array(r0, st) ∧ st[r0 -- _type] = typeval(mkarraytype(byte_type)) → ¬ junkrefs(str, refs, ty, st[r1 -- fs ', refval(r0)]) A User Theorem
⊦ ¬ junkrefs(str, refs, ty, st) ∧ fs ' ≠ _type ∧ is_arraytype(st[r0 -- _type] .type) ∧ fs ' ≠ _length → ¬ junkrefs(str, refs, ty, st[r0 -- fs ', val]) A User Theorem
⊦ ¬ junkrefs(str, refs, ty, st) ∧ ¬ is_array(str, r0, st) → ¬ junkrefs(str, refs, ty, st[r0 -- i ', val]) A User Theorem
⊦ ¬ junkrefs(str, refs, ty, st) ∧ fs ' ≠ _type ∧ is_classtype(st[r0 -- _type] .type) ∧ ¬ fs ' ∈ instfields(st[r0 -- _type] .type .class) → ¬ junkrefs(str, refs, ty, st[r0 -- fs ', val]) A User Theorem
⊦ ¬ junkrefs(str, refs, ty, st) ∧ ¬ (is_typevalue(st[r0 -- _type]) ∧ is_reftype(st[r0 -- _type] .type)) → ¬ junkrefs(str, refs, ty, st[r0 -- fs ', val]) A User Theorem
⊦ ¬ is_referencevalue(val) ∧ ¬ junkrefs(str, refs, ty, st) ∧ is_fskey(sk) ∧ oktype(val, sk .fs .type, st) ∧ sk .fs .type ≠ void_type ∧ sk ≠ _length → ¬ junkrefs(str, refs, ty, st[r1 -- sk, val]) A User Theorem
⊦ ¬ is_referencevalue(val) ∧ ¬ junkrefs(str, refs, ty, st) ∧ is_fskey(sk) ∧ okval(val, sk .fs .type) ∧ sk .fs .type ≠ void_type ∧ sk ≠ _length → ¬ junkrefs(str, refs, ty, st[r1 -- sk, val]) A User Theorem
⊦ okval(st[r1 -- sk], sk .fs .type) ∧ r1 -- sk ∈ st ∧ ¬ is_referencevalue(val) ∧ is_fskey(sk) ∧ okval(val, sk .fs .type) ∧ sk .fs .type ≠ void_type ∧ sk ≠ _length → (junkrefs(str, refs, ty, st[r1 -- sk, val]) ↔ junkrefs(str, refs, ty, st)) A User Theorem
⊦ ¬ r ∈ refs → (junkrefs(str, refs, ty, st[r -- sk, val]) ↔ junkrefs(str, refs, ty, st)) A User Theorem
⊦ ¬ r ∈ refs ∧ r -- fs ' ∈ st ∧ oktype(st[r -- fs '], fs .type, st) ∧ oktype(val, fs .type, st) ∧ fs ' ≠ _length ∧ fs ' ≠ _type → (junkrefs(str, refs + r ', ty, st[r -- fs ', val]) ↔ junkrefs(str, refs + r ', ty, st)) A User Theorem
⊦ ¬ junkrefs(str, refs, ty, st) ∧ is_obj(r, st) ∧ is_reftype(fs .type) ∧ fs ' ∈ instfields(st[r -- _type] .type .class) → ¬ junkrefs(str, refs, ty, st[r -- fs ', refval(jvmref)]) A User Theorem
⊦ ¬ junkrefs(str, refs, ty, st) ∧ is_reftype(fs .type) → ¬ junkrefs(str, refs, ty, st[r -- fs ', refval(jvmref)]) A User Theorem
⊦ ¬ junkrefs(str, refs, ty, st) ∧ r ≠ jvmref ∧ is_reftype(st[r -- _type] .type .type) → ¬ junkrefs(str, refs, ty, st[r -- i ', refval(jvmref)]) A User Theorem
⊦ ¬ junkrefs(str, refs, ty, st) ∧ ¬ junkref(str, r0, st) ∧ is_obj(r, st) ∧ st[r0 -- _type] .type ≤ fs .type ∧ r0 ≠ jvmref ∧ fs ' ∈ instfields(st[r -- _type] .type .class) → ¬ junkrefs(str, refs, ty, st[r -- fs ', refval(r0)]) A User Theorem
⊦ ¬ junkrefs(str, refs, ty, st) ∧ ¬ junkref(str, r0, st) ∧ st[r0 -- _type] .type ≤ fs .type ∧ r0 ≠ jvmref ∧ fs .type ≠ void_type ∧ fs ' ≠ _length → ¬ junkrefs(str, refs, ty, st[r -- fs ', refval(r0)]) A User Theorem
⊦ ¬ junkrefs(str, refs, ty, st) ∧ ¬ junkref(str, r0, st) ∧ mkarraytype(st[r0 -- _type] .type) ≤ st[r -- _type] .type ∧ r ≠ jvmref ∧ r0 ≠ jvmref → ¬ junkrefs(str, refs, ty, st[r -- i ', refval(r0)]) A User Theorem
⊦ ¬ junkrefs(str, refs, ty, st) → ¬ junkrefs(str, refs, ty, st[jvmref -- sk, val]) A User Theorem
⊦ junkrefs(str, refs, ty, st) → junkrefs(str, refs, ty, st[jvmref -- sk, val]) A User Theorem
⊦ junkrefs(str, r ' + refs, st[r -- _type] .type, st) → junkrefs(str, r ' + refs, ty, st) A User Theorem
⊦ ¬ junkrefs(str, r ' + refs, st[r -- _type] .type, st) ∧ r ≠ jvmref → (junkrefs(str, r ' + refs, ty, st) ↔ ¬ st[r -- _type] .type ≤ ty) A User Theorem
⊦ junkrefs(str, r ' + refs, st[r -- _type] .type, st) ∧ st[r -- _type] .type ≤ ty ∧ r ≠ jvmref → junkrefs(str, r ' + refs, ty, st) A User Theorem
⊦ is_obj(refs .first, st) ∧ ¬ junkrefs(str, refs, st[refs .first -- _type] .type, st) ∧ refs ≠ [] → ¬ junkrefs(str, refs, mkclasstype(`java.lang.Object' .class), st) A User Theorem
⊦ st ⊆ st1 ∧ junkrefs(str, refs, ty, st1) → junkrefs(str, refs, ty, st) A User Theorem
⊦ junkrefs(str, refs, ty0, st) ∧ ty ≤ ty0 → junkrefs(str, refs, ty, st) A User Theorem
⊦ junkrefs(str, r ' + refs, st[r -- _type] .type, st) ∧ st[r -- _type] .type ≤ ty0 → junkrefs(str, r ' + refs, ty0, st) A User Theorem
⊦ r ≠ jvmref ∧ ¬ junkrefs(str, r + refs, ty, st) → r -- _type ∈ st A User Theorem
⊦ (∃ st0. st1 = st0 ∪ st) ∧ junkrefs(str, refs, ty, st1) → junkrefs(str, refs, ty, st) A User Theorem
⊦ st1 .refs ∩ st .refs = ∅ ∧ r ∈ st1 ∧ junkrefs(str, r ' + refs0, ty, st1 ∪ st) → junkrefs(str, r ' + refs0, ty, st1) A User Theorem
level⊆(str, str0) ⊦ ∀ ty. type∃(str, ty) → type∃(str0, ty) A User Theorem
⊦ class+∃(str, class) ∧ level⊆(str, str0) → (¬ class+∃(str0, class) ↔ false) A User Theorem
⊦ class∃(str, class) ∧ level⊆(str, str0) → (¬ class∃(str0, class) ↔ false) A User Theorem
⊦ level⊆(str, str0) ∧ class+∃(str, class) → ¬ interface∃(str0, class) A User Theorem
⊦ level⊆(str, str0) ∧ interface∃(str, class) → ¬ class+∃(str0, class) A User Theorem
⊦ is_array(str, r, st) ∧ level⊆(str, str0) → (¬ is_array(str0, r, st) ↔ false) A User Theorem
⊦ is_obj(str, r, st) ∧ level⊆(str, str0) → (¬ is_obj(str0, r, st) ↔ false) A User Theorem
⊦ level⊆(str, str) A User Theorem
⊦ tdname∃(str, class) ∧ ¬ tdname∃(str0, class) → ¬ level⊆(str, str0) A User Theorem
⊦ level⊆(str, str0) ∧ level⊆(str0, str1) → level⊆(str, str1) A User Theorem
⊦ type∃(str, ty) ∧ ¬ type∃(str0, ty) → ¬ level⊆(str, str0) A User Theorem
⊦ ¬ junkref(str, r, st) ∧ r ≠ jvmref → (¬ type∃(str, st[r -- _type] .type) ↔ false) A User Theorem
⊦ ¬ junkref(str, st[r -- sks] .refval, st) ∧ st[r -- sks] .refval ≠ jvmref ∧ sks ≠ [] → (¬ type∃(str, st[r -- (sks + _type ')] .type) ↔ false) A User Theorem
⊦ ¬ junkref(str, st[r -- (sk ' + sk0 ')] .refval, st) ∧ st[r -- (sk ' + sk0 ')] .refval ≠ jvmref → (¬ type∃(str, st[r -- (sk ' + sk0 ' + _type ')] .type) ↔ false) A User Theorem
⊦ ¬ okbytearray(st[rk] .refval, st) → ¬ validrefkeynotnull(str, rk, mkarraytype(byte_type), st) A User Theorem
⊦ ¬ okbytearray(r, st) → ¬ validrefnotnull(str, r, mkarraytype(byte_type), st) A User Theorem
⊦ ¬ okbytearray(r, st) ∧ r ≠ jvmref → ¬ validref(str, r, mkarraytype(byte_type), st) A User Theorem
⊦ validvals(str, rkvs, st) ∧ okbytearray(r, st) → okbytearray(r, st[rkvs]) A User Theorem
⊦ validref(str, r, mkarraytype(byte_type), st) ↔ okbytearray(r, st) ∨ r = jvmref A User Theorem
⊦ ¬ class+∃(str, class) ∧ same-subclasses(class, str, str0) → ¬ class+∃(str0, class) A User Theorem
⊦ class∃(str0, class) ∧ ¬ class∃(str, class) → ¬ same-subclasses(class, str, str0) A User Theorem
⊦ class∃(str0, class) ∧ ¬ class∃(str, class) ∧ class ≤ class0 → ¬ same-subclasses(class0, str, str0) A User Theorem
⊦ interface∃(str0, class) ∧ ¬ interface∃(str, class) → ¬ same-subclasses(class, str, str0) A User Theorem
⊦ interface∃(str0, class) ∧ ¬ interface∃(str, class) ∧ class ≤ class0 → ¬ same-subclasses(class0, str, str0) A User Theorem
⊦ ¬ is_array(str, r, st) ∧ is_array(str0, r, st) → ¬ same-subclasses(st[r -- _type] .type .jtelemtype .class, str, str0) A User Theorem
⊦ ¬ is_obj(str, r, st) ∧ is_obj(str0, r, st) → ¬ same-subclasses(st[r -- _type] .type .jtelemtype .class, str, str0) A User Theorem
⊦ same-subclasses(class, str, str) A User Theorem
⊦ same-subclasses(class, str, str0) ∧ class0 ≤ class → same-subclasses(class0, str, str0) A User Theorem
⊦ ¬ tdname+∃(str, class0) ∧ tdname+∃(str0, class0) → ¬ same-subclasses(`java.lang.Object' .class, str, str0) A User Theorem
⊦ ¬ tdname+∃(str, class0) ∧ tdname+∃(str0, class0) ∧ class0 ≤ class → ¬ same-subclasses(class, str, str0) A User Theorem
⊦ ¬ tdname∃(str, class0) ∧ tdname∃(str0, class0) ∧ class0 ≤ class → ¬ same-subclasses(class, str, str0) A User Theorem
⊦ ¬ tdname+∃(str, class0) ∧ tdname+∃(str0, class0) → ¬ same-subclasses(class0, str, str0) A User Theorem
⊦ tdname∃(str0, class) ∧ ¬ tdname∃(str, class) → ¬ same-subclasses(class, str, str0) A User Theorem
⊦ tdname∃(str0, class) ∧ ¬ tdname∃(str, class) ∧ class ≤ class0 → ¬ same-subclasses(class0, str, str0) A User Theorem
⊦ same-subclasses(class, str, str0) ∧ same-subclasses(class, str0, str1) → same-subclasses(class, str, str1) A User Theorem
⊦ ¬ type∃(str, ty) ∧ type∃(str0, ty) ∧ ty ≤ mkclasstype(class) → ¬ same-subclasses(class, str, str0) A User Theorem
⊦ ¬ st[r -- _type] .type ≤ ty → ¬ validrefnotnull(str, r, ty, st) A User Theorem
⊦ validfield(str, r, sk, st) ∧ level⊆(str, str0) → validfield(str0, r, sk, st) A User Theorem
⊦ validfield(str, r, sk, st) ↔ is_fskey(sk) ∧ r -- sk ∈ st ∧ type∃(str, sk .fs .type) ∧ sk .fs .type ≠ void_type ∧ validval(str, st[r -- sk], sk .fs .type, st) A User Theorem
⊦ r ≠ jvmref ∨ sk ≠ sk0 → (validfield(str, r, sk0, st[jvmref -- sk, val]) ↔ validfield(str, r, sk0, st)) A User Theorem
⊦ rk .ref = jvmref ∧ (r ≠ jvmref ∨ rk .key ≠ sk0) → (validfield(str, r, sk0, st[rk, val]) ↔ validfield(str, r, sk0, st)) A User Theorem
⊦ validfield(str, r, sk, st) ∧ st ⊆ st0 → validfield(str, r, sk, st0) A User Theorem
⊦ validfieldinits(str, fis, st) ↔ validfieldinits(fis, st) ∧ ¬ junkrefs(str, fis .vals, st) ∧ (∀ sk. sk ∈ fis → type∃(str, sk .fs .type)) A User Theorem
⊦ validfieldinits(str, [], st) A User Theorem
⊦ junkref(str, r, st) ∧ fis[sk] = refval(r) ∧ sk ∈ fis → ¬ validfieldinits(str, fis, st) A User Theorem
⊦ validfieldinits(str, fv ', st) ↔ is_fskey(fv .1) ∧ type∃(str, fv .1 .fs .type) ∧ validval(str, fv .2, fv .1 .fs .type, st) A User Theorem
⊦ validfieldinits(str, fv ' + fis, st) ↔ is_fskey(fv .1) ∧ validval(str, fv .2, fv .1 .fs .type, st) ∧ type∃(str, fv .1 .fs .type) ∧ validfieldinits(str, fis, st) A User Theorem
⊦ validfieldinits(str, fis, st) → validreflist(str, mkjavavalues(fis .vals .nonnullrefs), mkclasstype(`java.lang.Object' .class), st) A User Theorem
⊦ validfieldlist(str, r, [], st) A User Theorem
⊦ ¬ _mode .key ∈ sks → (validfieldlist(str, jvmref, sks, st[_mode, val]) ↔ validfieldlist(str, jvmref, sks, st)) A User Theorem
⊦ sk ∈ statfields(class) → (validfieldlist(str, jvmref, sk ', st[_mode, val]) ↔ validfieldlist(str, jvmref, sk ', st)) A User Theorem
⊦ validfieldlist(str, r, sk ', st) ↔ validfield(str, r, sk, st) A User Theorem
⊦ rk .ref = jvmref ∧ (r ≠ jvmref ∨ ¬ rk .key ∈ sks) → (validfieldlist(str, r, sks, st[rk, val]) ↔ validfieldlist(str, r, sks, st)) A User Theorem
⊦ validfieldlist(str, r, sk ' + sks, st) ↔ validfield(str, r, sk, st) ∧ validfieldlist(str, r, sks, st) A User Theorem
⊦ st ⊆ st0 ∧ validfieldlist(str, r, sks, st) → validfieldlist(str, r, sks, st0) A User Theorem
⊦ st[_mode] = noval → (validmode(str, st) ↔ _mode ∈ st) A User Theorem
⊦ ¬ _mode ∈ st → ¬ validmode(str, st) A User Theorem
⊦ validmode(str, st) ∧ newref(r, st) → validmode(str, addarray(r, ty, vals, st)) A User Theorem
⊦ class ≠ `java.lang.Object' .class → (validmode(str, addclass(class, fis, st)) ↔ validmode(str, st)) A User Theorem
⊦ newref(r, st) → (validmode(str, addobj(r, class, fis, st)) ↔ validmode(str, st)) A User Theorem
⊦ st[_mode] = noval ∧ rk ≠ _mode → (validmode(str, st[rk, val]) ↔ _mode ∈ st) A User Theorem
⊦ st[_mode] = noval ∧ r ≠ jvmref → (validmode(str, st[r -- sk, val]) ↔ _mode ∈ st) A User Theorem
⊦ ¬ _mode ∈ rkvs ∧ st[_mode] = noval → (validmode(str, st[rkvs]) ↔ validmode(str, st)) A User Theorem
¬ _mode ∈ rkvs ⊦ st[_mode] = noval → (validmode(str, st[rkvs]) ↔ validmode(str, st)) A User Theorem
⊦ rk .ref = jvmref ∧ rk ≠ _mode → (validmode(str, st[rk, val]) ↔ validmode(str, st)) A User Theorem
⊦ jvmref -- sk ≠ _mode → (validmode(str, st[jvmref -- sk, val]) ↔ validmode(str, st)) A User Theorem
str0 ≠ `java.lang.Object' ⊦ validmode(str, st[jvmref -- mkfs(((* str0)) .class, ty, fieldvar) ', val]) ↔ validmode(str, st) A User Theorem
⊦ st ⊆ st0 ∧ validmode(str, st) → validmode(str, st0) A User Theorem
⊦ is_predefined_class(class) ∧ class ≤ `java.lang.Throwable' .class ∧ newref(r, st) → validmode(str, addobj(r, class, [], st)[_mode, throw(r, mkclasstype(class))]) A User Theorem
⊦ newref(r, st) → validmode(str, addobj(r, `java.lang.NullPointerException' .class, [], st)[_mode, throw(r, mkclasstype(`java.lang.NullPointerException' .class))]) A User Theorem
⊦ newref(r, st) → validmode(str, addobj(r, `java.lang.NoClassDefFoundError' .class, [], st)[_mode, throw(r, mkclasstype(`java.lang.NoClassDefFoundError' .class))]) A User Theorem
⊦ validmode(str, st) ∧ is_throw_mode(st[_mode]) → (¬ type∃(str, st[st[_mode] .refval -- _type] .type) ↔ false) A User Theorem
⊦ validref(str, r, ty, addclass(class, fis, st)) ↔ validref(str, r, ty, st) A User Theorem
⊦ newref(r1, st) ∧ validref(str, r, ty1, st) → validref(str, r, ty1, addarray(r1, ty, vals, st)) A User Theorem
⊦ validref(str, r, ty, st) ∧ newref(r0, st) → getintarray(r, addarray(r0, ty, i0, st)) = getintarray(r, st) A User Theorem
⊦ validref(str, r, ty, st) ∧ newref(r0, st) → getintarray(r, i, j, addarray(r0, ty, i0, st)) = getintarray(r, i, j, st) A User Theorem
⊦ validref(str, r, ty, st) ∧ newref(r0, st) → (¬ validref(str, r, ty, addarray(r0, ty0, i, st)) ↔ false) A User Theorem
⊦ validref(str, r, mkarraytype(ty), addarray(r, ty, i, st)) ↔ r = jvmref ∨ 0 ≤ i ∧ type∃(str, ty) ∧ ty .jtelemtype ≠ abstract_type ∧ ty .jtelemtype ≠ void_type A User Theorem
⊦ r ≠ jvmref → (validref(str, r, mkarraytype(int_type), addarray(r, int_type, i, st)) ↔ 0 ≤ i) A User Theorem
⊦ newref(r1, st) ∧ validref(str, r, ty1, st) → validref(str, r, ty1, addobj(r1, class, fis, st)) A User Theorem
⊦ (∀ sk, r1. sk × refval(r1) ∈ fis → ¬ junkref(str, r1, st)) ∧ ¬ _type ∈ fis ∧ class∃(str, class) ∧ type∃(str, ty) ∧ mkclasstype(class) ≤ ty ∧ newref(r, st) ∧ validfieldinits(fis, st) ∧ fis .keys = instfields(class) ∧ ¬ is_abstract(class) ∧ class+∃(str, class) → validref(str, r, ty, addobj(r, class, fis, st)) A User Theorem
⊦ validref(str, r, mkarraytype(ty), st) ∧ r ≠ jvmref → val2int(st[r -- _length]) = st[r -- _length] .intval A User Theorem
⊦ validref(str, r, mkarraytype(ty), st) ∧ r ≠ jvmref → ¬ st[r -- _length] .intval < 0 A User Theorem
⊦ validref(str, r, mkarraytype(ty), st) ∧ r ≠ jvmref → is_integervalue(st[r -- _length]) A User Theorem
str ≠ `java.lang.Object' ⊦ is_array(str0, r, st) → ¬ validref(str0, r, mkclasstype(((* str)) .class), st) A User Theorem
⊦ validref(str, r, mkarraytype(ty), st) ∧ r ≠ jvmref → r -- _length ∈ st A User Theorem
⊦ ¬ r -- i ' ∈ st ∧ r ≠ jvmref ∧ 0 ≤ i ∧ i < st[r -- _length] .intval → ¬ validref(str, r, mkarraytype(ty), st) A User Theorem
⊦ is_array(str, r, st) ∧ st[r -- _type] .type ≤ ty → ( validref(str, r, ty, st) ↔ ¬ (∃ i. 0 ≤ i ∧ i < st[r -- _length] .intval ∧ is_referencevalue(st[r -- i ']) ∧ st[r -- i '] .refval ≠ jvmref ∧ ( ¬ st[st[r -- i '] .refval -- _type] .type ≤ st[r -- _type] .type .type ∨ ¬ validref(str, st[r -- i '] .refval, st[r -- _type] .type .type, st)))) A User Theorem
⊦ ¬ is_referencevalue(st[r -- i ']) ∧ is_reftype(ty) ∧ r ≠ jvmref ∧ 0 ≤ i ∧ i < st[r -- _length] .intval → ¬ validref(str, r, mkarraytype(ty), st) A User Theorem
⊦ is_obj(str, r, st) → ¬ validref(str, r, mkarraytype(ty), st) A User Theorem
⊦ ¬ is_classtype(ty) ∧ ¬ is_arraytype(ty) → (validref(str, r, ty, st) ↔ r = jvmref) A User Theorem
⊦ validref(str, r, mkarraytype(byte_type), st) ↔ r = jvmref ∨ okbytearray(r, st) A User Theorem
⊦ validref(str, r, mkarraytype(byte_type), st) ↔ validref(str0, r, mkarraytype(byte_type), st) A User Theorem
⊦ ¬ validref(str, r, mkarraytype(byte_type), st) → ¬ validref(str0, r, mkarraytype(byte_type), st) A User Theorem
⊦ r ≠ jvmref ∧ st[r -- _type] .type = mkclasstype(class) ∧ (∃ fs. fs ' ∈ instfields(st[r -- _type] .type .class) ∧ (is_reftype(fs .type) ∨ fs .type = abstract_type) ∧ st[r -- fs '] .refval ≠ jvmref ∧ (¬ is_referencevalue(st[r -- fs ']) ∨ ¬ st[r -- (fs ' + _type)] .type ≤ fs .type ∨ ¬ validref(str, st[r -- fs '] .refval, fs .type, st))) → ¬ validref(str, r, ty, st) A User Theorem
⊦ is_obj(str, r, st) ∧ st[r -- _type] .type ≤ ty → ( validref(str, r, ty, st) ↔ ¬ (∃ fs. fs ' ∈ instfields(st[r -- _type] .type .class) ∧ is_referencevalue(st[r -- fs ']) ∧ st[r -- fs '] .refval ≠ jvmref ∧ (¬ st[st[r -- fs '] .refval -- _type] .type ≤ fs .type ∨ ¬ validref(str, st[r -- fs '] .refval, fs .type, st)))) A User Theorem
⊦ is_obj(str, r, st) → ( validref(str, r, ty, st) ↔ st[r -- _type] .type ≤ ty ∧ ¬ (∃ fs. fs ' ∈ instfields(st[r -- _type] .type .class) ∧ is_referencevalue(st[r -- fs ']) ∧ st[r -- fs '] .refval ≠ jvmref ∧ (¬ st[st[r -- fs '] .refval -- _type] .type ≤ fs .type ∨ ¬ validref(str, st[r -- fs '] .refval, fs .type, st)))) A User Theorem
⊦ is_obj(str, r, st) → ( validref(str, r, ty, st) ↔ validref(str, r, ty, st) ∧ st[r -- _type] .type ≤ ty ∧ ¬ (∃ fs. fs ' ∈ instfields(st[r -- _type] .type .class) ∧ is_referencevalue(st[r -- fs ']) ∧ st[r -- fs '] .refval ≠ jvmref ∧ (¬ st[st[r -- fs '] .refval -- _type] .type ≤ fs .type ∨ ¬ validref(str, st[r -- fs '] .refval, fs .type, st)))) A User Theorem
⊦ r ≠ jvmref ∧ validref(str, r, mkclasstype(class), st0) ∧ fs ' ∈ instfields(class) ∧ is_reftype(fs .type) → validref(str, st0[r -- fs '] .refval, fs .type, st0) A User Theorem
⊦ r ≠ jvmref ∧ ¬ validref(str, st0[r -- fs '] .refval, fs .type, st0) ∧ fs ' ∈ instfields(class) ∧ is_reftype(fs .type) → ¬ validref(str, r, mkclasstype(class), st0) A User Theorem
⊦ r ≠ jvmref ∧ validref(str, r, mkarraytype(ty), st0) ∧ 0 ≤ i ∧ i < st0[r -- _length] .intval → validref(str, st0[r -- i '] .refval, ty, st0) A User Theorem
⊦ r ≠ jvmref ∧ ¬ validref(str, st0[r -- i '] .refval, ty, st0) ∧ 0 ≤ i ∧ i < st0[r -- _length] .intval → ¬ validref(str, r, mkarraytype(ty), st0) A User Theorem
⊦ ¬ has_classtype(ty) ∧ validref(str, r, ty, st) → validref(str0, r, ty, st) A User Theorem
⊦ validref(str, r, mkarraytype(int_type), st) → (¬ validref(str, r, mkarraytype(int_type), st[r -- i ', intval(j)]) ↔ false) A User Theorem
⊦ validref(str, r, ty, st) ∧ validref(str, r0, mkarraytype(int_type), st) → (¬ validref(str, r, ty, st[r0 -- i ', intval(j)]) ↔ false) A User Theorem
⊦ r ≠ jvmref ∧ (¬ is_valid_ref(str, r, st) ∨ ¬ st[r -- _type] .type ≤ ty) → ¬ validref(str, r, ty, st) A User Theorem
⊦ r ≠ jvmref ∧ (¬ is_valid_ref(str, r, st) ∨ ¬ st[r -- _type] .type ≤ ty ∧ ¬ type∃(str, st[r -- _type] .type)) → ¬ validref(str, r, ty, st) A User Theorem
⊦ r ≠ jvmref ∧ ¬ is_array(str, r, st) → ¬ validref(str, r, mkarraytype(ty), st) A User Theorem
⊦ ¬ is_arrayref(r, i, st) ∧ i ≤ st[r -- _length] .intval ∧ r ≠ jvmref → ¬ validref(str, r, mkarraytype(ty), st) A User Theorem
⊦ r ≠ jvmref ∧ ¬ is_obj(str, r, st) ∧ class ≠ `java.lang.Object' .class → ¬ validref(str, r, mkclasstype(class), st) A User Theorem
str ≠ `java.lang.Object' ⊦ validref(str0, r, mkclasstype(((* str)) .class), st) → (is_valid_ref(str0, r, st) ↔ is_obj(str0, r, st)) A User Theorem
⊦ junkref(str, r, st) → ¬ validref(str, r, ty, st) A User Theorem
⊦ level⊆(str, str0) ∧ validref(str, r, ty, st) → validref(str0, r, ty, st) A User Theorem
⊦ level⊆(str, str0) ∧ validref(str, r, ty, st) → (¬ validref(str0, r, ty, st) ↔ false) A User Theorem
⊦ validref(str, r, ty, st[_mode, val]) ↔ validref(str, r, ty, st) A User Theorem
⊦ newref(r, st) → ¬ validref(str, r, ty, st) A User Theorem
⊦ validref(str, r, mkarraytype(byte_type), st) ∧ st ⊆ st0 → ¬ newref(r, st0) A User Theorem
⊦ ¬ r -- _length ∈ st → (validref(str, r, mkarraytype(ty), st) ↔ r = jvmref) A User Theorem
str0 ≠ `java.lang.Object' ⊦ ¬ is_obj(str, r, st) → (validref(str, r, mkclasstype(((* str0)) .class), st) ↔ r = jvmref) A User Theorem
⊦ ¬ r -- _type ∈ st → (validref(str, r, ty, st) ↔ r = jvmref) A User Theorem
⊦ ¬ is_reftype(st[r -- _type] .type) ∧ r ≠ jvmref → ¬ validref(str, r, ty, st) A User Theorem
⊦ validref(str, r, ty, st) → (junkrefs(str, r ' + refs, ty, st) ↔ false) A User Theorem
⊦ ¬ tdname+∃(str, class) ∧ st[r -- _type] .type = mkclasstype(class) ∧ r ≠ jvmref → ¬ validref(str, r, ty, st) A User Theorem
⊦ ¬ r ∈ st ∧ r ≠ jvmref → ¬ validref(str, r, ty, st) A User Theorem
⊦ validref(str, jvmref, ty, st) A User Theorem
⊦ ¬ validref(str, r, mkclasstype(`java.lang.Object' .class), st) ∧ r ≠ jvmref → junkref(str, r, st) A User Theorem
⊦ ¬ validref(str, r, mkclasstype(`java.lang.Object' .class), st) ∧ r ≠ jvmref → ¬ validref(str, r, ty, st) A User Theorem
⊦ validref(str, r, mkarraytype(ty), st) ∧ r ≠ jvmref → okarray(r, ty, st) A User Theorem
⊦ validref(str, r, ty, st) ↔ okreftype(refval(r), ty, st) ∧ ¬ junkref(str, r, st) A User Theorem
⊦ is_primtype(ty) → (validref(str, r, mkarraytype(ty), st) ↔ r = jvmref ∨ okarray(r, ty, st)) A User Theorem
⊦ validref(str, r, ty, st) ∧ ( is_fskey(sk) → (is_referencevalue(val) → validref(str, val .refval, sk .fs .type, st) ∧ is_reftype(sk .fs .type)) ∧ (¬ is_referencevalue(val) → is_fskey(sk) ∧ okval(val, sk .fs .type) ∧ sk .fs .type ≠ void_type ∧ sk ≠ _length)) ∧ ( is_indexkey(sk) → ( is_referencevalue(val) → validref(str, val .refval, st[r0 -- _type] .type .type, st) ∧ r0 ≠ jvmref ∧ is_arraytype(st[r0 -- _type] .type) ∧ (val .refval = jvmref → is_reftype(st[r0 -- _type] .type .type))) ∧ (¬ is_referencevalue(val) → okval(val, st[r0 -- _type] .type .type))) → validref(str, r, ty, st[r0 -- sk, val]) A User Theorem
⊦ validref(str, r, ty, st) ∧ ( is_fskey(rk .key) → (is_referencevalue(val) → validref(str, val .refval, rk .key .fs .type, st) ∧ is_reftype(rk .key .fs .type)) ∧ (¬ is_referencevalue(val) → okval(val, rk .key .fs .type) ∧ rk .key .fs .type ≠ void_type ∧ rk .key ≠ _length)) ∧ ( is_indexkey(rk .key) → ( is_referencevalue(val) → validref(str, val .refval, st[rk .ref -- _type] .type .type, st) ∧ rk .ref ≠ jvmref ∧ is_arraytype(st[rk .ref -- _type] .type) ∧ (val .refval = jvmref → is_reftype(st[rk .ref -- _type] .type .type))) ∧ (¬ is_referencevalue(val) → okval(val, st[rk .ref -- _type] .type .type))) → validref(str, r, ty, st[rk, val]) A User Theorem
⊦ validref(str, r, ty, st) ∧ is_indexkey(sk) ∧ ( is_referencevalue(val) → validref(str, val .refval, st[r0 -- _type] .type .type, st) ∧ r0 ≠ jvmref ∧ is_arraytype(st[r0 -- _type] .type) ∧ (val .refval = jvmref → is_reftype(st[r0 -- _type] .type .type))) ∧ (¬ is_referencevalue(val) → okval(val, st[r0 -- _type] .type .type)) → validref(str, r, ty, st[r0 -- sk, val]) A User Theorem
⊦ ¬ is_referencevalue(val) ∧ validref(str, r, ty, st) ∧ okval(val, st[r1 -- _type] .type .type) → validref(str, r, ty, st[r1 -- i ', val]) A User Theorem
⊦ validref(str, r, ty, st) ∧ is_indexkey(sk) ∧ ¬ is_referencevalue(val) ∧ okval(val, st[r0 -- _type] .type .type) → validref(str, r, ty, st[r0 -- sk, val]) A User Theorem
⊦ validref(str, r, ty0, st) ∧ validref(str, r1, ty, st) ∧ mkarraytype(ty) ≤ st[r0 -- _type] .type ∧ r0 ≠ jvmref ∧ is_arraytype(st[r0 -- _type] .type) ∧ (r1 = jvmref → is_reftype(ty)) → validref(str, r, ty0, st[r0 -- i ', refval(r1)]) A User Theorem
⊦ validref(str, r, ty0, st) ∧ validref(str, val .refval, ty, st) ∧ is_referencevalue(val) ∧ mkarraytype(ty) ≤ st[r0 -- _type] .type ∧ r0 ≠ jvmref ∧ is_arraytype(st[r0 -- _type] .type) ∧ (val .refval = jvmref → is_reftype(ty)) → validref(str, r, ty0, st[r0 -- i ', val]) A User Theorem
⊦ validref(str, r, ty0, st) ∧ validref(str, val .refval, st[r0 -- _type] .type .type, st) ∧ is_referencevalue(val) ∧ r0 ≠ jvmref ∧ is_arraytype(st[r0 -- _type] .type) ∧ (val .refval = jvmref → is_reftype(st[r0 -- _type] .type .type)) → validref(str, r, ty0, st[r0 -- i ', val]) A User Theorem
⊦ validref(str, r, ty, st) ∧ is_indexkey(sk) ∧ is_referencevalue(val) ∧ validref(str, val .refval, st[r0 -- _type] .type .type, st) ∧ r0 ≠ jvmref ∧ is_arraytype(st[r0 -- _type] .type) ∧ (val .refval = jvmref → is_reftype(st[r0 -- _type] .type .type)) → validref(str, r, ty, st[r0 -- sk, val]) A User Theorem
⊦ validref(str, r, ty, st) ∧ fs ' ≠ _type ∧ is_arraytype(st[r0 -- _type] .type) ∧ fs ' ≠ _length → validref(str, r, ty, st[r0 -- fs ', val]) A User Theorem
⊦ validref(str, r, ty, st) ∧ ¬ is_array(str, r0, st) → validref(str, r, ty, st[r0 -- i ', val]) A User Theorem
⊦ validref(str, r, ty, st) ∧ fs ' ≠ _type ∧ is_classtype(st[r0 -- _type] .type) ∧ ¬ fs ' ∈ instfields(st[r0 -- _type] .type .class) → validref(str, r, ty, st[r0 -- fs ', val]) A User Theorem
⊦ validref(str, r, ty, st) ∧ ¬ (is_typevalue(st[r0 -- _type]) ∧ is_reftype(st[r0 -- _type] .type)) → validref(str, r, ty, st[r0 -- fs ', val]) A User Theorem
⊦ r ≠ jvmref ∧ sk ≠ _length ∧ sk ≠ _type ∧ sk .fs .type = byte_type ∧ ¬ is_indexkey(sk) ∧ is_bytevalue(st[r -- sk]) ∧ validref(str, r0, ty, st) → validref(str, r0, ty, st[r -- sk, byteval(by)]) A User Theorem
⊦ validref(str, r0, ty0, st) ∧ validref(str, r, ty, st) ∧ is_obj(r, st) ∧ r0 ≠ jvmref ∧ st[r0 -- _type] .type ≤ fs .type ∧ fs ' ∈ instfields(st[r -- _type] .type .class) → validref(str, r, ty, st[r -- fs ', refval(r0)]) A User Theorem
⊦ validref(str, r, ty, st) ∧ is_fskey(sk) ∧ (is_referencevalue(val) → validref(str, val .refval, sk .fs .type, st) ∧ is_reftype(sk .fs .type)) ∧ (¬ is_referencevalue(val) → is_fskey(sk) ∧ okval(val, sk .fs .type) ∧ sk .fs .type ≠ void_type ∧ sk ≠ _length) → validref(str, r, ty, st[r0 -- sk, val]) A User Theorem
⊦ is_referencevalue(val) ∧ validref(str, val .refval, fs .type, st) ∧ validref(str, r, ty, st) ∧ is_reftype(fs .type) → validref(str, r, ty, st[r0 -- fs ', val]) A User Theorem
⊦ is_referencevalue(val) ∧ is_fskey(sk) ∧ validref(str, val .refval, sk .fs .type, st) ∧ validref(str, r, ty, st) ∧ is_reftype(sk .fs .type) → validref(str, r, ty, st[r0 -- sk, val]) A User Theorem
⊦ ¬ is_referencevalue(val) ∧ validref(str, r, ty, st) ∧ is_fskey(sk) ∧ oktype(val, sk .fs .type, st) ∧ sk .fs .type ≠ void_type ∧ sk ≠ _length → validref(str, r, ty, st[r1 -- sk, val]) A User Theorem
⊦ ¬ is_referencevalue(val) ∧ validref(str, r, ty, st) ∧ is_fskey(sk) ∧ okval(val, sk .fs .type) ∧ sk .fs .type ≠ void_type ∧ sk ≠ _length → validref(str, r, ty, st[r1 -- sk, val]) A User Theorem
⊦ okval(st[r1 -- sk], sk .fs .type) ∧ r1 -- sk ∈ st ∧ ¬ is_referencevalue(val) ∧ is_fskey(sk) ∧ okval(val, sk .fs .type) ∧ sk .fs .type ≠ void_type ∧ sk ≠ _length → (validref(str, r, ty, st[r1 -- sk, val]) ↔ validref(str, r, ty, st)) A User Theorem
⊦ validref(str, r, ty, st) ∧ is_reftype(fs .type) → validref(str, r, ty, st[r0 -- fs ', refval(jvmref)]) A User Theorem
⊦ validref(str, r, ty0, st) ∧ validref(str, r1, ty, st) ∧ ty ≤ fs .type ∧ is_reftype(fs .type) → validref(str, r, ty0, st[r0 -- fs ', refval(r1)]) A User Theorem
⊦ r ≠ jvmref ∧ sk ≠ _length ∧ sk .fs .type = short_type ∧ ¬ is_indexkey(sk) ∧ is_shortvalue(st[r -- sk]) ∧ validref(str, r0, ty, st) → validref(str, r0, ty, st[r -- sk, shortval(sho)]) A User Theorem
⊦ rk1 .ref = jvmref ∧ r ≠ jvmref → (validref(str, r, ty1, st[rk1, val]) ↔ validref(str, r, ty1, st)) A User Theorem
⊦ rk1 .ref = jvmref ∧ validref(str, r, ty1, st) → validref(str, r, ty1, st[rk1, val]) A User Theorem
⊦ rk1 .ref = jvmref → (validref(str, r, ty1, st[rk1, val]) ↔ validref(str, r, ty1, st)) A User Theorem
⊦ validref(str, r, ty1, st[jvmref -- sk, val]) ↔ validref(str, r, ty1, st) A User Theorem
⊦ okbytearray(r0, st) ∧ r ≠ r0 ∧ validref(str, r, ty, st) → validref(str, r, ty, putByteArray(bytes, r0, i, st)) A User Theorem
⊦ validvals(str, rkvs, st) ∧ validref(str, r, ty, st) → validref(str, r, ty, st[rkvs]) A User Theorem
⊦ ¬ is_referencevalue(val) ∧ okval(st[r1 -- sk], sk .fs .type) ∧ r1 -- sk ∈ st ∧ is_fskey(sk) ∧ okval(val, sk .fs .type) ∧ sk .fs .type ≠ void_type ∧ sk ≠ _length → (validref(str, r, ty, st[((r1 -- sk) × val) ' + rkvs]) ↔ validref(str, r, ty, st[rkvs])) A User Theorem
⊦ ¬ r ∈ st → (validref(str, r, ty, st) ↔ r = jvmref) A User Theorem
⊦ validref(str, r, st[r -- _type] .type, st) ↔ ¬ junkref(str, r, st) A User Theorem
⊦ validref(str, r, ty, st) ∧ st ⊆ st1 → validref(str, r, ty, st1) A User Theorem
⊦ ¬ junkref(str, r, st) ∧ st ⊆ st0 → (validref(str, r, ty, st0) ↔ validref(str, r, ty, st)) A User Theorem
⊦ class ≤ class1 ∧ validref(str, r, mkclasstype(class1), st0) ∧ st0[r -- _type] = typeval(mkclasstype(class)) → validref(str, r, mkclasstype(class), st0) A User Theorem
⊦ class ≤ class1 ∧ ¬ validref(str, r, mkclasstype(class), st0) ∧ st0[r -- _type] = typeval(mkclasstype(class)) → ¬ validref(str, r, mkclasstype(class1), st0) A User Theorem
⊦ class1 ≤ class ∧ validref(str, r, mkclasstype(class1), st) ∧ type∃(str, mkclasstype(class)) → validref(str, r, mkclasstype(class), st) A User Theorem
⊦ validref(str, r, ty, st) ∧ ty ≤ ty0 → validref(str, r, ty0, st) A User Theorem
⊦ validref(str, r0, ty, st) ∧ newref(r, st) → (¬ validref(str, r0, ty, addobj(r, class, [], st)[_mode, throw(r, mkclasstype(class))]) ↔ false) A User Theorem
⊦ validref(str, r, mkarraytype(int_type), st) ∧ r ≠ jvmref → st[r -- _type] .type = mkarraytype(int_type) A User Theorem
⊦ validref(str, r, ty, st) ∧ st[r -- _type] .type = ty0 → validref(str, r, ty0, st) A User Theorem
⊦ ¬ validref(str, r, ty0, st) ∧ st[r -- _type] .type = ty0 → ¬ validref(str, r, ty, st) A User Theorem
⊦ validref(str, r, ty, st) ∧ r ≠ jvmref → type∃(str, st[r -- _type] .type) A User Theorem
⊦ ¬ type∃(str, st[r -- _type] .type) ∧ r ≠ jvmref → ¬ validref(str, r, ty, st) A User Theorem
⊦ r ≠ jvmref ∧ ¬ st[r -- _type] .type ≤ ty → ¬ validref(str, r, ty, st) A User Theorem
⊦ validref(str, r, ty, st) → validref(str, r, ty, st0 ∪ st) A User Theorem
⊦ validref(str, r, ty, st0) ∧ st0 .refs ∩ st .refs = ∅ → validref(str, r, ty, st0 ∪ st) A User Theorem
⊦ validref(str, r, void_type, st) ↔ r = jvmref A User Theorem
⊦ newref(r1, st) ∧ validrefkeynotnull(str, rk, ty1, st) → validrefkeynotnull(str, rk, ty1, addarray(r1, ty, vals, st)) A User Theorem
⊦ newref(r1, st) ∧ validrefkeynotnull(str, rk, ty1, st) → validrefkeynotnull(str, rk, ty1, addobj(r1, class, fis, st)) A User Theorem
⊦ validrefkeynotnull(str, rk, mkclasstype(class), st) ∧ sk ∈ instfields(class) ∧ is_fskey(sk) → st[rk] .refval -- sk ∈ st A User Theorem
⊦ validrefkeynotnull(str, rk, ty, st) → rk ∈ st A User Theorem
⊦ st[r -- sk] .refval = r ∧ newref(r, st) → ¬ validrefkeynotnull(str, r -- sk, ty, st) A User Theorem
⊦ validrefkeynotnull(str, rk, ty, st) → ¬ newref(st[rk] .refval, st) A User Theorem
⊦ validrefkeynotnull(str, rk, ty, st) → st[rk] .refval ≠ jvmref A User Theorem
⊦ r ≠ jvmref ∧ sk ≠ _length ∧ sk ≠ _type ∧ ¬ is_indexkey(sk) ∧ sk .fs .type = byte_type ∧ is_bytevalue(st[r -- sk]) ∧ validrefkeynotnull(str, rk, ty, st) → validrefkeynotnull(str, rk, ty, st[r -- sk, byteval(by)]) A User Theorem
⊦ r ≠ jvmref ∧ sk ≠ _length ∧ sk .fs .type = short_type ∧ ¬ is_indexkey(sk) ∧ is_shortvalue(st[r -- sk]) ∧ validrefkeynotnull(str, rk, ty, st) → validrefkeynotnull(str, rk, ty, st[r -- sk, shortval(sho)]) A User Theorem
⊦ rk1 .ref = jvmref ∧ rk ≠ rk1 ∧ validrefkeynotnull(str, rk, ty1, st) → validrefkeynotnull(str, rk, ty1, st[rk1, val]) A User Theorem
⊦ validrefkeynotnull(str, r -- sk, ty, st) → st[r -- sk] .refval ∈ st A User Theorem
⊦ validrefkeynotnull(str, jvmref -- fs ', ty, st) ∧ st .refs ∩ st1 .refs = ∅ → ¬ jvmref ∈ st1 A User Theorem
⊦ validrefkeynotnull(str, rk, ty, st) ∧ st ⊆ st1 → validrefkeynotnull(str, rk, ty, st1) A User Theorem
⊦ validrefkeynotnull(str, rk, ty, st) ∧ (∃ st0. st1 = st0 ∪ st) → validrefkeynotnull(str, rk, ty, st1) A User Theorem
⊦ validrefkeynotnull(str, rk, ty, st) → validrefkeynotnull(str, rk, ty, st0 ∪ st) A User Theorem
⊦ validrefkeynotnull(str, r -- fs ', ty, st1) → st1[r -- fs '] = (st ∪ st1)[r -- fs '] A User Theorem
⊦ validrefkeynotnull(str, rk, ty, st1) → st1[rk] = (st ∪ st1)[rk] A User Theorem
⊦ validrefkeynotnull(str, rk, ty, st1) → (st ∪ st1)[rk] = st1[rk] A User Theorem
⊦ validrefkeynotnull(str, rk, ty1, st) → validrefnotnull(str, st[rk] .refval, ty1, st) A User Theorem
⊦ validreflist(str, vals, ty1, st) → validreflist(str, vals, ty1, addarray(newref(st), ty, vals0, st)) A User Theorem
⊦ validreflist(str, [], ty, st) A User Theorem
⊦ validref(str, r, mkarraytype(ty), st) ∧ is_reftype(ty) ∧ r ≠ jvmref → validreflist(str, getarray(r, st), ty, st) A User Theorem
⊦ i < st[r -- _length '] .intval ∧ 0 ≤ i ∧ is_reftype(ty) ∧ validrefnotnull(str, r, mkarraytype(ty), st) → validreflist(str, getarray(r, 0, i, st), ty, st) A User Theorem
⊦ j + i < st[r -- _length '] .intval ∧ 0 ≤ i ∧ 0 ≤ j ∧ is_reftype(ty) ∧ validrefnotnull(str, r, mkarraytype(ty), st) → validreflist(str, getarray(r, j, i, st), ty, st) A User Theorem
⊦ j + i ≤ st[r -- _length '] .intval ∧ 0 ≤ i ∧ 0 ≤ j ∧ is_reftype(ty) ∧ validrefnotnull(str, r, mkarraytype(ty), st) → validreflist(str, getarray(r, j, i, st), ty, st) A User Theorem
⊦ i ≤ st[r -- _length '] .intval ∧ 0 ≤ i ∧ is_reftype(ty) ∧ validrefnotnull(str, r, mkarraytype(ty), st) → validreflist(str, getarray(r, 0, i, st), ty, st) A User Theorem
⊦ ¬ is_classtype(ty) ∧ ¬ is_arraytype(ty) → (validreflist(str, vals, ty, st) ↔ (∀ val. val ∈ vals → val = refval(jvmref))) A User Theorem
⊦ validreflist(str, val ', ty, st) ↔ is_referencevalue(val) ∧ validref(str, val .refval, ty, st) A User Theorem
⊦ validreflist(str, refval(r) ', ty, st) ↔ validref(str, r, ty, st) A User Theorem
⊦ validreflist(str, val ' + vals, ty, st) ↔ is_referencevalue(val) ∧ validref(str, val .refval, ty, st) ∧ validreflist(str, vals, ty, st) A User Theorem
⊦ validreflist(str, refval(r) ' + vals, ty, st) ↔ validref(str, r, ty, st) ∧ validreflist(str, vals, ty, st) A User Theorem
⊦ validreflist(str, vals, ty, st) ∧ ty ≤ ty0 → validreflist(str, vals, ty0, st) A User Theorem
⊦ validref(str, r, ty, st) → (validrefnotnull(str, r, ty, st) ↔ r ≠ jvmref) A User Theorem
⊦ newref(r1, st) ∧ validrefnotnull(str, r, ty1, st) → validrefnotnull(str, r, ty1, addarray(r1, ty, vals, st)) A User Theorem
⊦ newref(r1, st) ∧ ¬ validrefnotnull(str, r, ty1, addarray(r1, ty, vals, st)) → ¬ validrefnotnull(str, r, ty1, st) A User Theorem
⊦ newref(r1, st) ∧ validrefnotnull(str, r, ty1, st) → validrefnotnull(str, r, ty1, addarray(r1, ty, i, st)) A User Theorem
⊦ newref(r1, st) ∧ validrefnotnull(str, r, ty1, st) → validrefnotnull(str, r, ty1, addobj(r1, class, fis, st)) A User Theorem
⊦ validrefnotnull(str, r, mkarraytype(ty), st) → val2int(st[r -- _length]) = st[r -- _length] .intval A User Theorem
⊦ validrefnotnull(str, r, mkarraytype(ty), st) → is_integervalue(st[r -- _length]) A User Theorem
⊦ validrefnotnull(str, r, mkarraytype(ty), st) → ¬ st[r -- _length] .intval < 0 A User Theorem
⊦ st ⊆ st0 ∧ val2int(st[r -- _length]) ≠ st0[r -- _length] .intval → ¬ validrefnotnull(`docs2store', r, mkarraytype(byte_type), st) A User Theorem
⊦ validrefnotnull(str, r, mkarraytype(byte_type), st) ↔ okbytearray(r, st) A User Theorem
⊦ validrefnotnull(str, r, mkarraytype(ty), st) ∧ 0 ≤ i ∧ i + j ≤ st[r -- _length] .intval ∧ st ⊆ st1 → getarray(r, i, j, st) = getarray(r, i, j, st1) A User Theorem
⊦ r = jvmref ∨ ¬ is_valid_ref(str, r, st) ∨ ¬ st[r -- _type] .type ≤ ty ∧ ¬ type∃(str, st[r -- _type] .type) → ¬ validrefnotnull(str, r, ty, st) A User Theorem
⊦ validrefnotnull(str, r, mkarraytype(ty), st) → (¬ is_array(str, r, st) ↔ false) A User Theorem
str ≠ `java.lang.Object' ⊦ validrefnotnull(str0, r, mkclasstype(((* str)) .class), st) → (is_valid_ref(str0, r, st) ↔ is_obj(str0, r, st)) A User Theorem
⊦ junkref(str, r, st) → ¬ validrefnotnull(str, r, ty, st) A User Theorem
⊦ ¬ r -- _length ∈ st → ¬ validrefnotnull(str, r, mkarraytype(ty), st) A User Theorem
⊦ newref(r, st) → ¬ validrefnotnull(str, r, ty, st) A User Theorem
⊦ ¬ r -- _type ∈ st → ¬ validrefnotnull(str, r, ty, st) A User Theorem
⊦ ¬ validrefnotnull(str, r, ty, st) ∧ r ≠ jvmref → ¬ validref(str, r, ty, st) A User Theorem
⊦ validrefnotnull(str, r, ty, st) → r ≠ jvmref A User Theorem
⊦ ¬ validrefnotnull(str, jvmref, ty, st) A User Theorem
⊦ is_primtype(ty) → (validrefnotnull(str, r, mkarraytype(ty), st) ↔ okarray(r, ty, st)) A User Theorem
⊦ r ≠ jvmref ∧ sk ≠ _length ∧ sk ≠ _type ∧ ¬ is_indexkey(sk) ∧ sk .fs .type = byte_type ∧ is_bytevalue(st[r -- sk]) ∧ validrefnotnull(str, r0, ty, st) → validrefnotnull(str, r0, ty, st[r -- sk, byteval(by)]) A User Theorem
⊦ r ≠ jvmref ∧ sk ≠ _length ∧ sk .fs .type = short_type ∧ ¬ is_indexkey(sk) ∧ is_shortvalue(st[r -- sk]) ∧ validrefnotnull(str, r0, ty, st) → validrefnotnull(str, r0, ty, st[r -- sk, shortval(sho)]) A User Theorem
⊦ rk1 .ref = jvmref ∧ r ≠ jvmref ∧ validrefnotnull(str, r, ty1, st) → validrefnotnull(str, r, ty1, st[rk1, val]) A User Theorem
⊦ rk1 .ref = jvmref ∧ r ≠ jvmref ∧ ¬ validrefnotnull(str, r, ty1, st[rk1, val]) → ¬ validrefnotnull(str, r, ty1, st) A User Theorem
⊦ rk1 .ref = jvmref ∧ r ≠ jvmref → (validrefnotnull(str, r, ty1, st[rk1, val]) ↔ validrefnotnull(str, r, ty1, st)) A User Theorem
⊦ okbytearray(r0, st) ∧ r ≠ r0 ∧ validrefnotnull(str, r, ty, st) → validrefnotnull(str, r, ty, putByteArray(bytes, r0, i, st)) A User Theorem
⊦ validrefnotnull(str, r, ty, st) ∧ st ⊆ st1 → validrefnotnull(str, r, ty, st1) A User Theorem
⊦ validrefnotnull(str, r, mkarraytype(int_type), st) → st[r -- _type] .type = mkarraytype(int_type) A User Theorem
⊦ ¬ type∃(str, st[r -- _type] .type) → ¬ validrefnotnull(str, r, ty, st) A User Theorem
⊦ validrefnotnull(str, r, ty, st0) ∧ is_classtype(ty) ∧ sk ∈ instfields(ty .class) ∧ is_fskey(sk) → (st ∪ st0)[r -- sk] = st0[r -- sk] A User Theorem
⊦ ¬ validref(str, r, ty, st) → ¬ validrefnotnull(str, r, ty, st) A User Theorem
⊦ validrefval(str, val, ty, st) ∧ newref(r, st) → validrefval(str, val, ty, addarray(r, ty0, vals, st)) A User Theorem
⊦ validrefval(str, val, ty, st) ∧ newref(r, st) → validrefval(str, val, ty, addobj(r, class, fis, st)) A User Theorem
⊦ junkref(str, val .refval, st) → ¬ validrefval(str, val, ty, st) A User Theorem
⊦ rk .ref = jvmref → (validrefval(str, val, ty, st[rk, val0]) ↔ validrefval(str, val, ty, st)) A User Theorem
⊦ validrefval(str, val, ty, st[jvmref -- sk, val0]) ↔ validrefval(str, val, ty, st) A User Theorem
⊦ validrefval(str, refval(r), ty, st) ↔ validref(str, r, ty, st) A User Theorem
⊦ st ⊆ st0 ∧ validrefval(str, val, ty, st) → validrefval(str, val, ty, st0) A User Theorem
⊦ validrefval(str, val, ty, st) → validrefval(str, val, ty, st0 ∪ st) A User Theorem
⊦ newref(r1, st) ∧ validrefvalnotnull(str, val, ty1, st) → validrefvalnotnull(str, val, ty1, addarray(r1, ty, vals, st)) A User Theorem
⊦ newref(r1, st) ∧ validrefvalnotnull(str, val, ty1, st) → validrefvalnotnull(str, val, ty1, addobj(r1, class, fis, st)) A User Theorem
⊦ rk1 .ref = jvmref ∧ rk ≠ rk1 ∧ validrefvalnotnull(str, val1, ty1, st) → validrefvalnotnull(str, val1, ty1, st[rk1, val]) A User Theorem
⊦ is_fskey(sk) ∧ sk .fs .class ≠ class ∧ class ≠ `java.lang.Object' .class → (validstatfield(str, sk, addclass(class, fis, st)) ↔ validstatfield(str, sk, st)) A User Theorem
⊦ validval(str, fis[sk], sk .fs .type, st) ∧ sk ∈ statfields(class) ∧ tdname∃(str, class) ∧ type∃(str, sk .fs .type) ∧ is_fskey(sk) ∧ sk .fs .class = class ∧ sk ∈ fis ∧ class ≠ `java.lang.Object' .class → validstatfield(str, sk, addclass(class, fis, st)) A User Theorem
⊦ validstatfield(str, sk, st) ∧ newref(r, st) → validstatfield(str, sk, addobj(r, class, fis, st)) A User Theorem
⊦ is_indexkey(sk) → ¬ validstatfield(str, sk, st) A User Theorem
⊦ validstatfields(str, st) ↔ (∀ class, sk. tdname∃(str, class) ∧ initdone(class, st) ∧ sk ∈ statfields(class) → validstatfield(str, sk, st)) A User Theorem
⊦ validstatfield(str, sk, st) ∧ level⊆(str, str0) → validstatfield(str0, sk, st) A User Theorem
⊦ sk ∈ statfields(class) → (validstatfield(str, sk, st[_mode, val]) ↔ validstatfield(str, sk, st)) A User Theorem
⊦ ¬ tdname∃(str, fs .class) ∧ fs .class ≠ `java.lang.Object' .class → ¬ validstatfield(str, fs ', st) A User Theorem
⊦ is_primtype(fs .type) ∧ validstatfield(str, fs ', st) ∧ tdname+∃(str, fs .class) ∧ tdname+∃(str0, fs .class) → validstatfield(str0, fs ', st) A User Theorem
⊦ ¬ is_referencevalue(val) ∧ validstatfield(str, sk, st) ∧ okval(val, st[r1 -- _type] .type .type) → validstatfield(str, sk, st[r1 -- i ', val]) A User Theorem
⊦ ¬ is_referencevalue(val) ∧ validstatfield(str, sk0, st) ∧ is_fskey(sk) ∧ oktype(val, sk .fs .type, st) ∧ sk .fs .type ≠ void_type ∧ sk ≠ _length → validstatfield(str, sk0, st[r -- sk, val]) A User Theorem
⊦ sk ≠ sk0 ∧ ( ¬ is_fskey(sk) ∨ sk .fs .type ≠ void_type ∨ sk .fs ≠ mkfs(`java.lang.Object' .class, void_type, `uninit' .field) ∧ (¬ is_fskey(sk0) ∨ sk .fs ≠ mkfs(sk0 .fs .class, void_type, `initstate' .field))) → (validstatfield(str, sk0, st[jvmref -- sk, val]) ↔ validstatfield(str, sk0, st)) A User Theorem
⊦ validstatfield(str, mkfs(class, int_type, fieldvar) ', st) → validstatfield(str, mkfs(class, int_type, fieldvar) ', st[jvmref -- mkfs(class, int_type, fieldvar) ', intval(i)]) A User Theorem
⊦ ¬ is_reftype(sk .fs .type) → (validstatfield(str, sk, putByteArray(bytes, r, i, st)) ↔ validstatfield(str, sk, st)) A User Theorem
⊦ validvals(str, rkvs, st) ∧ validstatfield(str, sk, st) → validstatfield(str, sk, st[rkvs]) A User Theorem
⊦ validstatfield(str, sk, st) ∧ st ⊆ st0 ∧ initdone(sk .fs .class, st0) ∧ initdone(sk .fs .class, st) → validstatfield(str, sk, st0) A User Theorem
⊦ validstatfield(str, sk, st) ∧ is_predefined_class(class) ∧ newref(r, st) → validstatfield(str, sk, addobj(r, class, [], st)[_mode, throw(r, mkclasstype(class))]) A User Theorem
⊦ validstatfield(str, sk, st0) ∧ ¬ jvmref ∈ st → validstatfield(str, sk, st ∪ st0) A User Theorem
⊦ validstatfield(str, sk, st) ∧ initdone(sk .fs .class, st) → validref(str, st[jvmref -- sk] .refval, sk .fs .type, st) A User Theorem
⊦ ¬ validstatfield(str, mkfs(class, void_type, fieldvar) ', st) A User Theorem
⊦ validfieldinits(str, fis, st) ∧ fis .keys = statfields(class) ∧ class ≠ `java.lang.Object' .class ∧ tdname∃(str, class) → validstatfields(str, statfields(class), addclass(class, fis, st)) A User Theorem
⊦ class ≠ class0 ∧ class ≠ `java.lang.Object' .class → (validstatfields(str, statfields(class0), addclass(class, fis, st)) ↔ validstatfields(str, statfields(class0), st)) A User Theorem
⊦ validstatfields(str, sks, st) ∧ newref(r, st) → validstatfields(str, sks, addobj(r, class, fis, st)) A User Theorem
⊦ validstatfields(str, st) ∧ newref(r, st) → validstatfields(str, addobj(r, class, fis, st)) A User Theorem
⊦ initdone(class, st) ∧ tdname∃(str, class) → (validstatfields(str, class, st) ↔ (∀ sk. sk ∈ statfields(class) → validstatfield(str, sk, st))) A User Theorem
⊦ validstatfields(str, [], st) A User Theorem
∀ class. tdname∃(str, class) → statfields(class) = [] ⊦ validstatfields(str, st) A User Theorem
⊦ ¬ initdone(class, st) → (validstatfields(str, statfields(class), st) ↔ statfields(class) = [] ∨ tdname∃(str, class)) A User Theorem
⊦ validstatfields(str, sks, st) ∧ level⊆(str, str0) → validstatfields(str0, sks, st) A User Theorem
⊦ validstatfields(str, sk ', st) ↔ validstatfield(str, sk, st) A User Theorem
⊦ validstatfields(str, st) ∧ ¬ is_referencevalue(val) ∧ okval(val, st[r1 -- _type] .type .type) → validstatfields(str, st[r1 -- i ', val]) A User Theorem
⊦ validstatfields(str, st) ∧ r ≠ jvmref ∧ ¬ is_indexkey(sk) ∧ sk .fs .type = byte_type → validstatfields(str, st[r -- sk, byteval(by)]) A User Theorem
⊦ ¬ validstatfields(str, st[r -- sk, byteval(by)]) ∧ r ≠ jvmref ∧ ¬ is_indexkey(sk) ∧ sk .fs .type = byte_type → ¬ validstatfields(str, st) A User Theorem
⊦ validstatfields(str, st) ∧ ¬ is_referencevalue(val) ∧ r ≠ jvmref ∧ ¬ is_indexkey(sk) ∧ okval(val, sk .fs .type) ∧ sk ≠ _length ∧ sk ≠ _type → validstatfields(str, st[r -- sk, val]) A User Theorem
⊦ validstatfields(str, st) ∧ ¬ is_referencevalue(val) ∧ is_fskey(sk) ∧ okval(val, sk .fs .type) ∧ sk ≠ _length → validstatfields(str, st[r -- sk, val]) A User Theorem
⊦ ¬ tdname∃(str, fs .class) ∧ fs .class ≠ `java.lang.Object' .class → (validstatfields(str, st[jvmref -- fs ', val]) ↔ validstatfields(str, st)) A User Theorem
⊦ rk .ref = jvmref ∧ ¬ rk .key ∈ sks ∧ ( ¬ is_fskey(rk .key) ∨ rk .key .fs .type ≠ void_type ∨ rk .key .fs .field ≠ `initstate' .field ∧ rk .key .fs ≠ mkfs(`java.lang.Object' .class, void_type, `uninit' .field)) → (validstatfields(str, sks, st[rk, val]) ↔ validstatfields(str, sks, st)) A User Theorem
⊦ ¬ sk ∈ sks ∧ ( ¬ is_fskey(sk) ∨ sk .fs .type ≠ void_type ∨ sk .fs .field ≠ `initstate' .field ∧ sk .fs ≠ mkfs(`java.lang.Object' .class, void_type, `uninit' .field)) → (validstatfields(str, sks, st[jvmref -- sk, val]) ↔ validstatfields(str, sks, st)) A User Theorem
⊦ validstatfield(str, sk, st[jvmref -- sk, val]) ∧ validstatfields(str, sks, st) ∧ ( ¬ is_fskey(sk) ∨ sk .fs .type ≠ void_type ∨ sk .fs .field ≠ `initstate' .field ∧ sk .fs ≠ mkfs(`java.lang.Object' .class, void_type, `uninit' .field)) → validstatfields(str, sks, st[jvmref -- sk, val]) A User Theorem
⊦ validstatfields(str, sks, st) ∧ (¬ sk ∈ statfields(sk .fs .class) ∨ ¬ tdname∃(str, sk .fs .class)) ∧ is_fskey(sk) ∧ (sk .fs .type ≠ void_type ∨ sk .fs .field ≠ `initstate' .field ∧ sk .fs ≠ mkfs(`java.lang.Object' .class, void_type, `uninit' .field)) → validstatfields(str, sks, st[jvmref -- sk, val]) A User Theorem
⊦ sk ≠ sk0 ∧ ( ¬ is_fskey(sk0) ∨ sk0 .fs .type ≠ void_type ∨ sk0 .fs .field ≠ `initstate' .field ∧ sk0 .fs ≠ mkfs(`java.lang.Object' .class, void_type, `uninit' .field)) → (validstatfields(str, sk ' + sks, st[jvmref -- sk0, val]) ↔ validstatfield(str, sk, st) ∧ validstatfields(str, sks, st[jvmref -- sk0, val])) A User Theorem
str ≠ str0, str0 ≠ `initstate', str0 ≠ `uninit' ⊦ validstatfields(str2, mkfs(class, ty, ((* str)) .field) ' ' + sks, st[jvmref -- mkfs(class0, ty0, ((* str0)) .field) ', val]) ↔ ¬ ¬ (validstatfield(str2, mkfs(class, ty, str .field) ', st) ∧ validstatfields(str2, sks, st[jvmref -- mkfs(class0, ty0, str0 .field) ', val])) A User Theorem
⊦ ¬ sk ∈ statfields(class) ∧ ( ¬ is_fskey(sk) ∨ sk .fs .type ≠ void_type ∨ sk .fs ≠ mkfs(`java.lang.Object' .class, void_type, `uninit' .field) ∧ sk .fs ≠ mkfs(class, void_type, `initstate' .field)) → (validstatfields(str, statfields(class), st[jvmref -- sk, val]) ↔ validstatfields(str, statfields(class), st)) A User Theorem
⊦ validstatfields(str, sk ' + sks, st) ↔ validstatfield(str, sk, st) ∧ validstatfields(str, sks, st) A User Theorem
⊦ validstatfields(str, st) ∧ st ⊆ st0 ∧ init(str, st) ∧ init(str, st0) → validstatfields(str, st0) A User Theorem
⊦ validstatfields(str, sks, st) ∧ is_predefined_class(class) ∧ newref(r, st) → validstatfields(str, sks, addobj(r, class, [], st)[_mode, throw(r, mkclasstype(class))]) A User Theorem
⊦ validstatfields(str, sks, st) ∧ newref(r, st) → validstatfields (str, sks, addobj(r, `java.lang.NoClassDefFoundError' .class, [], st)[_mode, throw(r, mkclasstype(`java.lang.NoClassDefFoundError' .class))]) A User Theorem
⊦ validstatfields(str, sks, st) ∧ newref(r, st) → validstatfields (str, sks, addobj(r, `java.lang.NullPointerException' .class, [], st)[_mode, throw(r, mkclasstype(`java.lang.NullPointerException' .class))]) A User Theorem
⊦ validstatfields(str, st0) ∧ ¬ jvmref ∈ st → validstatfields(str, st ∪ st0) A User Theorem
⊦ validstatfields(str, st) ↔ (∀ class. tdname∃(str, class) ∧ initdone(class, st) → validstatfields(str, class, st)) A User Theorem
⊦ ¬ validstatfield(str, sk, st) ∧ sk ∈ statfields(class) ∧ tdname∃(str, class) ∧ initdone(class, st) → ¬ validstatfields(str, st) A User Theorem
⊦ mkfs(class, void_type, fieldvar) ' ∈ sks → ¬ validstatfields(str, sks, st) A User Theorem
⊦ valid⊆(str, st, addclass(class, fis, st)) A User Theorem
⊦ valid⊆(str, st, st0) → valid⊆(str, st, addclass(class, fis, st0)) A User Theorem
⊦ newref(r, st) ∧ class∃(str, class) ∧ fis .keys = instfields(class) ∧ validfieldinits(fis, st) ∧ ¬ is_abstract(class) ∧ class+∃(str, class) ∧ (∀ sk, r1. sk × refval(r1) ∈ fis → ¬ junkref(str, r1, st)) → valid⊆(str, st, addobj(r, class, fis, st)) A User Theorem
⊦ newref(r, st) ∧ class∃(str, class) ∧ fis .keys = instfields(class) ∧ validfieldinits(fis, st) ∧ ¬ junkrefs(str, fis .vals, st) ∧ ¬ is_abstract(class) → valid⊆(str, st, addobj(r, class, fis, st)) A User Theorem
⊦ valid⊆(str, st, st0) ∧ newref(r, st0) ∧ class∃(str, class) ∧ fis .keys = instfields(class) ∧ validfieldinits(fis, st0) ∧ ¬ junkrefs(str, fis .vals, st0) ∧ ¬ is_abstract(class) → valid⊆(str, st, addobj(r, class, fis, st0)) A User Theorem
⊦ ¬ okbytearray(r, st0) ∧ valid⊆(str, st, st0) → ¬ okbytearray(r, st) A User Theorem
⊦ okbytearray(r, st) ∧ valid⊆(str, st, st0) → okbytearray(r, st0) A User Theorem
⊦ is_predefined_class(class) ∧ newref(r, st) → valid⊆(str, st, addobj(r, class, [], st)) A User Theorem
⊦ valid⊆(str, st, st0) ∧ is_predefined_class(class) ∧ newref(r, st0) → (¬ valid⊆(str, st, addobj(r, class, [], st0)) ↔ false) A User Theorem
⊦ newref(r, st) → valid⊆(str, st, addobj(r, `java.lang.NoClassDefFoundError' .class, [], st)) A User Theorem
⊦ newref(r, st) → valid⊆(str, st, addobj(r, `java.lang.NullPointerException' .class, [], st)) A User Theorem
⊦ rk .ref = jvmref → (valid⊆(str, st, st0[rk, val]) ↔ valid⊆(str, st, st0)) A User Theorem
⊦ valid⊆(str, st, st0[jvmref -- sk, val]) ↔ valid⊆(str, st, st0) A User Theorem
⊦ valid⊆(str, st, st0[_mode, val]) ↔ valid⊆(str, st, st0) A User Theorem
⊦ valid⊆(str, st, st) A User Theorem
⊦ valid⊆(str, st, st0) ∧ valid⊆(str, st0, st1) → valid⊆(str, st, st1) A User Theorem
⊦ valid⊆(str, st, st0) ∧ validref(str, r, ty, st) → validref(str, r, ty, st0) A User Theorem
⊦ validval(str, r -- fs ', byteval(by), st) ↔ fs .type = byte_type A User Theorem
⊦ ¬ is_referencevalue(val) → (validval(str, r -- fs ', val, st) ↔ okval(val, fs .type) ∧ fs ' ≠ _length) A User Theorem
⊦ validval(str, r -- fs ', shortval(sho), st) ↔ fs .type = short_type A User Theorem
⊦ validval(str, r -- i ', byteval(by), st) ↔ st[r -- _type] .type .type = byte_type A User Theorem
⊦ ¬ is_referencevalue(val) → (validval(str, r -- i ', val, st) ↔ okval(val, st[r -- _type] .type .type)) A User Theorem
⊦ validval(str, intval(i), int_type, st) A User Theorem
⊦ validval(str, refval(jvmref), mkclasstype(class), st) A User Theorem
⊦ validval(str, rk, val, st) ∧ validval(str, rk0, val0, st) → validval(str, rk0, val0, st[rk, val]) A User Theorem
⊦ validval(str, rk, val, st) ∧ validvals(str, rkvs, st) → validval(str, rk, val, st[rkvs]) A User Theorem
⊦ validvals(str, rkvs + rkvs0, st) ↔ validvals(str, rkvs, st) ∧ validvals(str, rkvs0, st) A User Theorem
⊦ validvals(str, rkvs + rkvs0, st) ↔ ¬ ¬ (validvals(str, rkvs, st) ∧ validvals(str, rkvs0, st)) A User Theorem
⊦ validvals(str, rkv ', st) ↔ validval(str, rkv .1, rkv .2, st) A User Theorem
⊦ validval(str, rk, val, st) ∧ validvals(str, rkvs, st) → validvals(str, rkvs, st[rk, val]) A User Theorem
⊦ validvals(str, rkvs0, st) ∧ validvals(str, rkvs1, st) → validvals(str, rkvs0, st[rkvs1]) A User Theorem
⊦ validvals(str, rkvs, st) → ¬ r -- mkfs(class, void_type, fieldvar) ' ∈ rkvs A User Theorem
⊦ validvals(str, rkvs, st) → ¬ _uninit ∈ rkvs A User Theorem
⊦ validvals(str, rkvs, st) → ¬ r -- _type ∈ rkvs A User Theorem