[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,
enrich fieldinit ,
storearrays with
functions
update : reference × fieldinits × store → store;
. .keys : fieldinits → storekeys;
. .vals : fieldinits → javavalues;
predicates
validFields : reference × fieldinits × store;
okValues : reference × fieldinits × store;
hasKeys : reference × storekeys × store;
validFieldValues : reference × storekeys × store;
validFieldValue : reference × storekey × store;
eqref : reference × reference × store × store;
eqval : javavalue × javavalue × store × store;
is_javastore : store;
okstore : store;
comment: mode/out in store, every ref has a type;
okclass : javavalue × classname × store;
comment: every ref is <= class;
okreftype : javavalue × javatype × store;
comment: null allowed, uses ≤;
exactreftype : javavalue × javatype × store;
oktype : javavalue × javatype × store;
exacttype : javavalue × javatype × store;
goodfieldandtype : reference × storekey × store;
goodfieldsandtypes : reference × storekeys × store;
exactfieldandtype : reference × storekey × store;
exactfieldsandtypes : reference × storekeys × store;
. ∈ . : fieldinits × store;
instore : reference × classname × fieldinits × store;
oksubtype : javavalue × classname × store;
asgcomp : string × javavalue × javatype × store;
is_array : reference × store;
comment: true if the reference points to an array.
This is comparable to is_obj in addfuns.;
is_array : string × reference × store;
comment: true if the reference points to an array with a 'good' element type.
A good element type must exist, and may not be void or abstract.;
okarray : reference × javatype × store;
okarray : javavalue × javatype × int × store;
exactarray : reference × javatype × store;
exactarray : javavalue × javatype × int × store;
okbytearray : reference × store;
okarraytype : javavalue × javatype × store;
okarrays : reference × fieldinits × store;
axioms
asgcomp : ⊦ asgcomp(str, val, ty, st) ↔ ¬ is_referencevalue(val) ∨ val .refval = jvmref ∨ is_subtype(str, st[val .refval -- _type] .type, ty);
used for : s, ls;
oksubtype
: ⊦
oksubtype(val, class, st)
↔ reftypep(val, st) ∧ (val .refval ≠ jvmref → val .refval -- _type ∈ st ∧ st[val .refval -- _type] .type .class ≤ class);
used for : ls;
update-empty : ⊦ update(r, [], st) = st;
used for : s, ls;
update-rec : ⊦ update(r, (sk × val) ' + fis, st) = (update(r, fis, st)[r -- sk, val]);
used for : ls;
getkeys-empty : ⊦ [] .keys = [];
used for : s, ls;
getkeys-rec : ⊦ ((sk × val) ' + fis) .keys = sk ' + fis .keys;
used for : s, ls;
getvals-empty : ⊦ [] .vals = [];
used for : s, ls;
getvals-rec : ⊦ ((sk × val) ' + fis) .vals = val ' + fis .vals;
used for : s, ls;
validFields : ⊦ validFields(r, fis, st) ↔ unique_al(fis) ∧ ¬ _type ∈ fis ∧ ¬ _length ∈ fis ∧ hasKeys(r, fis .keys, st);
hasKeys-empty : ⊦ hasKeys(r, [], st);
used for : s, ls;
hasKeys-rec : ⊦ hasKeys(r, sk ' + sks, st) ↔ r -- sk ∈ st ∧ hasKeys(r, sks, st);
used for : ls;
instore-empty : ⊦ instore(r, class, [], st) ↔ r ≠ jvmref ∧ r -- _type ∈ st ∧ st[r -- _type] = typeval(mkclasstype(class));
instore-rec : ⊦ instore(r, class, (sk × val) ' + fis, st) ↔ (r -- sk) × val ∈ st ∧ instore(r, class, fis, st);
is_javastore : ⊦ is_javastore(st) ↔ _mode ∈ st ∧ _out ∈ st;
okstore : ⊦ okstore(st) ↔ is_javastore(st) ∧ (∀ r. r ≠ jvmref ∧ r ∈ st → r -- _type ∈ st ∧ is_typevalue(st[r -- _type]));
okclass
: ⊦
okclass(val, class1, st)
↔ reftypep(val, st) ∧ (val .refval ≠ jvmref → val .refval -- _type ∈ st ∧ st[val .refval -- _type] = typeval(mkclasstype(class1)));
used for : ls;
okreftype
: ⊦
okreftype(val, ty, st)
↔ is_referencevalue(val)
∧ (val .refval ≠ jvmref → val .refval -- _type ∈ st ∧ is_typevalue(st[val .refval -- _type]) ∧ st[val .refval -- _type] .type ≤ ty);
used for : ls;
exactreftype
: ⊦
exactreftype(val, ty, st)
↔ is_referencevalue(val) ∧ val .refval ∈ st
∧ (val .refval ≠ jvmref → val .refval -- _type ∈ st ∧ is_typevalue(st[val .refval -- _type]) ∧ st[val .refval -- _type] .type = ty);
used for : ls;
validFieldValues-def : ⊦ validFieldValues(r, sks, st) ↔ (∀ sk. sk ∈ sks → validFieldValue(r, sk, st));
validFieldValue-def : ⊦ validFieldValue(r, sk, st) ↔ is_fskey(sk) ∧ r -- sk ∈ st ∧ okval(st[r -- sk], sk .fs .type);
used for : s, ls;
good-base : ⊦ goodfieldsandtypes(r, [], st);
used for : s, ls;
good-rec : ⊦ goodfieldsandtypes(r, sk ' + sks, st) ↔ goodfieldandtype(r, sk, st) ∧ goodfieldsandtypes(r, sks, st);
used for : ls;
good-field
: ⊦
goodfieldandtype(r, mkfs(class1, ty, fieldvar) ', st)
↔ r -- mkfs(class1, ty, fieldvar) ' ∈ st ∧ oktype(st[r -- mkfs(class1, ty, fieldvar) '], ty, st);
used for : ls;
good-index : ⊦ ¬ goodfieldandtype(r, i ', st);
used for : s, ls;
exact-base : ⊦ exactfieldsandtypes(r, [], st);
used for : s, ls;
exact-rec : ⊦ exactfieldsandtypes(r, sk ' + sks, st) ↔ exactfieldandtype(r, sk, st) ∧ exactfieldsandtypes(r, sks, st);
used for : ls;
exact-field
: ⊦
exactfieldandtype(r, mkfs(class1, ty, fieldvar) ', st)
↔ r -- mkfs(class1, ty, fieldvar) ' ∈ st ∧ exacttype(st[r -- mkfs(class1, ty, fieldvar) '], ty, st);
used for : ls;
exact-index : ⊦ ¬ exactfieldandtype(r, i ', st);
used for : s, ls;
oktype-bool : ⊦ oktype(val, boolean_type, st) ↔ is_boolvalue(val);
used for : s, ls;
oktype-int : ⊦ oktype(val, int_type, st) ↔ is_integervalue(val);
used for : s, ls;
oktype-short : ⊦ oktype(val, short_type, st) ↔ is_shortvalue(val);
used for : s, ls;
oktype-byte : ⊦ oktype(val, byte_type, st) ↔ is_bytevalue(val);
used for : s, ls;
oktype-long : ⊦ oktype(val, long_type, st) ↔ is_longvalue(val);
used for : s, ls;
oktype-char : ⊦ oktype(val, char_type, st) ↔ is_charvalue(val);
used for : s, ls;
oktype-float : ⊦ oktype(val, float_type, st) ↔ is_floatvalue(val);
used for : s, ls;
oktype-double : ⊦ oktype(val, double_type, st) ↔ is_doublevalue(val);
used for : s, ls;
oktype-class : ⊦ oktype(val, mkclasstype(class1), st) ↔ is_referencevalue(val);
used for : ls;
oktype-array : ⊦ oktype(val, mkarraytype(ty), st) ↔ is_referencevalue(val);
used for : ls;
oktype-void : ⊦ oktype(val, void_type, st) ↔ is_referencevalue(val);
comment: identical to okval in valuefuns: null has void_type.;
used for : s, ls;
oktype-abstract : ⊦ ¬ oktype(val, abstract_type, st);
used for : s, ls;
exacttype-bool : ⊦ exacttype(val, boolean_type, st) ↔ is_boolvalue(val);
used for : ls;
exacttype-int : ⊦ exacttype(val, int_type, st) ↔ is_integervalue(val);
used for : ls;
exacttype-short : ⊦ exacttype(val, short_type, st) ↔ is_shortvalue(val);
used for : ls;
exacttype-byte : ⊦ exacttype(val, byte_type, st) ↔ is_bytevalue(val);
used for : ls;
exacttype-class : ⊦ exacttype(val, mkclasstype(class1), st) ↔ okclass(val, class1, st);
used for : ls;
exacttype-array : ⊦ exacttype(val, mkarraytype(ty), st) ↔ exactreftype(val, mkarraytype(ty), st);
used for : ls;
exacttype-void : ⊦ exacttype(val, void_type, st);
used for : s, ls;
exacttype-abstract : ⊦ exacttype(val, abstract_type, st);
used for : s, ls;
instore-base : ⊦ [] ∈ st;
used for : s, ls;
instore-rec : ⊦ (sk × val) ' + fis ∈ st ↔ (jvmref -- sk) × val ∈ st ∧ fis ∈ st;
used for : ls;
exactarray
: ⊦
exactarray(r, ty, st)
↔ exactreftype(refval(r), mkarraytype(ty), st) ∧ r ≠ jvmref ∧ r -- _length ∈ st ∧ is_integervalue(st[r -- _length])
∧ 0 ≤ st[r -- _length] .intval ∧ is_arrayref(r, st[r -- _length] .intval, st);
comment: ty is the element type, not the array type.;
exactarray
: ⊦
exactarray(val, ty, i, st)
↔ exactreftype(val, mkarraytype(ty), st) ∧ val .refval ≠ jvmref ∧ (val .refval -- _length) × intval(i) ∈ st ∧ is_arrayref(val .refval, i, st);
comment: ty is the element type, not the array type.;
okarraytype : ⊦ okarraytype(val, ty, st) ↔ is_referencevalue(val) ∧ (val .refval ≠ jvmref → okarray(val .refval, ty, st));
comment: ty is the element type, not the array type.;
is-any-array
: ⊦
is_array(r, st)
↔ r ≠ jvmref ∧ r -- _type ∈ st ∧ is_typevalue(st[r -- _type]) ∧ is_arraytype(st[r -- _type] .type)
∧ okarray(r, st[r -- _type] .type .type, st);
is-real-array-def
: ⊦
is_array(str, r, st)
↔ type∃(str, st[r -- _type] .type) ∧ st[r -- _type] .type .jtelemtype ≠ void_type ∧ st[r -- _type] .type .jtelemtype ≠ abstract_type
∧ is_array(r, st);
okarrayNotNull
: ⊦
okarray(r, ty, st)
↔ okreftype(refval(r), mkarraytype(ty), st) ∧ r ≠ jvmref ∧ r -- _length ∈ st ∧ is_integervalue(st[r -- _length])
∧ 0 ≤ st[r -- _length] .intval ∧ is_arrayref(r, st[r -- _length] .intval, st)
∧ (∀ j. 0 ≤ j ∧ j < st[r -- _length] .intval → oktype(st[r -- j '], ty, st));
comment: ty is the element type, not the array type.;
okarrayOfLength
: ⊦
okarray(val, ty, i, st)
↔ okreftype(val, mkarraytype(ty), st) ∧ val .refval ≠ jvmref ∧ (val .refval -- _length) × intval(i) ∈ st ∧ 0 ≤ i
∧ is_arrayref(val .refval, i, st) ∧ (∀ j. 0 ≤ j ∧ j < i → oktype(st[val .refval -- j '], ty, st));
comment: ty is the element type, not the array type.;
okarrays-base : ⊦ okarrays(r, [], st);
used for : s, ls;
okarrays-rec
: ⊦
okarrays(r, (sk × val) ' + fis, st)
↔ is_integervalue(val) ∧ is_fskey(sk) ∧ is_arraytype(sk .fs .type) ∧ okarray(st[r -- sk], sk .fs .type .type, val .intval, st)
∧ okarrays(r, fis, st);
okbytearray : ⊦ okbytearray(r, st) ↔ okarray(r, byte_type, st);
eqref
: ⊦
eqref(r, r0, st, st0)
↔ r = jvmref ∧ r0 = jvmref
∨ r ≠ jvmref ∧ r0 ≠ jvmref ∧ (∀ sk. (r -- sk ∈ st ↔ r0 -- sk ∈ st0) ∧ (r -- sk ∈ st → eqval(st[r -- sk], st0[r0 -- sk], st, st0)));
eqval-intl : ⊦ is_integervalue(val) → (eqval(val, val0, st, st0) ↔ val = val0);
used for : s, ls;
eqval-intr : ⊦ is_integervalue(val0) → (eqval(val, val0, st, st0) ↔ val = val0);
used for : s, ls;
eqval-bytel : ⊦ is_bytevalue(val) → (eqval(val, val0, st, st0) ↔ val = val0);
used for : s, ls;
eqval-byter : ⊦ is_bytevalue(val0) → (eqval(val, val0, st, st0) ↔ val = val0);
used for : s, ls;
eqval-shortl : ⊦ is_shortvalue(val) → (eqval(val, val0, st, st0) ↔ val = val0);
used for : s, ls;
eqval-shortr : ⊦ is_shortvalue(val0) → (eqval(val, val0, st, st0) ↔ val = val0);
used for : s, ls;
eqval-booll : ⊦ is_boolvalue(val) → (eqval(val, val0, st, st0) ↔ val = val0);
used for : s, ls;
eqval-boolr : ⊦ is_boolvalue(val0) → (eqval(val, val0, st, st0) ↔ val = val0);
used for : s, ls;
eqval-refl : ⊦ is_referencevalue(val) → (eqval(val, val0, st, st0) ↔ is_referencevalue(val0) ∧ eqref(val .refval, val0 .refval, st, st0));
used for : s, ls;
eqval-refr : ⊦ is_referencevalue(val0) → (eqval(val, val0, st, st0) ↔ is_referencevalue(val) ∧ eqref(val .refval, val0 .refval, st, st0));
used for : s, ls;
eqval-concl
: ⊦
is_valuelist(val)
→ ( eqval(val, val0, st, st0)
↔ is_valuelist(val0) ∧ eqval(val .firstval, val0 .firstval, st, st0) ∧ eqval(val .restval, val0 .restval, st, st0));
used for : s, ls;
eqval-concr
: ⊦
is_valuelist(val0)
→ ( eqval(val, val0, st, st0)
↔ is_valuelist(val) ∧ eqval(val .firstval, val0 .firstval, st, st0) ∧ eqval(val .restval, val0 .restval, st, st0));
used for : ls;
eqval-novall : ⊦ is_novalue(val) → (eqval(val, val0, st, st0) ↔ val = val0);
used for : s, ls;
eqval-novalr : ⊦ is_novalue(val0) → (eqval(val, val0, st, st0) ↔ val = val0);
used for : s, ls;
eqval-typel : ⊦ is_typevalue(val) → (eqval(val, val0, st, st0) ↔ val = val0);
used for : s, ls;
eqval-typer : ⊦ is_typevalue(val0) → (eqval(val, val0, st, st0) ↔ val = val0);
used for : s, ls;
eqval-initl : ⊦ is_initvalue(val) → (eqval(val, val0, st, st0) ↔ val = val0);
used for : s, ls;
eqval-initr : ⊦ is_initvalue(val0) → (eqval(val, val0, st, st0) ↔ val = val0);
used for : s, ls;
eqval-breakl : ⊦ is_break_mode(val) → (eqval(val, val0, st, st0) ↔ val = val0);
used for : s, ls;
eqval-breakr : ⊦ is_break_mode(val0) → (eqval(val, val0, st, st0) ↔ val = val0);
used for : s, ls;
eqval-continuel : ⊦ is_continue_mode(val) → (eqval(val, val0, st, st0) ↔ val = val0);
used for : s, ls;
eqval-continuer : ⊦ is_continue_mode(val0) → (eqval(val, val0, st, st0) ↔ val = val0);
used for : s, ls;
eqval-returnl : ⊦ is_return_mode(val) → (eqval(val, val0, st, st0) ↔ val = val0);
used for : s, ls;
eqval-returnr : ⊦ is_return_mode(val0) → (eqval(val, val0, st, st0) ↔ val = val0);
used for : s, ls;
eqval-throwl : ⊦ is_throw_mode(val) → (eqval(val, val0, st, st0) ↔ val = val0);
used for : s, ls;
eqval-throwr : ⊦ is_throw_mode(val0) → (eqval(val, val0, st, st0) ↔ val = val0);
used for : s, ls;
end enrich