aboutsummaryrefslogtreecommitdiff
path: root/src/algebra/seg.spad.pamphlet
diff options
context:
space:
mode:
authordos-reis <gdr@axiomatics.org>2007-08-14 05:14:52 +0000
committerdos-reis <gdr@axiomatics.org>2007-08-14 05:14:52 +0000
commitab8cc85adde879fb963c94d15675783f2cf4b183 (patch)
treec202482327f474583b750b2c45dedfc4e4312b1d /src/algebra/seg.spad.pamphlet
downloadopen-axiom-ab8cc85adde879fb963c94d15675783f2cf4b183.tar.gz
Initial population.
Diffstat (limited to 'src/algebra/seg.spad.pamphlet')
-rw-r--r--src/algebra/seg.spad.pamphlet531
1 files changed, 531 insertions, 0 deletions
diff --git a/src/algebra/seg.spad.pamphlet b/src/algebra/seg.spad.pamphlet
new file mode 100644
index 00000000..63036d6c
--- /dev/null
+++ b/src/algebra/seg.spad.pamphlet
@@ -0,0 +1,531 @@
+\documentclass{article}
+\usepackage{axiom}
+\begin{document}
+\title{\$SPAD/src/algebra seg.spad}
+\author{Stephen M. Watt, Robert Sutor}
+\maketitle
+\begin{abstract}
+\end{abstract}
+\eject
+\tableofcontents
+\eject
+\section{category SEGCAT SegmentCategory}
+<<category SEGCAT SegmentCategory>>=
+)abbrev category SEGCAT SegmentCategory
+++ Author: Stephen M. Watt
+++ Date Created: December 1986
+++ Date Last Updated: June 3, 1991
+++ Basic Operations:
+++ Related Domains:
+++ Also See:
+++ AMS Classifications:
+++ Keywords: range, segment
+++ Examples:
+++ References:
+++ Description:
+++ This category provides operations on ranges, or {\em segments}
+++ as they are called.
+
+SegmentCategory(S:Type): Category == Type with
+ SEGMENT: (S, S) -> %
+ ++ \spad{l..h} creates a segment with l and h as the endpoints.
+ BY: (%, Integer) -> %
+ ++ \spad{s by n} creates a new segment in which only every \spad{n}-th
+ ++ element is used.
+ lo: % -> S
+ ++ lo(s) returns the first endpoint of s.
+ ++ Note: \spad{lo(l..h) = l}.
+ hi: % -> S
+ ++ hi(s) returns the second endpoint of s.
+ ++ Note: \spad{hi(l..h) = h}.
+ low: % -> S
+ ++ low(s) returns the first endpoint of s.
+ ++ Note: \spad{low(l..h) = l}.
+ high: % -> S
+ ++ high(s) returns the second endpoint of s.
+ ++ Note: \spad{high(l..h) = h}.
+ incr: % -> Integer
+ ++ incr(s) returns \spad{n}, where s is a segment in which every
+ ++ \spad{n}-th element is used.
+ ++ Note: \spad{incr(l..h by n) = n}.
+ segment: (S, S) -> %
+ ++ segment(i,j) is an alternate way to create the segment \spad{i..j}.
+ convert: S -> %
+ ++ convert(i) creates the segment \spad{i..i}.
+
+@
+\section{category SEGXCAT SegmentExpansionCategory}
+<<category SEGXCAT SegmentExpansionCategory>>=
+)abbrev category SEGXCAT SegmentExpansionCategory
+++ Author: Stephen M. Watt
+++ Date Created: June 5, 1991
+++ Date Last Updated:
+++ Basic Operations:
+++ Related Domains: Segment, UniversalSegment
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ Examples:
+++ References:
+++ Description:
+++ This category provides an interface for expanding segments to
+++ a stream of elements.
+SegmentExpansionCategory(S: OrderedRing, L: StreamAggregate(S)): Category ==
+ SegmentCategory(S) with
+ expand: List % -> L
+ ++ expand(l) creates a new value of type L in which each segment
+ ++ \spad{l..h by k} is replaced with \spad{l, l+k, ... lN},
+ ++ where \spad{lN <= h < lN+k}.
+ ++ For example, \spad{expand [1..4, 7..9] = [1,2,3,4,7,8,9]}.
+ expand: % -> L
+ ++ expand(l..h by k) creates value of type L with elements
+ ++ \spad{l, l+k, ... lN} where \spad{lN <= h < lN+k}.
+ ++ For example, \spad{expand(1..5 by 2) = [1,3,5]}.
+ map: (S -> S, %) -> L
+ ++ map(f,l..h by k) produces a value of type L by applying f
+ ++ to each of the succesive elements of the segment, that is,
+ ++ \spad{[f(l), f(l+k), ..., f(lN)]}, where \spad{lN <= h < lN+k}.
+
+@
+\section{domain SEG Segment}
+<<domain SEG Segment>>=
+)abbrev domain SEG Segment
+++ Author: Stephen M. Watt
+++ Date Created: December 1986
+++ Date Last Updated: June 3, 1991
+++ Basic Operations:
+++ Related Domains:
+++ Also See:
+++ AMS Classifications:
+++ Keywords: range, segment
+++ Examples:
+++ References:
+++ Description:
+++ This type is used to specify a range of values from type \spad{S}.
+
+Segment(S:Type): SegmentCategory(S) with
+ if S has SetCategory then SetCategory
+ if S has OrderedRing then SegmentExpansionCategory(S, List S)
+ == add
+
+ Rep := Record(low: S, high: S, incr: Integer)
+
+ a..b == [a,b,1]
+ lo s == s.low
+ low s == s.low
+ hi s == s.high
+ high s == s.high
+ incr s == s.incr
+ segment(a,b) == [a,b,1]
+ BY(s, r) == [lo s, hi s, r]
+
+ if S has SetCategory then
+ (s1:%) = (s2:%) ==
+ s1.low = s2.low and s1.high=s2.high and s1.incr = s2.incr
+
+ coerce(s:%):OutputForm ==
+ seg := SEGMENT(s.low::OutputForm, s.high::OutputForm)
+ s.incr = 1 => seg
+ infix(" by "::OutputForm, seg, s.incr::OutputForm)
+
+ convert a == [a,a,1]
+
+ if S has OrderedRing then
+ expand(ls: List %):List S ==
+ lr := nil()$List(S)
+ for s in ls repeat
+ l := lo s
+ h := hi s
+ inc := (incr s)::S
+ zero? inc => error "Cannot expand a segment with an increment of zero"
+ if inc > 0 then
+ while l <= h repeat
+ lr := concat(l, lr)
+ l := l + inc
+ else
+ while l >= h repeat
+ lr := concat(l, lr)
+ l := l + inc
+ reverse_! lr
+
+ expand(s : %) == expand([s]$List(%))$%
+ map(f : S->S, s : %): List S ==
+ lr := nil()$List(S)
+ l := lo s
+ h := hi s
+ inc := (incr s)::S
+ if inc > 0 then
+ while l <= h repeat
+ lr := concat(f l, lr)
+ l := l + inc
+ else
+ while l >= h repeat
+ lr := concat(f l, lr)
+ l := l + inc
+ reverse_! lr
+
+@
+\section{package SEG2 SegmentFunctions2}
+<<package SEG2 SegmentFunctions2>>=
+)abbrev package SEG2 SegmentFunctions2
+++ Author:
+++ Date Created:
+++ Date Last Updated: June 4, 1991
+++ Basic Operations:
+++ Related Domains: Segment, UniversalSegment
+++ Also See:
+++ AMS Classifications:
+++ Keywords: equation
+++ Examples:
+++ References:
+++ Description:
+++ This package provides operations for mapping functions onto segments.
+
+SegmentFunctions2(R:Type, S:Type): public == private where
+ public ==> with
+ map: (R -> S, Segment R) -> Segment S
+ ++ map(f,l..h) returns a new segment \spad{f(l)..f(h)}.
+
+ if R has OrderedRing then
+ map: (R -> S, Segment R) -> List S
+ ++ map(f,s) expands the segment s, applying \spad{f} to each
+ ++ value. For example, if \spad{s = l..h by k}, then the list
+ ++ \spad{[f(l), f(l+k),..., f(lN)]} is computed, where
+ ++ \spad{lN <= h < lN+k}.
+
+
+ private ==> add
+ map(f : R->S, r : Segment R): Segment S ==
+ SEGMENT(f lo r,f hi r)$Segment(S)
+
+ if R has OrderedRing then
+ map(f : R->S, r : Segment R): List S ==
+ lr := nil()$List(S)
+ l := lo r
+ h := hi r
+ inc := (incr r)::R
+ if inc > 0 then
+ while l <= h repeat
+ lr := concat(f(l), lr)
+ l := l + inc
+ else
+ while l >= h repeat
+ lr := concat(f(l), lr)
+ l := l + inc
+ reverse_! lr
+
+@
+\section{domain SEGBIND SegmentBinding}
+<<domain SEGBIND SegmentBinding>>=
+)abbrev domain SEGBIND SegmentBinding
+++ Author:
+++ Date Created:
+++ Date Last Updated: June 4, 1991
+++ Basic Operations:
+++ Related Domains: Equation, Segment, Symbol
+++ Also See:
+++ AMS Classifications:
+++ Keywords: equation
+++ Examples:
+++ References:
+++ Description:
+++ This domain is used to provide the function argument syntax \spad{v=a..b}.
+++ This is used, for example, by the top-level \spadfun{draw} functions.
+SegmentBinding(S:Type): Type with
+ equation: (Symbol, Segment S) -> %
+ ++ equation(v,a..b) creates a segment binding value with variable
+ ++ \spad{v} and segment \spad{a..b}. Note that the interpreter parses
+ ++ \spad{v=a..b} to this form.
+ variable: % -> Symbol
+ ++ variable(segb) returns the variable from the left hand side of
+ ++ the \spadtype{SegmentBinding}. For example, if \spad{segb} is
+ ++ \spad{v=a..b}, then \spad{variable(segb)} returns \spad{v}.
+ segment : % -> Segment S
+ ++ segment(segb) returns the segment from the right hand side of
+ ++ the \spadtype{SegmentBinding}. For example, if \spad{segb} is
+ ++ \spad{v=a..b}, then \spad{segment(segb)} returns \spad{a..b}.
+
+ if S has SetCategory then SetCategory
+ == add
+ Rep := Record(var:Symbol, seg:Segment S)
+ equation(x,s) == [x, s]
+ variable b == b.var
+ segment b == b.seg
+
+ if S has SetCategory then
+
+ b1 = b2 == variable b1 = variable b2 and segment b1 = segment b2
+
+ coerce(b:%):OutputForm ==
+ variable(b)::OutputForm = segment(b)::OutputForm
+
+@
+\section{package SEGBIND2 SegmentBindingFunctions2}
+<<package SEGBIND2 SegmentBindingFunctions2>>=
+)abbrev package SEGBIND2 SegmentBindingFunctions2
+++ Author:
+++ Date Created:
+++ Date Last Updated: June 4, 1991
+++ Basic Operations:
+++ Related Domains: SegmentBinding, Segment, Equation
+++ Also See:
+++ AMS Classifications:
+++ Keywords: equation
+++ Examples:
+++ References:
+++ Description:
+++ This package provides operations for mapping functions onto
+++ \spadtype{SegmentBinding}s.
+SegmentBindingFunctions2(R:Type, S:Type): with
+ map: (R -> S, SegmentBinding R) -> SegmentBinding S
+ ++ map(f,v=a..b) returns the value given by \spad{v=f(a)..f(b)}.
+ == add
+ map(f, b) ==
+ equation(variable b, map(f, segment b)$SegmentFunctions2(R, S))
+
+@
+\section{domain UNISEG UniversalSegment}
+<<domain UNISEG UniversalSegment>>=
+)abbrev domain UNISEG UniversalSegment
+++ Author: Robert S. Sutor
+++ Date Created: 1987
+++ Date Last Updated: June 4, 1991
+++ Basic Operations:
+++ Related Domains: Segment
+++ Also See:
+++ AMS Classifications:
+++ Keywords: equation
+++ Examples:
+++ References:
+++ Description:
+++ This domain provides segments which may be half open.
+++ That is, ranges of the form \spad{a..} or \spad{a..b}.
+
+UniversalSegment(S: Type): SegmentCategory(S) with
+ SEGMENT: S -> %
+ ++ \spad{l..} produces a half open segment,
+ ++ that is, one with no upper bound.
+ segment: S -> %
+ ++ segment(l) is an alternate way to construct the segment \spad{l..}.
+ coerce : Segment S -> %
+ ++ coerce(x) allows \spadtype{Segment} values to be used as %.
+ hasHi: % -> Boolean
+ ++ hasHi(s) tests whether the segment s has an upper bound.
+
+ if S has SetCategory then SetCategory
+
+ if S has OrderedRing then
+ SegmentExpansionCategory(S, Stream S)
+-- expand : (List %, S) -> Stream S
+-- expand : (%, S) -> Stream S
+
+ == add
+ Rec ==> Record(low: S, high: S, incr: Integer)
+ Rec2 ==> Record(low: S, incr: Integer)
+ SEG ==> Segment S
+
+ Rep := Union(Rec2, Rec)
+ a,b : S
+ s : %
+ i: Integer
+ ls : List %
+
+ segment a == [a, 1]$Rec2 :: Rep
+ segment(a,b) == [a,b,1]$Rec :: Rep
+ BY(s,i) ==
+ s case Rec => [lo s, hi s, i]$Rec ::Rep
+ [lo s, i]$Rec2 :: Rep
+
+ lo s ==
+ s case Rec2 => (s :: Rec2).low
+ (s :: Rec).low
+
+ low s ==
+ s case Rec2 => (s :: Rec2).low
+ (s :: Rec).low
+
+ hasHi s == s case Rec
+
+ hi s ==
+ not hasHi(s) => error "hi: segment has no upper bound"
+ (s :: Rec).high
+
+ high s ==
+ not hasHi(s) => error "high: segment has no upper bound"
+ (s :: Rec).high
+
+ incr s ==
+ s case Rec2 => (s :: Rec2).incr
+ (s :: Rec).incr
+
+ SEGMENT(a) == segment a
+ SEGMENT(a,b) == segment(a,b)
+
+ coerce(sg : SEG): % == segment(lo sg, hi sg)
+
+ convert a == [a,a,1]
+
+ if S has SetCategory then
+
+ (s1:%) = (s2:%) ==
+ s1 case Rec2 =>
+ s2 case Rec2 =>
+ s1.low = s2.low and s1.incr = s2.incr
+ false
+ s1 case Rec =>
+ s2 case Rec =>
+ s2.low = s2.low and s1.high=s2.high and s1.incr=s2.incr
+ false
+ false
+
+ coerce(s: %): OutputForm ==
+ seg :=
+ e := (lo s)::OutputForm
+ hasHi s => SEGMENT(e, (hi s)::OutputForm)
+ SEGMENT e
+ inc := incr s
+ inc = 1 => seg
+ infix(" by "::OutputForm, seg, inc::OutputForm)
+
+ if S has OrderedRing then
+ expand(s:%) == expand([s])
+ map(f:S->S, s:%) == map(f, expand s)
+
+ plusInc(t: S, a: S): S == t + a
+
+ expand(ls: List %):Stream S ==
+ st:Stream S := empty()
+ null ls => st
+
+ lb:List(Segment S) := nil()
+ while not null ls and hasHi first ls repeat
+ s := first ls
+ ls := rest ls
+ ns := BY(SEGMENT(lo s, hi s), incr s)$Segment(S)
+ lb := concat_!(lb,ns)
+ if not null ls then
+ s := first ls
+ st: Stream S := generate(#1 + incr(s)::S, lo s)
+ else
+ st: Stream S := empty()
+ concat(construct expand(lb), st)
+
+@
+\section{package UNISEG2 UniversalSegmentFunctions2}
+<<package UNISEG2 UniversalSegmentFunctions2>>=
+)abbrev package UNISEG2 UniversalSegmentFunctions2
+++ Author:
+++ Date Created:
+++ Date Last Updated: June 4, 1991
+++ Basic Operations:
+++ Related Domains: Segment, UniversalSegment
+++ Also See:
+++ AMS Classifications:
+++ Keywords: equation
+++ Examples:
+++ References:
+++ Description:
+++ This package provides operations for mapping functions onto segments.
+
+UniversalSegmentFunctions2(R:Type, S:Type): with
+ map: (R -> S, UniversalSegment R) -> UniversalSegment S
+ ++ map(f,seg) returns the new segment obtained by applying
+ ++ f to the endpoints of seg.
+
+ if R has OrderedRing then
+ map: (R -> S, UniversalSegment R) -> Stream S
+ ++ map(f,s) expands the segment s, applying \spad{f} to each value.
+
+
+ == add
+ map(f:R -> S, u:UniversalSegment R):UniversalSegment S ==
+ s := f lo u
+ hasHi u => segment(s, f hi u)
+ segment s
+
+ if R has OrderedRing then
+ map(f:R -> S, u:UniversalSegment R): Stream S ==
+ map(f, expand u)$StreamFunctions2(R, S)
+
+@
+\section{package INCRMAPS IncrementingMaps}
+<<package INCRMAPS IncrementingMaps>>=
+)abbrev package INCRMAPS IncrementingMaps
+++ Author:
+++ Date Created:
+++ Date Last Updated: June 4, 1991
+++ Basic Operations:
+++ Related Domains: UniversalSegment
+++ Also See:
+++ AMS Classifications:
+++ Keywords: equation
+++ Examples:
+++ References:
+++ Description:
+++ This package provides operations to create incrementing functions.
+
+IncrementingMaps(R:Join(Monoid, AbelianSemiGroup)): with
+ increment: () -> (R -> R)
+ ++ increment() produces a function which adds \spad{1} to whatever
+ ++ argument it is given. For example, if {f := increment()} then
+ ++ \spad{f x} is \spad{x+1}.
+ incrementBy: R -> (R -> R)
+ ++ incrementBy(n) produces a function which adds \spad{n} to whatever
+ ++ argument it is given. For example, if {f := increment(n)} then
+ ++ \spad{f x} is \spad{x+n}.
+ == add
+ increment() == 1 + #1
+ incrementBy n == n + #1
+
+@
+\section{License}
+<<license>>=
+--Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd.
+--All rights reserved.
+--
+--Redistribution and use in source and binary forms, with or without
+--modification, are permitted provided that the following conditions are
+--met:
+--
+-- - Redistributions of source code must retain the above copyright
+-- notice, this list of conditions and the following disclaimer.
+--
+-- - Redistributions in binary form must reproduce the above copyright
+-- notice, this list of conditions and the following disclaimer in
+-- the documentation and/or other materials provided with the
+-- distribution.
+--
+-- - Neither the name of The Numerical ALgorithms Group Ltd. nor the
+-- names of its contributors may be used to endorse or promote products
+-- derived from this software without specific prior written permission.
+--
+--THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+--IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+--TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+--PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+--OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+--EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+--PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+--PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+--LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+--NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+--SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+@
+<<*>>=
+<<license>>
+
+<<category SEGCAT SegmentCategory>>
+<<category SEGXCAT SegmentExpansionCategory>>
+<<domain SEG Segment>>
+<<package SEG2 SegmentFunctions2>>
+<<domain SEGBIND SegmentBinding>>
+<<package SEGBIND2 SegmentBindingFunctions2>>
+<<domain UNISEG UniversalSegment>>
+<<package UNISEG2 UniversalSegmentFunctions2>>
+<<package INCRMAPS IncrementingMaps>>
+@
+\eject
+\begin{thebibliography}{99}
+\bibitem{1} nothing
+\end{thebibliography}
+\end{document}