aboutsummaryrefslogtreecommitdiff
path: root/src/interp/i-resolv.boot.pamphlet
diff options
context:
space:
mode:
authordos-reis <gdr@axiomatics.org>2007-11-07 20:54:59 +0000
committerdos-reis <gdr@axiomatics.org>2007-11-07 20:54:59 +0000
commit4edaea6cff2d604009b8f2723a9436b0fc97895d (patch)
treeeb5d3765b2e4f131610571cf5f15eef53419fca0 /src/interp/i-resolv.boot.pamphlet
parent45ce0071c30e84b72e4c603660285fa6a462e7f7 (diff)
downloadopen-axiom-4edaea6cff2d604009b8f2723a9436b0fc97895d.tar.gz
remove more pamphlets
Diffstat (limited to 'src/interp/i-resolv.boot.pamphlet')
-rw-r--r--src/interp/i-resolv.boot.pamphlet863
1 files changed, 0 insertions, 863 deletions
diff --git a/src/interp/i-resolv.boot.pamphlet b/src/interp/i-resolv.boot.pamphlet
deleted file mode 100644
index a9c2e362..00000000
--- a/src/interp/i-resolv.boot.pamphlet
+++ /dev/null
@@ -1,863 +0,0 @@
-\documentclass{article}
-\usepackage{axiom}
-
-\title{\File{src/interp/i-resolv.boot} Pamphlet}
-\author{The Axiom Team}
-
-\begin{document}
-\maketitle
-\begin{abstract}
-\end{abstract}
-\eject
-\tableofcontents
-\eject
-
-\begin{verbatim}
-new resolution: types and modes
-
-a type is any term (structure) which can be regarded as a
- functor call
-a basic type is the call of a nullary functor (e.g. (Integer)),
- otherwise it is a structured type (e.g. (Polynomial (Integer)))
-a functor together with its non-type arguments is called a
- type constructor
-
-a mode is a type which can be partially specified, i.e. a term
- containing term variables
-a term variable (denoted by control-L) stands for any nullary or unary function
- which was build from type constructors
-this means, a term variable can be:
- a function LAMBDA ().T, where T is a type
- a function LAMBDA (X).T(X), where X is a variable for a type and
- T a type containing this variable
- a function LAMBDA X.X ("control-L can be disregarded")
-examples:
- P(control-L) can stand for (Polynomial (RationalFunction (Integer)))
- G(control-L(I)) can stand for (Gaussian (Polynomial (Integer))), but also
- for (Gaussian (Integer))
-
-
-Resolution of Two Types
-
-this symmetric resolution is done the following way:
-1. if the same type constructor occurs in both terms, then the
- type tower is built around this constructor (resolveTTEq)
-2. the next step is to look for two constructors which have an
- "algebraic relationship", this means, a rewrite rule is
- applicable (e.g. UP(x,I) and MP([x,y],I))
- this is done by resolveTTRed
-3. if none of this is true, then a tower of types is built
- e.g. resolve P I and G I to P G I
-
-\end{verbatim}
-\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>>
-
-import '"i-object"
-)package "BOOT"
-
-resolveTypeList u ==
- u is [a,:tail] =>
-
- -- if the list consists entirely of variables then keep it explicit
- allVars :=
- a is ['Variable,v] => [v]
- nil
- while allVars for b in tail repeat
- allVars :=
- b is ['Variable,v] => insert(v, allVars)
- nil
- allVars =>
- null rest allVars => ['Variable, first allVars]
- ['OrderedVariableList,nreverse allVars]
-
- for md in tail repeat
- a := resolveTT(md,a)
- null a => return nil
- a
- throwKeyedMsg("S2IR0002",NIL)
-
--- resolveTT is in CLAMMED BOOT
-
-resolveTypeListAny tl ==
- rt := resolveTypeList tl
- null rt => $Any
- rt
-
-resolveTTAny(t1,t2) ==
- (t3 := resolveTT(t1, t2)) => t3
- $Any
-
-resolveTT1(t1,t2) ==
- -- this is the main symmetric resolve
- -- first it looks for equal constructors on both sides
- -- then it tries to use a rewrite rule
- -- and finally it builds up a tower
- t1=t2 => t1
- (t1 = '$NoValueMode) or (t2 = '$NoValueMode) => NIL
- (t1 = $Void) or (t2 = $Void) => $Void
- (t1 = $Any) or (t2 = $Any) => $Any
- t1 = '(Exit) => t2
- t2 = '(Exit) => t1
- t1 is ['Union,:.] => resolveTTUnion(t1,t2)
- t2 is ['Union,:.] => resolveTTUnion(t2,t1)
- STRINGP(t1) =>
- t2 = $String => t2
- NIL
- STRINGP(t2) =>
- t1 = $String => t1
- NIL
- null acceptableTypesToResolve(t1,t2) => NIL
- if compareTT(t1,t2) then
- t := t1
- t1 := t2
- t2 := t
- (t := resolveTTSpecial(t1,t2)) and isValidType t => t
- (t := resolveTTSpecial(t2,t1)) and isValidType t => t
- isSubTowerOf(t1,t2) and canCoerceFrom(t1,t2) => t2
- isSubTowerOf(t2,t1) and canCoerceFrom(t2,t1) => t1
- t := resolveTTRed(t1,t2) => t
- t := resolveTTCC(t1,t2) => t
- (t := resolveTTEq(t1,t2)) and isValidType t => t
- [c1,:arg1] := deconstructT t1
- arg1 and
- [c2,:arg2] := deconstructT t2
- arg2 and
- t := resolveTT1(last arg1,last arg2)
- t and ( resolveTT2(c1,c2,arg1,arg2,t) or
- resolveTT2(c2,c1,arg2,arg1,t) )
-
-acceptableTypesToResolve(t1,t2) ==
- -- this is temporary. It ensures that two types that have coerces
- -- that really should be converts don't automatically resolve.
- -- when the coerces go away, so will this.
- acceptableTypesToResolve1(t1,t2) and
- acceptableTypesToResolve1(t2,t1)
-
-acceptableTypesToResolve1(t1,t2) ==
- t1 = $Integer =>
- t2 = $String => NIL
- true
- t1 = $DoubleFloat or t1 = $Float =>
- t2 = $String => NIL
- t2 = '(RationalNumber) => NIL
- t2 = [$QuotientField, $Integer] => NIL
- true
- true
-
-resolveTT2(c1,c2,arg1,arg2,t) ==
- -- builds a tower and tests for all the necessary coercions
- t0 := constructM(c2,replaceLast(arg2,t))
- canCoerceFrom(t,t0) and
- t1 := constructM(c1,replaceLast(arg1,t0))
- canCoerceFrom(t0,t1) and t1
-
-resolveTTUnion(t1 is ['Union,:doms],t2) ==
- unionDoms1 :=
- doms and first doms is [":",:.] =>
- tagged := true
- [t for [.,.,t] in doms]
- tagged := false
- doms
- member(t2,unionDoms1) => t1
- tagged => NIL
- t2 isnt ['Union,:doms2] =>
- ud := nil
- bad := nil
- for d in doms while ^bad repeat
- d = '"failed" => ud := [d,:ud]
- null (d' := resolveTT(d,t2)) => bad := true
- ud := [d',:ud]
- bad => NIL
- ['Union,:REMDUP reverse ud]
- ud := nil
- bad := nil
- for d in doms2 while ^bad repeat
- d = '"failed" => ud := append(ud,[d])
- null (d' := resolveTTUnion(t1,d)) => bad := true
- ud := append(ud,CDR d')
- bad => NIL
- ['Union,:REMDUP ud]
-
-resolveTTSpecial(t1,t2) ==
- -- tries to resolve things that would otherwise get mangled in the
- -- rest of the resolve world. I'll leave it for Albi to fix those
- -- things. (RSS 1/-86)
-
- -- following is just an efficiency hack
- (t1 = '(Symbol) or t1 is ['OrderedVariableList,.]) and PAIRP(t2) and
- CAR(t2) in '(Polynomial RationalFunction) => t2
-
- (t1 = '(Symbol)) and ofCategory(t2, '(IntegerNumberSystem)) =>
- resolveTT1(['Polynomial, t2], t2)
-
- t1 = '(AlgebraicNumber) and (t2 = $Float or t2 = $DoubleFloat) =>
- ['Expression, t2]
- t1 = '(AlgebraicNumber) and (t2 = ['Complex, $Float] or t2 = ['Complex, $DoubleFloat]) =>
- ['Expression, CADR t2]
-
- t1 = '(AlgebraicNumber) and t2 is ['Complex,.] =>
- resolveTT1('(Expression (Integer)), t2)
-
- t1 is ['SimpleAlgebraicExtension,F,Rep,poly] =>
- t2 = Rep => t1
- t2 is ['UnivariatePolynomial,x,R] and (t3 := resolveTT(t1, R)) =>
- ['UnivariatePolynomial,x,t3]
- t2 is ['Variable,x] and (t3 := resolveTT(t1, F)) =>
- ['UnivariatePolynomial,x,t3]
- t2 is ['Polynomial,R] and (R' := resolveTT(Rep, t2)) =>
- R' = Rep => t1
- ['Polynomial,t1]
- canCoerceFrom(t2,F) => t1
- nil
- t1 = $PositiveInteger and ofCategory(t2,'(Ring)) =>
- resolveTT1($Integer,t2)
- t1 = $NonNegativeInteger and ofCategory(t2,'(Ring)) =>
- resolveTT1($Integer,t2)
- t1 is ['OrderedVariableList,[x]] => resolveTTSpecial(['Variable, x], t2)
- t1 is ['OrderedVariableList,vl] =>
- ofCategory(t2,'(Ring)) => resolveTT(['Polynomial,'(Integer)],t2)
- resolveTT($Symbol,t2)
- t1 is ['Variable,x] =>
- EQCAR(t2,'SimpleAlgebraicExtension) => resolveTTSpecial(t2,t1)
- t2 is ['UnivariatePolynomial,y,S] =>
- x = y => t2
- resolveTT1(['UnivariatePolynomial,x,'(Integer)],t2)
- t2 is ['Variable,y] =>
- x = y => t1
--- ['OrderedVariableList, MSORT [x,y]]
- $Symbol
- t2 = '(Symbol) => t2
- t2 is ['Polynomial,.] => t2
- t2 is ['OrderedVariableList, vl] and member(x,vl) => t2
- isPolynomialMode t2 => nil
- ofCategory(t2, '(IntegerNumberSystem)) => resolveTT(['Polynomial, t2], t2)
- resolveTT(['Polynomial,'(Integer)],t2)
- t1 is ['FunctionCalled,f] and t2 is ['FunctionCalled,g] =>
- null (mf := get(f,'mode,$e)) => NIL
- null (mg := get(g,'mode,$e)) => NIL
- mf ^= mg => NIL
- mf
- t1 is ['UnivariatePolynomial,x,S] =>
- EQCAR(t2,'Variable) =>
- resolveTTSpecial(t2,t1)
- EQCAR(t2,'SimpleAlgebraicExtension) =>
- resolveTTSpecial(t2,t1)
- t2 is ['UnivariatePolynomial,y,T] =>
- (x = y) and (U := resolveTT1(S,T)) and ['UnivariatePolynomial,x,U]
- nil
- t1 = '(Pi) =>
- t2 is ['Complex,d] => defaultTargetFE t2
- t2 is ['AlgebraicNumber] => defaultTargetFE t2
- EQCAR(t2, 'Variable) or t2 = $Symbol =>
- defaultTargetFE($Symbol)
- t2 is ['Polynomial, .] or t2 is ['Fraction, ['Polynomial, .]] =>
- defaultTargetFE(t2)
- nil
- t1 is ['Polynomial,['Complex,u1]] and t2 is ['Complex,u2] =>
- resolveTT1(t1,u2)
- t1 is ['Polynomial,R] and t2 is ['Complex,S] =>
- containsPolynomial(S) => resolveTT1(['Polynomial,['Complex,R]],t2)
- ['Polynomial,['Complex,resolveTT1(R,S)]]
- t1 is ['Expression, R] and t2 is ['Complex,S] =>
- dom' := resolveTT(R, t2)
- null dom' => nil
- ['Expression, dom']
- t1 is ['Segment, dom] and t2 isnt ['Segment,.] =>
- dom' := resolveTT(dom, t2)
- null dom' => nil
- ['Segment, dom']
- nil
-
-resolveTTCC(t1,t2) ==
- -- tries to use canCoerceFrom information to see if types can be
- -- coerced to one another
- gt21 := GGREATERP(t2,t1)
- (c12 := canCoerceFrom(t1,t2)) and gt21 => t2
- c21 := canCoerceFrom(t2,t1)
- null (c12 or c21) => NIL
- c12 and not c21 => t2
- c21 and not c12 => t1
- -- both are coerceable to each other
- if gt21 then t1 else t2
-
-resolveTTEq(t1,t2) ==
- -- tries to find the constructor of t1 somewhere in t2 (or vice versa)
- -- and move the other guy to the top
- [c1,:arg1] := deconstructT t1
- [c2,:arg2] := deconstructT t2
- t := resolveTTEq1(c1,arg1,[c2,arg2]) => t
- t := ( arg1 and resolveTTEq2(c2,arg2,[c1,arg1]) ) => t
- arg2 and resolveTTEq2(c1,arg1,[c2,arg2])
-
-resolveTTEq1(c1,arg1,TL is [c2,arg2,:.]) ==
- -- takes care of basic types and of types with the same constructor
- -- calls resolveTT1 on the arguments in the second case
- null arg1 and null arg2 =>
- canCoerceFrom(c1,c2) => constructTowerT(c2,CDDR TL)
- canCoerceFrom(c2,c1) and constructTowerT(c1,CDDR TL)
- c1=c2 and
- [c2,arg2,:TL] := bubbleType TL
- until null arg1 or null arg2 or not t repeat
- t := resolveTT1(CAR arg1,CAR arg2) =>
- arg := CONS(t,arg)
- arg1 := CDR arg1
- arg2 := CDR arg2
- t and null arg1 and null arg2 and
- t0 := constructM(c1,nreverse arg)
- constructTowerT(t0,TL)
-
-resolveTTEq2(c1,arg1,TL is [c,arg,:.]) ==
- -- tries to resolveTTEq the type [c1,arg1] with the last argument
- -- of the type represented by TL
- [c2,:arg2] := deconstructT last arg
- TL := [c2,arg2,:TL]
- t := resolveTTEq1(c1,arg1,TL) => t
- arg2 and resolveTTEq2(c1,arg1,TL)
-
-resolveTTRed(t1,t2) ==
- -- the same function as resolveTTEq, but instead of testing for
- -- constructor equality, it looks whether a rewrite rule can be applied
- t := resolveTTRed1(t1,t2,NIL) => t
- [c1,:arg1] := deconstructT t1
- t := arg1 and resolveTTRed2(t2,last arg1,[c1,arg1]) => t
- [c2,:arg2] := deconstructT t2
- arg2 and resolveTTRed2(t1,last arg2,[c2,arg2])
-
-resolveTTRed1(t1,t2,TL) ==
- -- tries to apply a reduction rule on (Resolve t1 t2)
- -- then it creates a type using the result and TL
- EQ(t,term1RW(t := ['Resolve,t1,t2],$Res)) and
- EQ(t,term1RW(t := ['Resolve,t2,t1],$Res)) => NIL
- [c2,:arg2] := deconstructT t2
- [c2,arg2,:TL] := bubbleType [c2,arg2,:TL]
- t2 := constructM(c2,arg2)
- l := term1RWall(['Resolve,t1,t2],$Res)
- for t0 in l until t repeat t := resolveTTRed3 t0
- l and t => constructTowerT(t,TL)
- l := term1RWall(['Resolve,t2,t1],$Res)
- for t0 in l until t repeat t := resolveTTRed3 t0
- l and t and constructTowerT(t,TL)
-
-resolveTTRed2(t1,t2,TL) ==
- -- tries to resolveTTRed t1 and t2 and build a type using TL
- t := resolveTTRed1(t1,t2,TL) => t
- [c2,:arg2] := deconstructT t2
- arg2 and resolveTTRed2(t1,last arg2,[c2,arg2,:TL])
-
-resolveTTRed3(t) ==
- -- recursive resolveTTRed which handles all subterms of the form
- -- (Resolve t1 t2) or subterms which have to be interpreted
- atom t => t
- t is ['Resolve,a,b] =>
- ( t1 := resolveTTRed3 a ) and ( t2 := resolveTTRed3 b ) and
- resolveTT1(t1,t2)
- t is ['Incl,a,b] => member(a,b) and b
- t is ['SetDiff,a,b] => intersection(a,b) and SETDIFFERENCE(a,b)
- t is ['SetComp,a,b] =>
- and/[member(x,a) for x in b] and SETDIFFERENCE(a,b)
- t is ['SetInter,a,b] => intersection(a,b)
- t is ['SetUnion,a,b] => union(a,b)
- t is ['VarEqual,a,b] => (a = b) and a
- t is ['SetEqual,a,b] =>
- (and/[member(x,a) for x in b] and "and"/[member(x,b) for x in a]) and a
- [( atom x and x ) or ((not cs and x and not interpOp? x and x)
- or resolveTTRed3 x) or return NIL
- for x in t for cs in GETDATABASE(CAR t, 'COSIG) ]
-
-interpOp?(op) ==
- PAIRP(op) and
- CAR(op) in '(Incl SetDiff SetComp SetInter SetUnion VarEqual SetEqual)
-
---% Resolve Type with Category
-
-resolveTCat(t,c) ==
- -- this function attempts to find a type tc of category c such that
- -- t can be coerced to tc. NIL returned for failure.
- -- Example: t = Integer, c = Field ==> tc = RationalNumber
-
- -- first check whether t already belongs to c
- ofCategory(t,c) => t
-
- -- if t is built by a parametrized constructor and there is a
- -- condition on the parameter that matches the category, try to
- -- recurse. An example of this is (G I, Field) -> G RN
-
- rest(t) and (tc := resolveTCat1(t,c)) => tc
-
- -- now check some specific niladic categories
- c in '((Field) (EuclideanDomain)) and ofCategory(t,'(IntegralDomain))=>
- eqType [$QuotientField, t]
-
- c = '(Field) and t = $Symbol => ['RationalFunction,$Integer]
-
- c = '(Ring) and t is ['FactoredForm,t0] => ['FactoredRing,t0]
-
- (t is [t0]) and (sd := getImmediateSuperDomain(t0)) and sd ^= t0 =>
- resolveTCat(sd,c)
-
- SIZE(td := deconstructT t) ^= 2=> NIL
- SIZE(tc := deconstructT c) ^= 2 => NIL
- ut := underDomainOf t
- null isValidType(uc := last tc) => NIL
- null canCoerceFrom(ut,uc) => NIL
- nt := constructT(first td,[uc])
- ofCategory(nt,c) => nt
- NIL
-
-resolveTCat1(t,c) ==
- -- does the hard work of looking at conditions on under domains
- -- if null (ut := getUnderModeOf(t)) then ut := last dt
- null (conds := getConditionsForCategoryOnType(t,c)) => NIL
---rest(conds) => NIL -- will handle later
- cond := first conds
- cond isnt [.,["has", pat, c1],:.] => NIL
- rest(c1) => NIL -- make it simple
-
- argN := 0
- t1 := nil
-
- for ut in rest t for i in 1.. while (argN = 0) repeat
- sharp := INTERNL('"#",STRINGIMAGE i)
- sharp = pat =>
- argN := i
- t1 := ut
-
- null t1 => NIL
- null (t1' := resolveTCat(t1,c1)) => NIL
- t' := copy t
- t'.argN := t1'
- t'
-
-getConditionsForCategoryOnType(t,cat) ==
- getConditionalCategoryOfType(t,[NIL],['ATTRIBUTE,cat])
-
-getConditionalCategoryOfType(t,conditions,match) ==
- if PAIRP t then t := first t
- t in '(Union Mapping Record) => NIL
- conCat := GETDATABASE(t,'CONSTRUCTORCATEGORY)
- REMDUP CDR getConditionalCategoryOfType1(conCat,conditions,match,[NIL])
-
-getConditionalCategoryOfType1(cat,conditions,match,seen) ==
- cat is ['Join,:cs] or cat is ['CATEGORY,:cs] =>
- null cs => conditions
- getConditionalCategoryOfType1([first cat,:rest cs],
- getConditionalCategoryOfType1(first cs,conditions,match,seen),
- match,seen)
- cat is ['IF,., cond,.] =>
- matchUpToPatternVars(cond,match,NIL) =>
- RPLACD(conditions,CONS(cat,CDR conditions))
- conditions
- conditions
- cat is [catName,:.] and (GETDATABASE(catName,'CONSTRUCTORKIND) = 'category) =>
- cat in CDR seen => conditions
- RPLACD(seen,[cat,:CDR seen])
- subCat := GETDATABASE(catName,'CONSTRUCTORCATEGORY)
- -- substitute vars of cat into category
- for v in rest cat for vv in $TriangleVariableList repeat
- subCat := SUBST(v,vv,subCat)
- getConditionalCategoryOfType1(subCat,conditions,match,seen)
- conditions
-
-matchUpToPatternVars(pat,form,patAlist) ==
- -- tries to match pattern variables (of the # form) in pat
- -- against expressions in form. If one is found, it is checked
- -- against the patAlist to make sure we are using the same expression
- -- each time.
- EQUAL(pat,form) => true
- isSharpVarWithNum(pat) =>
- -- see is pattern variable is in alist
- (p := assoc(pat,patAlist)) => EQUAL(form,CDR p)
- patAlist := [[pat,:form],:patAlist]
- true
- PAIRP(pat) =>
- not (PAIRP form) => NIL
- matchUpToPatternVars(CAR pat, CAR form,patAlist) and
- matchUpToPatternVars(CDR pat, CDR form,patAlist)
- NIL
-
---% Resolve Type with Mode
-
--- only implemented for nullary control-L's (which stand for types)
-
-resolveTMOrCroak(t,m) ==
- resolveTM(t,m) or throwKeyedMsg("S2IR0004",[t,m])
-
-resolveTM(t,m) ==
- -- resolves a type with a mode which may be partially specified
- startTimingProcess 'resolve
- $Subst : local := NIL
- $Coerce : local := 'T
- t := eqType t
- m := eqType SUBSTQ("**",$EmptyMode,m)
- tt := resolveTM1(t,m)
- result := tt and isValidType tt and eqType tt
- stopTimingProcess 'resolve
- result
-
-resolveTM1(t,m) ==
- -- general resolveTM, which looks for a term variable
- -- otherwise it looks whether the type has the same top level
- -- constructor as the mode, looks for a rewrite rule, or builds up
- -- a tower
- t=m => t
- m is ['Union,:.] => resolveTMUnion(t,m)
- m = '(Void) => m
- m = '(Any) => m
- m = '(Exit) => t
- containsVars m =>
- isPatternVar m =>
- p := ASSQ(m,$Subst) =>
- $Coerce =>
- tt := resolveTT1(t,CDR p) => RPLACD(p,tt) and tt
- NIL
- t=CDR p and t
- $Subst := CONS(CONS(m,t),$Subst)
- t
- atom(t) or atom(m) => NIL
- (t is ['Record,:tr]) and (m is ['Record,:mr]) and
- (tt := resolveTMRecord(tr,mr)) => tt
- t is ['Record,:.] or m is ['Record,:.] => NIL
- t is ['Variable, .] and m is ['Mapping, :.] => m
- t is ['FunctionCalled, .] and m is ['Mapping, :.] => m
- if isEqualOrSubDomain(t, $Integer) then
- t := $Integer
- tt := resolveTMEq(t,m) => tt
- $Coerce and
- tt := resolveTMRed(t,m) => tt
- resolveTM2(t,m)
- $Coerce and canCoerceFrom(t,m) and m
-
-resolveTMRecord(tr,mr) ==
- #tr ^= #mr => NIL
- ok := true
- tt := NIL
- for ta in tr for ma in mr while ok repeat
- -- element is [':,tag,mode]
- CADR(ta) ^= CADR(ma) => ok := NIL -- match tags
- ra := resolveTM1(CADDR ta, CADDR ma) -- resolve modes
- null ra => ok := NIL
- tt := CONS([CAR ta,CADR ta,ra],tt)
- null ok => NIL
- ['Record,nreverse tt]
-
-resolveTMUnion(t, m is ['Union,:ums]) ==
- isTaggedUnion m => resolveTMTaggedUnion(t,m)
- -- resolves t with a Union type
- t isnt ['Union,:uts] =>
- ums := REMDUP spliceTypeListForEmptyMode([t],ums)
- ums' := nil
- success := nil
- for um in ums repeat
- (um' := resolveTM1(t,um)) =>
- success := true
- um' in '(T TRUE) => ums' := [um,:ums']
- ums' := [um',:ums']
- ums' := [um,:ums']
- -- remove any duplicate domains that might have been created
- m' := ['Union,:REMDUP reverse ums']
- success =>
- null CONTAINED('_*_*,m') => m'
- t = $Integer => NIL
- resolveTM1($Integer,m')
- NIL
- -- t is actually a Union if we got here
- ums := REMDUP spliceTypeListForEmptyMode(uts,ums)
- bad := nil
- doms := nil
- for ut in uts while ^bad repeat
- (m' := resolveTMUnion(ut,['Union,:ums])) =>
- doms := append(CDR m',doms)
- bad := true
- bad => NIL
- ['Union,:REMDUP doms]
-
-resolveTMTaggedUnion(t, m is ['Union,:ums]) ==
- NIL
-
-spliceTypeListForEmptyMode(tl,ml) ==
- -- splice in tl for occurrence of ** in ml
- null ml => nil
- ml is [m,:ml'] =>
- m = "**" => append(tl,spliceTypeListForEmptyMode(tl,ml'))
- [m,:spliceTypeListForEmptyMode(tl,ml')]
-
-resolveTM2(t,m) ==
- -- resolves t with the last argument of m and builds up a tower
- [cm,:argm] := deconstructT m
- argm and
- tt := resolveTM1(t,last argm)
- tt and
- ttt := constructM(cm,replaceLast(argm,tt))
- ttt and canCoerceFrom(tt,ttt) and ttt
-
-resolveTMEq(t,m) ==
- -- tests whether t and m have the same top level constructor, which,
- -- in the case of t, could be bubbled up
- (res := resolveTMSpecial(t,m)) => res
- [cm,:argm] := deconstructT m
- c := containsVars cm
- TL := NIL
- until b or not t repeat
- [ct,:argt] := deconstructT t
- b :=
- c =>
- SL := resolveTMEq1(ct,cm)
- not EQ(SL,'failed)
- ct=cm
- not b =>
- TL := [ct,argt,:TL]
- t := argt and last argt
- b and
- t := resolveTMEq2(cm,argm,[ct,argt,:TL])
- if t then for p in SL repeat $Subst := augmentSub(CAR p,CDR p,$Subst)
- t
-
-resolveTMSpecial(t,m) ==
- -- a few special cases
- t = $AnonymousFunction and m is ['Mapping,:.] => m
- t is ['Variable,x] and m is ['OrderedVariableList,le] =>
- isPatternVar le => ['OrderedVariableList,[x]]
- PAIRP(le) and member(x,le) => le
- NIL
- t is ['Fraction, ['Complex, t1]] and m is ['Complex, m1] =>
- resolveTM1(['Complex, ['Fraction, t1]], m)
- t is ['Fraction, ['Polynomial, ['Complex, t1]]] and m is ['Complex, m1] =>
- resolveTM1(['Complex, ['Fraction, ['Polynomial, t1]]], m)
- t is ['Mapping,:lt] and m is ['Mapping,:lm] =>
- #lt ^= #lm => NIL
- l := NIL
- ok := true
- for at in lt for am in lm while ok repeat
- (ok := resolveTM1(at,am)) => l := [ok,:l]
- ok and ['Mapping,:reverse l]
- t is ['Segment,u] and m is ['UniversalSegment,.] =>
- resolveTM1(['UniversalSegment, u], m)
- NIL
-
-resolveTMEq1(ct,cm) ==
- -- ct and cm are type constructors
- -- tests for a match from cm to ct
- -- the result is a substitution or 'failed
- not (CAR ct=CAR cm) => 'failed
- SL := NIL
- ct := CDR ct
- cm := CDR cm
- b := 'T
- while ct and cm and b repeat
- xt := CAR ct
- ct := CDR ct
- xm := CAR cm
- cm := CDR cm
- if not (atom xm) and CAR xm = ":" -- i.e. Record
- and CAR xt = ":" and CADR xm = CADR xt then
- xm := CADDR xm
- xt := CADDR xt
- b :=
- xt=xm => 'T
- isPatternVar(xm) and
- p := ASSQ(xm,$Subst) => xt=CDR p
- p := ASSQ(xm,SL) => xt=CDR p
- SL := augmentSub(xm,xt,SL)
- b => SL
- 'failed
-
-resolveTMEq2(cm,argm,TL) ==
- -- [cm,argm] is a deconstructed mode,
- -- TL is a deconstructed type t
- [ct,argt,:TL] :=
- $Coerce => bubbleType TL
- TL
- null TL and
- null argm => constructM(ct,argt)
--- null argm => NIL
- arg := NIL
- while argt and argm until not tt repeat
- x1 := CAR argt
- argt := CDR argt
- x2 := CAR argm
- argm := CDR argm
- tt := resolveTM1(x1,x2) =>
- arg := CONS(tt,arg)
- null argt and null argm and tt and constructM(ct,nreverse arg)
-
-resolveTMRed(t,m) ==
- -- looks for an applicable rewrite rule at any level of t and tries
- -- to bubble this constructor up to the top to t
- TL := NIL
- until b or not t repeat
- [ct,:argt] := deconstructT t
- b := not EQ(t,term1RW(['Resolve,t,m],$ResMode)) and
- [c0,arg0,:TL0] := bubbleType [ct,argt,:TL]
- null TL0 and
- l := term1RWall(['Resolve,constructM(c0,arg0),m],$ResMode)
- for t0 in l until t repeat t := resolveTMRed1 t0
- l and t
- b or
- TL := [ct,argt,:TL]
- t := argt and last argt
- b and t
-
-resolveTMRed1(t) ==
- -- recursive resolveTMRed which handles all subterms of the form
- -- (Resolve a b)
- atom t => t
- t is ['Resolve,a,b] =>
- ( a := resolveTMRed1 a ) and ( b := resolveTMRed1 b ) and
- resolveTM1(a,b)
- t is ['Incl,a,b] => PAIRP b and member(a,b) and b
- t is ['Diff,a,b] => PAIRP a and member(b,a) and SETDIFFERENCE(a,[b])
- t is ['SetIncl,a,b] => PAIRP b and "and"/[member(x,b) for x in a] and b
- t is ['SetDiff,a,b] => PAIRP b and PAIRP b and
- intersection(a,b) and SETDIFFERENCE(a,b)
- t is ['VarEqual,a,b] => (a = b) and b
- t is ['SetComp,a,b] => PAIRP a and PAIRP b and
- "and"/[member(x,a) for x in b] and SETDIFFERENCE(a,b)
- t is ['SimpleAlgebraicExtension,a,b,p] => -- this is a hack. RSS
- ['SimpleAlgebraicExtension, resolveTMRed1 a, resolveTMRed1 b,p]
- [( atom x and x ) or resolveTMRed1 x or return NIL for x in t]
-
---% Type and Mode Representation
-
-eqType(t) ==
- -- looks for an equivalent but more simple type
- -- eg, eqType QF I = RN
- -- the new algebra orginization no longer uses these sorts of types
--- termRW(t,$TypeEQ)
- t
-
-equiType(t) ==
- -- looks for an equivalent but expanded type
- -- eg, equiType RN == QF I
- -- the new algebra orginization no longer uses these sorts of types
--- termRW(t,$TypeEqui)
- t
-
-getUnderModeOf d ==
- not PAIRP d => NIL
--- n := LASSOC(first d,$underDomainAlist) => d.n ----> $underDomainAlist NOW always NIL
- for a in rest d for m in rest destructT d repeat
- if m then return a
-
---deconstructM(t) ==
--- -- M is a type, which may contain type variables
--- -- results in a pair (type constructor . mode arguments)
--- CDR t and constructor? CAR t =>
--- dt := destructT CAR t
--- args := [ x for d in dt for y in t | ( x := d and y ) ]
--- c := [ x for d in dt for y in t | ( x := not d and y ) ]
--- CONS(c,args)
--- CONS(t,NIL)
-
-deconstructT(t) ==
- -- M is a type, which may contain type variables
- -- results in a pair (type constructor . mode arguments)
- KDR t and constructor? CAR t =>
- dt := destructT CAR t
- args := [ x for d in dt for y in t | ( x := d and y ) ]
- c := [ x for d in dt for y in t | ( x := not d and y ) ]
- CONS(c,args)
- CONS(t,NIL)
-
-constructT(c,A) ==
- -- c is a type constructor, A a list of argument types
- A => [if d then POP A else POP c for d in destructT CAR c]
- c
-
-constructM(c,A) ==
- -- replaces top level RE's or QF's by equivalent types, if possible
- containsVars(c) or containsVars(A) => NIL
- -- collapses illegal FE's
- CAR(c) = $FunctionalExpression => eqType defaultTargetFE CAR A
- eqType constructT(c,A)
-
-replaceLast(A,t) ==
- -- replaces the last element of the nonempty list A by t (constructively
- nreverse RPLACA(reverse A,t)
-
-destructT(functor)==
- -- provides a list of booleans, which indicate whether the arguments
- -- to the functor are category forms or not
- GETDATABASE(opOf functor,'COSIG)
-
-constructTowerT(t,TL) ==
- -- t is a type, TL a list of constructors and argument lists
- -- t is embedded into TL
- while TL and t repeat
- [c,arg,:TL] := TL
- t0 := constructM(c,replaceLast(arg,t))
- t := canCoerceFrom(t,t0) and t0
- t
-
-bubbleType(TL) ==
- -- tries to move the last constructor in TL upwards
- -- uses canCoerceFrom to test whether two constructors can be bubbled
- [c1,arg1,:T1] := TL
- null T1 or null arg1 => TL
- [c2,arg2,:T2] := T1
- t := last arg1
- t2 := constructM(c2,replaceLast(arg2,t))
- arg1 := replaceLast(arg1,t2)
- newCanCoerceCommute(c2,c1) or canCoerceCommute(c2, c1) =>
- bubbleType [c1,arg1,:T2]
- TL
-
-bubbleConstructor(TL) ==
- -- TL is a nonempty list of type constructors and nonempty argument
- -- lists representing a deconstructed type
- -- then the lowest constructor is bubbled to the top
- [c,arg,:T1] := TL
- t := last arg
- until null T1 repeat
- [c1,arg1,:T1] := T1
- arg1 := replaceLast(arg1,t)
- t := constructT(c1,arg1)
- constructT(c,replaceLast(arg,t))
-
-compareTT(t1,t2) ==
- -- 'T if type t1 is more nested than t2
- -- otherwise 'T if t1 is lexicographically greater than t2
- EQCAR(t1,$QuotientField) or
- MEMQ(opOf t2,[$QuotientField, 'SimpleAlgebraicExtension]) => NIL
- CGREATERP(PRIN2CVEC opOf t1,PRIN2CVEC opOf t2)
-
-@
-\eject
-\begin{thebibliography}{99}
-\bibitem{1} nothing
-\end{thebibliography}
-\end{document}