The Segment domain provides a generalized interval type.
Segments are created using the .. construct by indicating the (included) end points.
s := 3..10
3..10
Type: Segment PositiveInteger
The first end point is called the lo and the second is called hi.
lo s
3
Type: PositiveInteger
These names are used even though the end points might belong to an unordered set.
hi s
10
Type: PositiveInteger
In addition to the end points, each segment has an integer “increment”. An increment can be specified using the “by” construct.
t := 10..3 by -2
10..3 by - 2
Type: Segment PositiveInteger
This part can be obtained using the incr function.
incr s
1
Type: PositiveInteger
Unless otherwise specified, the increment is 1.
incr t
- 2
Type: Integer
A single value can be converted to a segment with equal end points. This happens if segments and single values are mixed in a list.
l := [1..3, 5, 9, 15..11 by -1]
[1..3,5..5,9..9,15..11 by - 1]
Type: List Segment PositiveInteger
If the underlying type is an ordered ring, it is possible to perform additional operations. The expand operation creates a list of points in a segment.
expand s
[3,4,5,6,7,8,9,10]
Type: List Integer
If k > 0, then expand(l..h by k) creates the list [l, l+k, ..., lN] where lN <= h < lN+k. If k < 0, then lN >= h > lN+k.
expand t
[10,8,6,4]
Type: List Integer
It is also possible to expand a list of segments. This is equivalent to appending lists obtained by expanding each segment individually.
expand l
[1,2,3,5,9,15,14,13,12,11]
Type: List Integer
See Also: