Seg1
include order
include collections
module segment(domain,range,arr) = {
- Type
domainmust support arithmetic. - Type
arrmust be an array type over (domain,range).
This is a type of segments over arr
type this
relation segment_of(X:this,Y:arr,B:domain,E:domain)
action make(data:arr, begin:domain, end:domain) returns (seg:this)
n of the segment.
action get(seg:this, n:domain)
function value(X:this,N:domain) : range
specification {
invariant segment_of(X,Y,B,E) & B <= N & N < E -> value(X,N) = arr.value(Y,N)
around make {
require 0 <= begin & begin <= end & end <= data.end
...
segment_of(seg,data,begin,end) := true
}
}
implementation {
destructor offset(X:this) : domain
destructor elems(X:this) : arr
definition value(X,N) = elems(X).value(N + offset(X))
after init {
segment_of(X,Y,B,E) := false;
}
implement make {
seg.offset := begin;
seg.elems := arr.empty;
var idx := begin;
while idx < end
invariant begin <= idx
invariant begin <= N & N < idx -> seg.value(N) = arr.value(Y,N)
invariant begin + seg.elems.end = idx
{
seg.elems := seg.elems.append(data.value(idx));
idx := idx.next;
};
}
}
isolate iso = this with domain.impl,arr
}
instance dom : unbounded_sequence
type rng
instance arr : array(dom,rng)
instance s : segment(dom,rng,arr)
export s.make