[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 array-copy
enrich
   array
with
   functions 
       fill : Array[A] × A → Array[A];
      comment: fill complete array;
       resize : Array[A] × Nat → Array[A];
      comment: resize the array. When enlarged, elements at new indices are unspecified;
   
   predicates 
       id○ : Array[A] × Array[A] × Nat;
      comment: id○(ar0, ar1, n) is true if all elements except those at offset n are equal;
       id○ : Array[A] × Array[A] × Nat × Nat;
      comment: id○(ar0, ar1, n, m) is true if all elements except those at indices [n, n + m[ are equal;
       cmp : Array[A] × A;
   
   procedures moveAndFill# Nat × Nat × Nat × A : Array[A] nonfunctional ;
              comment: moveAndFill#(m,m0,n,ar) works like ar := move(ar,m,m0,n), but fills elements that would be duplicated with a;
              copyAndFill# Nat × Nat × Nat × A : Array[A] × Array[A] nonfunctional ;
              comment: copyAndFill#(m,m0,n, ar, ar0) works like ar0 := copy(ar,m,ar0, m0,n), but fills the elements in ar that were copied with a;
   variables 
       m : Nat;
       n : Nat;
       ar : Array[A];
       a : A;
   
   partial functions 
       fill : Array[A] × A × Nat × Nat → Array[A] with λ ar, a, n, m. n + m ≤ # ar;
      comment: fill(ar, a, offset, len) sets len indices from offset (inclusive) to a;
       copy : Array[A] × Nat × Array[A] × Nat × Nat → Array[A] with λ ar, m, ar0, m0, n. m + n ≤ # ar ∧ m0 + n ≤ # ar0;
      comment: copy(ar, m, ar0, m0, n) copy from ar at offset m into ar0 at offset m0
                   n elements and return new ar0;
       subarray : Array[A] × Nat × Nat → Array[A] with λ ar, m, n. m + n ≤ # ar;
      comment: subarray(ar, m, n) returns subarray of ar from offset m with length n;
       shiftLeft : Array[A] × Nat × Nat × Nat → Array[A] with λ ar, m, n, n0. m + n ≤ # ar ∧ n0 ≤ m;
      comment: shiftLeft(ar, m, n, n0) moves the n elements starting at offset m by n0 to the left, should correspond to memmove(ar + m, ar + m - n0, n) in C;
       shiftRight : Array[A] × Nat × Nat × Nat → Array[A] with λ ar, m, n, n0. m + n + n0 ≤ # ar;
      comment: shiftRight(ar, m, n, n0) moves the n elements starting at offset m by n0 to the right, should correspond to memmove(ar + m, ar + m + n0, n) in C;
       rotateLeft : Array[A] × Nat × Nat × Nat → Array[A] with λ ar, m, n, n0. m + n ≤ # ar ∧ n0 ≤ m;
      comment: rotateLeft (ar, m, n, n0) rotates the n elements starting at offset m by n0 to the left;
       rotateRight : Array[A] × Nat × Nat × Nat → Array[A] with λ ar, m, n, n0. m + n + n0 ≤ # ar;
      comment: rotateRight (ar, m, n, n0) rotates the n elements starting at offset m by n0 to the right;
       move : Array[A] × Nat × Nat × Nat → Array[A] with λ ar, m, m0, n. m + n ≤ # ar ∧ m0 + n ≤ # ar;
      comment: move(ar, m, m0, n) moves the n elements starting at offset m to the n elements starting at n0, should correspond to memmove(ar + m, ar + m0, n) in C;
   
   partial predicates 
       cmp : Array[A] × Nat × Array[A] × Nat × Nat with λ ar, m, ar0, m0, n. m + n ≤ # ar ∧ m0 + n ≤ # ar0;
      comment: cmp(ar, m, ar0, m0, n) compares n elements of ar from offset m with ar0
                    from offset m0;
       cmp : Array[A] × A × Nat × Nat with λ ar, a, m, n. m + n ≤ # ar;
      comment: cmp(ar, a, m, n) is true if all elements in the range at offset m 
                    with length n are equal to a;
       idrange : Array[A] × Nat × Nat with λ ar, m, n. m + n ≤ # ar;
      comment: idrange(ar, m, n) is true if all elements
                    in the range at offset m with length n are equal;
   
   axioms 
      Fill-zero: fill(ar, a, m, 0) = ar;
      used for: s, ls;
      
      Fill-succ: fill(ar, a, m, n + 1) = fill(ar, a, m, n)(m + n := a);
      used for: s, ls;
      
      Fill-all: fill(ar, a) = fill(ar, a, 0, # ar);
      used for: ls;
      
      Copy-zero: copy(ar, m, ar0, m0, 0) = ar0;
      used for: s, ls;
      
      Copy-succ: copy(ar, m, ar0, m0, n + 1) = copy(ar, m, ar0, m0, n)(m0 + n := ar(m + n));
      used for: ls;
      
      Subarray: subarray(ar, m, n) = copy(ar, m, mkarray(n), 0, n);
      used for: ls;
      
      Compare: cmp(ar, m, ar0, m0, n) ↔ (∀ n0. n0 < n → ar(m + n0) = ar0(m0 + n0));
      
      Cmp: cmp(ar, a) ↔ (∀ n. n < # ar → ar(n) = a);
      used for: ls;
      
      Cmp-elem: cmp(ar, a, m, n) ↔ (∀ n0. n0 < n → ar(m + n0) = a);
      
      Idrange: idrange(ar, m, n) ↔ (∀ n0. n0 < n → ar(m + n0) = ar(m));
      
      Idexcept: id○(ar0, ar1, n) ↔ # ar0 = # ar1 ∧ (∀ m. m < # ar0 ∧ m ≠ n → ar0(m) = ar1(m));
      used for: ls;
      
      Idexcept-n: 
      id○(ar0, ar1, m, n) ↔ # ar0 = # ar1 ∧ m + n ≤ # ar0 ∧ (∀ m0. (m0 < m ∨ m + n ≤ m0) ∧ m0 < # ar0 → ar0(m0) = ar1(m0));
      used for: ls;
      
      shiftLeft: shiftLeft(ar, m, n, n0) = copy(ar, m, ar, m - n0, n);
      used for: ls;
      
      shiftRight: shiftRight(ar, m, n, n0) = copy(ar, m, ar, m + n0, n);
      used for: ls;
      
      rotateLeft: rotateLeft(ar, m, n, n0) = copy(copy(copy(ar, 0, ar, 0, # ar), m - n0, ar, m - n0, n), m - n0 + n, ar, m - n0 + n, n0);
      used for: ls;
      
      rotateRight: rotateRight(ar, m, n, n0) = copy(copy(copy(ar, 0, ar, 0, # ar), m, ar, m + n, n0), m + n0, ar, m + n0, n);
      used for: ls;
      
      move-right: m < m0 → move(ar, m, m0, n) = shiftRight(ar, m, n, m0 - m);
      
      move-left: m0 ≤ m → move(ar, m, m0, n) = shiftLeft(ar, m, n, m - m0);
      
      resize-size: # resize(ar, n) = n;
      used for: s, ls;
      
      resize-get: m < # ar ∧ m < n → resize(ar, n)(m) = ar(m);
      used for: s, ls;
   
   declarations 
      copyAndFill: 
      copyAndFill#(m, m0, n, a; ar, ar0){ar0 := copy(ar, m, ar0, m0, n); ar := fill(ar, a, m, m + n)};
      
      
      moveAndFill: 
      moveAndFill#(m, m0, n, a; ar)
      {ar := move(ar, m, m0, n); 
       if m ≤ n
       then if m + n < m0 then ar := fill(ar, a, m, n) else ar := fill(ar, a, m, m0)
       else if m + n < m + m - m0 then ar := fill(ar, a, m, n) else ar := fill(ar, a, m, m0)
      };
      
      
   
   
end enrich