[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,

Specification pointers
enrich cyclic , 
       reflistset with
   functions 
      validrefset : string × reference × store → referencesset;
      maxpath : string × reference × store → nat;
   predicates 
      ps= : reference × store × reference × store;
      unchanged : string × reference × store × store;
      unchangedNorec : reference × store × store;
      comment: all fields or indices of r are the same in 
                                                           both stores. Used in unchanged for
                                                           the recursive version.;
       
   
   axioms 
      pseq-def
      : ⊦ 
          ps=(r, st, r1, st1)
        ↔   r = jvmref ∧ r1 = jvmref
          ∨   r ≠ jvmref ∧ r1 ≠ jvmref ∧ st[r -- _type] = st1[r1 -- _type]
            ∧ (  is_classtype(st[r -- _type] .type)
               →   (∀ fs. 
                       fs ' ∈ instfields(st[r -- _type] .type .class) ∧ is_referencevalue(st[r -- fs '])
                     → ps=(st[r -- fs '] .refval, st, st1[r1 -- fs '] .refval, st1))
                 ∧ (∀ fs. fs ' ∈ instfields(st[r -- _type] .type .class) ∧ ¬ is_referencevalue(st[r -- fs ']) → st[r -- fs '] = st1[r1 -- fs ']))
            ∧ (  is_arraytype(st[r -- _type] .type)
               →   st[r -- _length] .intval = st1[r1 -- _length] .intval
                 ∧ (∀ i. 
                       0 ≤ i ∧ i < st[r -- _length] .intval ∧ is_referencevalue(st[r -- i '])
                     → ps=(st[r -- i '] .refval, st, st1[r1 -- i '] .refval, st1))
                 ∧ (∀ i. 0 ≤ i ∧ i < st[r -- _length] .intval ∧ ¬ is_referencevalue(st[r -- i ']) → st[r -- i '] = st1[r1 -- i ']));
      unchangedNorec-def
      : ⊦ 
          unchangedNorec(r, st, st0)
        ↔   r = jvmref
          ∨   r ≠ jvmref ∧ st[r -- _type] = st0[r -- _type]
            ∧ (is_classtype(st[r -- _type] .type) → (∀ fs. fs ' ∈ instfields(st[r -- _type] .type .class) → st[r -- fs '] = st0[r -- fs ']))
            ∧ (  is_arraytype(st[r -- _type] .type)
               → st[r -- _length] = st0[r -- _length] ∧ (∀ i. 0 ≤ i ∧ i < st[r -- _length] .intval → st[r -- i '] = st0[r -- i ']));
      unchanged-def
      : ⊦ 
        unchanged(str, r, st, st0) ↔ (∀ r0. (path∃(str, r, r0, st) ↔ path∃(str, r, r0, st0)) ∧ (path∃(str, r, r0, st) → unchangedNorec(r0, st, st0)));
      validrefset-empty :  ⊦ ¬ is_valid_ref(str, r, st) → validrefset(str, r, st) = ∅;
      validrefset-def
      : ⊦ 
          is_valid_ref(str, r, st)
        → (  refs ∈ validrefset(str, r, st)
           ↔ refs ≠ [] ∧ refs .first = r ∧ ¬ has_reffield(refs .last, st) ∧ ¬ dups(refs) ∧ validrefs(str, refs, st[r -- _type] .type, st));
      maxpath-zero :  ⊦ validrefset(str, r, st) = ∅ → maxpath(str, r, st) = 0;
      maxpath-in :  ⊦ validrefset(str, r, st) ≠ ∅ → (∃ refs. refs ∈ validrefset(str, r, st) ∧ maxpath(str, r, st) = # refs);
      maxpath-max :  ⊦ refs ∈ validrefset(str, r, st) → # refs ≤ maxpath(str, r, st);
end enrich