aboutsummaryrefslogtreecommitdiff
path: root/src/algebra/alql.spad.pamphlet
diff options
context:
space:
mode:
Diffstat (limited to 'src/algebra/alql.spad.pamphlet')
-rw-r--r--src/algebra/alql.spad.pamphlet265
1 files changed, 265 insertions, 0 deletions
diff --git a/src/algebra/alql.spad.pamphlet b/src/algebra/alql.spad.pamphlet
new file mode 100644
index 00000000..5865b39e
--- /dev/null
+++ b/src/algebra/alql.spad.pamphlet
@@ -0,0 +1,265 @@
+\documentclass{article}
+\usepackage{axiom}
+\begin{document}
+\title{\$SPAD/src/algebra alql.spad}
+\author{The Axiom Team}
+\maketitle
+\begin{abstract}
+\end{abstract}
+\eject
+\tableofcontents
+\eject
+\section{domain DLIST DataList}
+<<domain DLIST DataList>>=
+)abbrev domain DLIST DataList
+++ This domain provides some nice functions on lists
+DataList(S:OrderedSet) : Exports == Implementation where
+ Exports == ListAggregate(S) with
+ coerce: List S -> %
+ ++ coerce(l) creates a datalist from l
+ coerce: % -> List S
+ ++ coerce(x) returns the list of elements in x
+ datalist: List S -> %
+ ++ datalist(l) creates a datalist from l
+ elt: (%,"unique") -> %
+ ++ \axiom{l.unique} returns \axiom{l} with duplicates removed.
+ ++ Note: \axiom{l.unique = removeDuplicates(l)}.
+ elt: (%,"sort") -> %
+ ++ \axiom{l.sort} returns \axiom{l} with elements sorted.
+ ++ Note: \axiom{l.sort = sort(l)}
+ elt: (%,"count") -> NonNegativeInteger
+ ++ \axiom{l."count"} returns the number of elements in \axiom{l}.
+ Implementation == List(S) add
+ elt(x,"unique") == removeDuplicates(x)
+ elt(x,"sort") == sort(x)
+ elt(x,"count") == #x
+ coerce(x:List S) == x pretend %
+ coerce(x:%):List S == x pretend (List S)
+ coerce(x:%): OutputForm == (x :: List S) :: OutputForm
+ datalist(x:List S) == x::%
+
+@
+\section{domain ICARD IndexCard}
+<<domain ICARD IndexCard>>=
+)abbrev domain ICARD IndexCard
+++ This domain implements a container of information
+++ about the AXIOM library
+IndexCard() : Exports == Implementation where
+ Exports == OrderedSet with
+ elt: (%,Symbol) -> String
+ ++ elt(ic,s) selects a particular field from \axiom{ic}. Valid fields
+ ++ are \axiom{name, nargs, exposed, type, abbreviation, kind, origin,
+ ++ params, condition, doc}.
+ display: % -> Void
+ ++ display(ic) prints a summary of the information contained in \axiom{ic}.
+ fullDisplay: % -> Void
+ ++ fullDisplay(ic) prints all of the information contained in \axiom{ic}.
+ coerce: String -> %
+ ++ coerce(s) converts \axiom{s} into an \axiom{IndexCard}. Warning: if
+ ++ \axiom{s} is not of the right format then an error will occur when using
+ ++ it.
+ Implementation == add
+ x<y==(x pretend String) < (y pretend String)
+ x=y==(x pretend String) = (y pretend String)
+ display(x) ==
+ name : OutputForm := dbName(x)$Lisp
+ type : OutputForm := dbPart(x,4,1$Lisp)$Lisp
+ output(hconcat(name,hconcat(" : ",type)))$OutputPackage
+ fullDisplay(x) ==
+ name : OutputForm := dbName(x)$Lisp
+ type : OutputForm := dbPart(x,4,1$Lisp)$Lisp
+ origin:OutputForm := hconcat(alqlGetOrigin(x$Lisp)$Lisp,alqlGetParams(x$Lisp)$Lisp)
+ fromPart : OutputForm := hconcat(" from ",origin)
+ condition : String := dbPart(x,6,1$Lisp)$Lisp
+ ifPart : OutputForm :=
+ condition = "" => empty()
+ hconcat(" if ",condition::OutputForm)
+ exposed? : String := SUBSTRING(dbPart(x,3,1)$Lisp,0,1)$Lisp
+ exposedPart : OutputForm :=
+ exposed? = "n" => " (unexposed)"
+ empty()
+ firstPart := hconcat(name,hconcat(" : ",type))
+ secondPart := hconcat(fromPart,hconcat(ifPart,exposedPart))
+ output(hconcat(firstPart,secondPart))$OutputPackage
+ coerce(s:String): % == (s pretend %)
+ coerce(x): OutputForm == (x pretend String)::OutputForm
+ elt(x,sel) ==
+ s := PNAME(sel)$Lisp pretend String
+ s = "name" => dbName(x)$Lisp
+ s = "nargs" => dbPart(x,2,1$Lisp)$Lisp
+ s = "exposed" => SUBSTRING(dbPart(x,3,1)$Lisp,0,1)$Lisp
+ s = "type" => dbPart(x,4,1$Lisp)$Lisp
+ s = "abbreviation" => dbPart(x,5,1$Lisp)$Lisp
+ s = "kind" => alqlGetKindString(x)$Lisp
+ s = "origin" => alqlGetOrigin(x)$Lisp
+ s = "params" => alqlGetParams(x)$Lisp
+ s = "condition" => dbPart(x,6,1$Lisp)$Lisp
+ s = "doc" => dbComments(x)$Lisp
+ error "unknown selector"
+
+@
+\section{domain DBASE Database}
+<<domain DBASE Database>>=
+)abbrev domain DBASE Database
+++ This domain implements a simple view of a database whose fields are
+++ indexed by symbols
+Database(S): Exports == Implementation where
+ S: OrderedSet with
+ elt: (%,Symbol) -> String
+ ++ elt(x,s) returns an element of x indexed by s
+ display: % -> Void
+ ++ display(x) displays x in some form
+ fullDisplay: % -> Void
+ ++ fullDisplay(x) displays x in detail
+ Exports == SetCategory with
+ elt: (%,QueryEquation) -> %
+ ++ elt(db,q) returns all elements of \axiom{db} which satisfy \axiom{q}.
+ elt: (%,Symbol) -> DataList String
+ ++ elt(db,s) returns the \axiom{s} field of each element of \axiom{db}.
+ _+: (%,%) -> %
+ ++ db1+db2 returns the merge of databases db1 and db2
+ _-: (%,%) -> %
+ ++ db1-db2 returns the difference of databases db1 and db2 i.e. consisting
+ ++ of elements in db1 but not in db2
+ coerce: List S -> %
+ ++ coerce(l) makes a database out of a list
+ display: % -> Void
+ ++ display(db) prints a summary line for each entry in \axiom{db}.
+ fullDisplay: % -> Void
+ ++ fullDisplay(db) prints full details of each entry in \axiom{db}.
+ fullDisplay: (%,PositiveInteger,PositiveInteger) -> Void
+ ++ fullDisplay(db,start,end ) prints full details of entries in the range
+ ++ \axiom{start..end} in \axiom{db}.
+ Implementation == List S add
+ s: Symbol
+ Rep := List S
+ coerce(u: List S):% == u@%
+ elt(data: %,s: Symbol) == [x.s for x in data] :: DataList(String)
+ elt(data: %,eq: QueryEquation) ==
+ field := variable eq
+ val := value eq
+ [x for x in data | stringMatches?(val,x.field)$Lisp]
+ x+y==removeDuplicates_! merge(x,y)
+ x-y==mergeDifference(copy(x::Rep),y::Rep)$MergeThing(S)
+ coerce(data): OutputForm == (#data):: OutputForm
+ display(data) == for x in data repeat display x
+ fullDisplay(data) == for x in data repeat fullDisplay x
+ fullDisplay(data,n,m) == for x in data for i in 1..m repeat
+ if i >= n then fullDisplay x
+
+@
+\section{domain QEQUAT QueryEquation}
+<<domain QEQUAT QueryEquation>>=
+)abbrev domain QEQUAT QueryEquation
+++ This domain implements simple database queries
+QueryEquation(): Exports == Implementation where
+ Exports == CoercibleTo(OutputForm) with
+ equation: (Symbol,String) -> %
+ ++ equation(s,"a") creates a new equation.
+ variable: % -> Symbol
+ ++ variable(q) returns the variable (i.e. left hand side) of \axiom{q}.
+ value: % -> String
+ ++ value(q) returns the value (i.e. right hand side) of \axiom{q}.
+ Implementation == add
+ Rep := Record(var:Symbol, val:String)
+ coerce(u) == coerce(u.var)$Symbol = coerce(u.val)$String
+ equation(x,s) == [x,s]
+ variable q == q.var
+ value q == q.val
+
+@
+\section{package MTHING MergeThing}
+<<package MTHING MergeThing>>=
+)abbrev package MTHING MergeThing
+++ This package exports tools for merging lists
+MergeThing(S:OrderedSet): Exports == Implementation where
+ Exports == with
+ mergeDifference: (List(S),List(S)) -> List(S)
+ ++ mergeDifference(l1,l2) returns a list of elements in l1 not present in l2.
+ ++ Assumes lists are ordered and all x in l2 are also in l1.
+ Implementation == add
+ mergeDifference1: (List S,S,List S) -> List S
+ mergeDifference(x,y) ==
+ null x or null y => x
+ mergeDifference1(x,y.first,y.rest)
+ x.first=y.first => x.rest
+ x
+ mergeDifference1(x,fy,ry) ==
+ rx := x
+ while not null rx repeat
+ rx := rx.rest
+ frx := rx.first
+ while fy < frx repeat
+ null ry => return x
+ fy := first ry
+ ry := rest ry
+ frx = fy =>
+ x.rest := rx.rest
+ null ry => return x
+ fy := ry.first
+ ry := ry.rest
+ x := rx
+
+@
+\section{package OPQUERY OperationsQuery}
+<<package OPQUERY OperationsQuery>>=
+)abbrev package OPQUERY OperationsQuery
+++ This package exports tools to create AXIOM Library information databases.
+OperationsQuery(): Exports == Implementation where
+ Exports == with
+ getDatabase: String -> Database(IndexCard)
+ ++ getDatabase("char") returns a list of appropriate entries in the
+ ++ browser database. The legal values for "char" are "o" (operations),
+ ++ "k" (constructors), "d" (domains), "c" (categories) or "p" (packages).
+ Implementation == add
+ getDatabase(s) == getBrowseDatabase(s)$Lisp
+
+@
+\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>>
+
+<<domain DLIST DataList>>
+<<domain ICARD IndexCard>>
+<<domain DBASE Database>>
+<<domain QEQUAT QueryEquation>>
+<<package MTHING MergeThing>>
+<<package OPQUERY OperationsQuery>>
+@
+\eject
+\begin{thebibliography}{99}
+\bibitem{1} nothing
+\end{thebibliography}
+\end{document}