% @(#) $Id: Val_Array.lsl,v 1.17 1995/08/11 21:38:30 leavens Exp $
% Mappings from integers to values (pre-arrays) with 0-based indexes
Val_Array(Elem): trait
includes int, % trait for C++ built-in type int.
Set(int, Set[int], int for Int)
introduces
create: int -> Arr[Elem]
allocated, allocatedUpTo: Arr[Elem], int -> Bool
allAllocated: Arr[Elem] -> Bool
allocatedInRange: Arr[Elem], int, int -> Bool
assign: Arr[Elem], int, Elem -> Arr[Elem]
__[__]: Arr[Elem], int -> Elem
maxIndex, minIndex: Arr[Elem] -> int
legalIndex: Arr[Elem], int -> Bool
size: Arr[Elem] -> int
slice: Arr[Elem], int, int -> Arr[Elem]
slice_helper: Arr[Elem], int, int, Arr[Elem], Set[int] -> Arr[Elem]
asserts
sort Arr[Elem] generated by create, assign
sort Arr[Elem] partitioned by size, allocated, __[__]
\forall a: Arr[Elem], i,j,n,siz: int, e: Elem
~allocated(create(n), j);
allocated(assign(a,i,e), j)
== legalIndex(a,j) /\ (i = j \/ allocated(a, j));
allAllocated(a) == allocatedInRange(a, 0, maxIndex(a));
allocatedInRange(a, i, j)
== i > j \/ (allocated(a, i) /\ allocatedInRange(a, i+1, j));
allocatedUpTo(a, siz) == allocatedInRange(a, 0, siz-1);
assign(a,i,e)[j] == (if i = j then e else a[j]);
maxIndex(assign(a,i,e)) == maxIndex(a);
maxIndex(create(n)) == n - 1;
minIndex(a) == 0;
legalIndex(a,i) == (0 <= i) /\ (i <= maxIndex(a));
size(create(n)) = n;
size(assign(a,i,e)) = size(a);
\forall a, a2: Arr[Elem], i, j, k: int, s: Set[int], e: Elem
slice(a,i,j)
== if i <= j then slice_helper(a, i, j, create(j-i), {})
else create(0);
slice_helper(create(k), i, j, a2, s) == a2;
slice_helper(assign(a,k,e), i, j, a2, s)
== if i <= k /\ k <= j /\ ~(k \in s)
then slice_helper(a, i, j, assign(a2,k,e), insert(k, s))
else slice_helper(a, i, j, a2, s);
implies
sort Arr[Elem] partitioned by maxIndex, allocated, __[__]
\forall a: Arr[Elem], i, j: int, e1, e2: Elem
assign(assign(a,i,e1),i,e2) == assign(a,i,e2);
i ~= j => assign(assign(a,i,e1),j,e2) = assign(assign(a,j,e2),i,e1);
allocated(a,i) => legalIndex(a,i);
size(a) == maxIndex(a) + 1;
j < 0 => (slice(a, i, j) = create(0));
converts allocated: Arr[Elem], int -> Bool,
allAllocated, allocatedInRange,
maxIndex, minIndex, legalIndex, size: Arr[Elem] -> int,
__[__]
exempting \forall n, i: int
create(n)[i]
[Index]
HTML generated using lcpp2html.