Make +,*,min,max support precise unary types.

Closes PR 13563.
This commit is contained in:
Eric Dobson 2013-03-25 23:54:59 -07:00
parent 0e0f1cd670
commit 6c2e75ac7e

View File

@ -13,24 +13,24 @@
(list -Zero -One -PosByte -Byte -PosIndex -Index (list -Zero -One -PosByte -Byte -PosIndex -Index
-PosFixnum -NonNegFixnum -NegFixnum -NonPosFixnum -Fixnum -PosFixnum -NonNegFixnum -NegFixnum -NonPosFixnum -Fixnum
-PosInt -Nat -NegInt -NonPosInt -Int)) -PosInt -Nat -NegInt -NonPosInt -Int))
(define all-rat-types (define rat-types (list -PosRat -NonNegRat -NegRat -NonPosRat -Rat))
(append all-int-types
(list -PosRat -NonNegRat -NegRat -NonPosRat -Rat))) (define all-rat-types (append all-int-types rat-types))
(define all-flonum-types (define all-flonum-types
(list -FlonumPosZero -FlonumNegZero -FlonumZero -FlonumNan (list -FlonumPosZero -FlonumNegZero -FlonumZero -FlonumNan
-PosFlonum -NonNegFlonum -NegFlonum -NonPosFlonum -Flonum)) -PosFlonum -NonNegFlonum -NegFlonum -NonPosFlonum -Flonum))
(define all-float-types (define single-flonum-types
(append all-flonum-types (list -SingleFlonumPosZero -SingleFlonumNegZero -SingleFlonumZero -SingleFlonumNan
(list -SingleFlonumPosZero -SingleFlonumNegZero -SingleFlonumZero -SingleFlonumNan -PosSingleFlonum -NonNegSingleFlonum -NegSingleFlonum -NonPosSingleFlonum -SingleFlonum))
-PosSingleFlonum -NonNegSingleFlonum -NegSingleFlonum -NonPosSingleFlonum -SingleFlonum (define inexact-real-types
-InexactRealPosZero -InexactRealNegZero -InexactRealZero -InexactRealNan (list -InexactRealPosZero -InexactRealNegZero -InexactRealZero -InexactRealNan
-PosInexactReal -NonNegInexactReal -NegInexactReal -NonPosInexactReal -InexactReal))) -PosInexactReal -NonNegInexactReal -NegInexactReal -NonPosInexactReal -InexactReal))
(define all-real-types (define all-float-types (append all-flonum-types single-flonum-types inexact-real-types))
(append all-rat-types all-float-types (define real-types (list -RealZero -PosReal -NonNegReal -NegReal -NonPosReal -Real))
(list -RealZero -PosReal -NonNegReal -NegReal -NonPosReal -Real))) (define all-real-types (append all-rat-types all-float-types real-types))
(define all-number-types (define number-types
(append all-real-types (list -ExactNumber -FloatComplex -SingleFlonumComplex -InexactComplex -Number))
(list -ExactNumber -FloatComplex -SingleFlonumComplex -InexactComplex -Number))) (define all-number-types (append all-real-types number-types))
;; convenient to build large case-lambda types ;; convenient to build large case-lambda types
@ -1050,6 +1050,7 @@
(-> -Byte -Byte -Index) (-> -Byte -Byte -Index)
(-> -PosByte -PosByte -PosByte -PosFixnum) (-> -PosByte -PosByte -PosByte -PosFixnum)
(-> -Byte -Byte -Byte -NonNegFixnum) (-> -Byte -Byte -Byte -NonNegFixnum)
(map unop all-int-types)
(varop -PosInt) (varop -PosInt)
(varop -Nat) (varop -Nat)
(-> -NegInt -NegInt) (-> -NegInt -NegInt)
@ -1069,12 +1070,11 @@
(commutative-binop -NonPosRat -NonNegRat -NonPosRat) (commutative-binop -NonPosRat -NonNegRat -NonPosRat)
(-> -NegRat -NegRat -NegRat -NegRat) (-> -NegRat -NegRat -NegRat -NegRat)
(-> -NonPosRat -NonPosRat -NonPosRat -NonPosRat) (-> -NonPosRat -NonPosRat -NonPosRat -NonPosRat)
(map unop rat-types)
(varop -Rat) (varop -Rat)
(varop-1+ -FlonumZero) (varop-1+ -FlonumZero)
; no pos * -> pos, possible underflow ; no pos * -> pos, possible underflow
(varop-1+ -NonNegFlonum) (varop-1+ -NonNegFlonum)
(-> -NegFlonum -NegFlonum)
(-> -NonPosFlonum -NonPosFlonum)
;; can't do NonPos NonPos -> NonNeg: (* -1.0 0.0) -> NonPos! ;; can't do NonPos NonPos -> NonNeg: (* -1.0 0.0) -> NonPos!
(-> -NegFlonum -NegFlonum -NonNegFlonum) ; possible underflow, so no neg neg -> pos (-> -NegFlonum -NegFlonum -NonNegFlonum) ; possible underflow, so no neg neg -> pos
(-> -NegFlonum -NegFlonum -NegFlonum -NonPosFlonum) ; see above (-> -NegFlonum -NegFlonum -NegFlonum -NonPosFlonum) ; see above
@ -1082,26 +1082,24 @@
;; (* <float> 0) is exact 0 (i.e. not a float) ;; (* <float> 0) is exact 0 (i.e. not a float)
(commutative-case -NonNegFlonum -PosReal) ; real args don't include 0 (commutative-case -NonNegFlonum -PosReal) ; real args don't include 0
(commutative-case -Flonum (Un -PosReal -NegReal) -Flonum) (commutative-case -Flonum (Un -PosReal -NegReal) -Flonum)
(map unop all-flonum-types)
(map varop-1+ (list -Flonum -SingleFlonumZero -NonNegSingleFlonum)) (map varop-1+ (list -Flonum -SingleFlonumZero -NonNegSingleFlonum))
;; we could add contagion rules for negatives, but we haven't for now ;; we could add contagion rules for negatives, but we haven't for now
(-> -NegSingleFlonum -NegSingleFlonum)
(-> -NonPosSingleFlonum -NonPosSingleFlonum)
(-> -NegSingleFlonum -NegSingleFlonum -NonNegSingleFlonum) ; possible underflow, so no neg neg -> pos (-> -NegSingleFlonum -NegSingleFlonum -NonNegSingleFlonum) ; possible underflow, so no neg neg -> pos
(-> -NegSingleFlonum -NegSingleFlonum -NegSingleFlonum -NonPosSingleFlonum) (-> -NegSingleFlonum -NegSingleFlonum -NegSingleFlonum -NonPosSingleFlonum)
(commutative-case -NonNegSingleFlonum (Un -PosRat -NonNegSingleFlonum)) (commutative-case -NonNegSingleFlonum (Un -PosRat -NonNegSingleFlonum))
(commutative-case -SingleFlonum (Un -PosRat -NegRat -SingleFlonum) -SingleFlonum) (commutative-case -SingleFlonum (Un -PosRat -NegRat -SingleFlonum) -SingleFlonum)
(map unop single-flonum-types)
(map varop-1+ (list -SingleFlonum -InexactRealZero -NonNegInexactReal)) (map varop-1+ (list -SingleFlonum -InexactRealZero -NonNegInexactReal))
(-> -NegInexactReal -NegInexactReal)
(-> -NonPosInexactReal -NonPosInexactReal)
(-> -NegInexactReal -NegInexactReal -NonNegInexactReal) (-> -NegInexactReal -NegInexactReal -NonNegInexactReal)
(-> -NegInexactReal -NegInexactReal -NegInexactReal -NonPosInexactReal) (-> -NegInexactReal -NegInexactReal -NegInexactReal -NonPosInexactReal)
(commutative-case -NonNegInexactReal (Un -PosRat -NonNegInexactReal)) (commutative-case -NonNegInexactReal (Un -PosRat -NonNegInexactReal))
(commutative-case -InexactReal (Un -PosRat -NegRat -InexactReal) -InexactReal) (commutative-case -InexactReal (Un -PosRat -NegRat -InexactReal) -InexactReal)
(map unop inexact-real-types)
(varop-1+ -InexactReal) (varop-1+ -InexactReal)
;; reals ;; reals
(map unop real-types)
(varop -NonNegReal) ; (* +inf.0 0.0) -> +nan.0 (varop -NonNegReal) ; (* +inf.0 0.0) -> +nan.0
(-> -NegReal -NegReal)
(-> -NonPosReal -NonPosReal)
(-> -NegReal -NegReal -NonNegReal) (-> -NegReal -NegReal -NonNegReal)
(commutative-binop -NegReal -PosReal -NonPosReal) (commutative-binop -NegReal -PosReal -NonPosReal)
(-> -NegReal -NegReal -NegReal -NonPosReal) (-> -NegReal -NegReal -NegReal -NonPosReal)
@ -1110,6 +1108,7 @@
(commutative-case -FloatComplex (Un -InexactComplex -InexactReal -PosRat -NegRat) -FloatComplex) (commutative-case -FloatComplex (Un -InexactComplex -InexactReal -PosRat -NegRat) -FloatComplex)
(commutative-case -SingleFlonumComplex (Un -SingleFlonumComplex -SingleFlonum -PosRat -NegRat) -SingleFlonumComplex) (commutative-case -SingleFlonumComplex (Un -SingleFlonumComplex -SingleFlonum -PosRat -NegRat) -SingleFlonumComplex)
(commutative-case -InexactComplex (Un -InexactComplex -InexactReal -PosRat -NegRat) -InexactComplex) (commutative-case -InexactComplex (Un -InexactComplex -InexactReal -PosRat -NegRat) -InexactComplex)
(map unop number-types)
(varop N))] (varop N))]
[+ (from-cases [+ (from-cases
(-> -Zero) (-> -Zero)
@ -1131,9 +1130,11 @@
(commutative-binop -NonPosFixnum -NonNegFixnum -Fixnum) (commutative-binop -NonPosFixnum -NonNegFixnum -Fixnum)
(commutative-case -PosInt -Nat -PosInt) (commutative-case -PosInt -Nat -PosInt)
(commutative-case -NegInt -NonPosInt -NegInt) (commutative-case -NegInt -NonPosInt -NegInt)
(map unop all-int-types)
(map varop (list -Nat -NonPosInt -Int)) (map varop (list -Nat -NonPosInt -Int))
(commutative-case -PosRat -NonNegRat -PosRat) (commutative-case -PosRat -NonNegRat -PosRat)
(commutative-case -NegRat -NonPosRat -NegRat) (commutative-case -NegRat -NonPosRat -NegRat)
(map unop rat-types)
(map varop (list -NonNegRat -NonPosRat -Rat)) (map varop (list -NonNegRat -NonPosRat -Rat))
;; flonum + real -> flonum ;; flonum + real -> flonum
(commutative-case -PosFlonum -NonNegReal -PosFlonum) (commutative-case -PosFlonum -NonNegReal -PosFlonum)
@ -1143,6 +1144,7 @@
(commutative-case -NonNegFlonum -NonNegReal -NonNegFlonum) (commutative-case -NonNegFlonum -NonNegReal -NonNegFlonum)
(commutative-case -NonPosFlonum -NonPosReal -NonPosFlonum) (commutative-case -NonPosFlonum -NonPosReal -NonPosFlonum)
(commutative-case -Flonum -Real -Flonum) (commutative-case -Flonum -Real -Flonum)
(map unop all-flonum-types)
(varop-1+ -Flonum) (varop-1+ -Flonum)
;; single-flonum + rat -> single-flonum ;; single-flonum + rat -> single-flonum
(commutative-case -PosSingleFlonum (Un -NonNegRat -NonNegSingleFlonum) -PosSingleFlonum) (commutative-case -PosSingleFlonum (Un -NonNegRat -NonNegSingleFlonum) -PosSingleFlonum)
@ -1152,6 +1154,7 @@
(commutative-case -NonNegSingleFlonum (Un -NonNegRat -NonNegSingleFlonum) -NonNegSingleFlonum) (commutative-case -NonNegSingleFlonum (Un -NonNegRat -NonNegSingleFlonum) -NonNegSingleFlonum)
(commutative-case -NonPosSingleFlonum (Un -NonPosRat -NonPosSingleFlonum) -NonPosSingleFlonum) (commutative-case -NonPosSingleFlonum (Un -NonPosRat -NonPosSingleFlonum) -NonPosSingleFlonum)
(commutative-case -SingleFlonum (Un -Rat -SingleFlonum) -SingleFlonum) (commutative-case -SingleFlonum (Un -Rat -SingleFlonum) -SingleFlonum)
(map unop single-flonum-types)
(varop-1+ -SingleFlonum) (varop-1+ -SingleFlonum)
;; inexact-real + real -> inexact-real ;; inexact-real + real -> inexact-real
(commutative-case -PosInexactReal -NonNegReal -PosInexactReal) (commutative-case -PosInexactReal -NonNegReal -PosInexactReal)
@ -1161,15 +1164,18 @@
(commutative-case -NonNegInexactReal -NonNegReal -NonNegInexactReal) (commutative-case -NonNegInexactReal -NonNegReal -NonNegInexactReal)
(commutative-case -NonPosInexactReal -NonPosReal -NonPosInexactReal) (commutative-case -NonPosInexactReal -NonPosReal -NonPosInexactReal)
(commutative-case -InexactReal -Real -InexactReal) (commutative-case -InexactReal -Real -InexactReal)
(map unop inexact-real-types)
;; real ;; real
(commutative-case -PosReal -NonNegReal -PosReal) (commutative-case -PosReal -NonNegReal -PosReal)
(commutative-case -NegReal -NonPosReal -NegReal) (commutative-case -NegReal -NonPosReal -NegReal)
(map unop real-types)
(map varop (list -NonNegReal -NonPosReal -Real -ExactNumber)) (map varop (list -NonNegReal -NonPosReal -Real -ExactNumber))
;; complex ;; complex
(commutative-case -FloatComplex N -FloatComplex) (commutative-case -FloatComplex N -FloatComplex)
(commutative-case -Flonum -InexactComplex -FloatComplex) (commutative-case -Flonum -InexactComplex -FloatComplex)
(commutative-case -SingleFlonumComplex (Un -Rat -SingleFlonum -SingleFlonumComplex) -SingleFlonumComplex) (commutative-case -SingleFlonumComplex (Un -Rat -SingleFlonum -SingleFlonumComplex) -SingleFlonumComplex)
(commutative-case -InexactComplex (Un -Rat -InexactReal -InexactComplex) -InexactComplex) (commutative-case -InexactComplex (Un -Rat -InexactReal -InexactComplex) -InexactComplex)
(map unop number-types)
(varop N))] (varop N))]
[- (from-cases [- (from-cases
@ -1283,23 +1289,24 @@
(commutative-case -PosIndex -Index) (commutative-case -PosIndex -Index)
(commutative-case -PosFixnum -Fixnum) (commutative-case -PosFixnum -Fixnum)
(commutative-case -NonNegFixnum -Fixnum) (commutative-case -NonNegFixnum -Fixnum)
(map varop (list -NegFixnum -NonPosFixnum -Fixnum)) (map varop (list -NegFixnum -NonPosFixnum -PosFixnum -NonNegFixnum -Fixnum))
(commutative-case -PosInt -Int) (commutative-case -PosInt -Int)
(commutative-case -Nat -Int) (commutative-case -Nat -Int)
(map varop (list -NegInt -NonPosInt -Int)) (map varop (list -NegInt -NonPosInt -PosInt -Nat -Int))
;; we could have more cases here. for instance, when mixing PosInt ;; we could have more cases here. for instance, when mixing PosInt
;; and NegRats, we get a result of type PosInt (not just PosRat) ;; and NegRats, we get a result of type PosInt (not just PosRat)
;; there's a lot of these, but they may not be worth including ;; there's a lot of these, but they may not be worth including
(commutative-case -PosRat -Rat) (commutative-case -PosRat -Rat)
(commutative-case -NonNegRat -Rat) (commutative-case -NonNegRat -Rat)
(map varop (list -NegRat -NonPosRat -Rat (map varop (list -NegRat -NonPosRat -PosRat -NonNegRat -Rat
-FlonumPosZero -FlonumNegZero -FlonumZero)) -FlonumPosZero -FlonumNegZero -FlonumZero))
;; inexactness is contagious: (max 3 2.3) => 3.0 ;; inexactness is contagious: (max 3 2.3) => 3.0
;; we could add cases to encode that ;; we could add cases to encode that
(commutative-case -PosFlonum -Flonum) (commutative-case -PosFlonum -Flonum)
(commutative-case -NonNegFlonum -Flonum) (commutative-case -NonNegFlonum -Flonum)
(map varop (list -NegFlonum -NonPosFlonum -Flonum (map varop (list -NegFlonum -NonPosFlonum -PosFlonum -NonNegFlonum -Flonum
-SingleFlonumPosZero -SingleFlonumNegZero -SingleFlonumZero)) -SingleFlonumPosZero -SingleFlonumNegZero -SingleFlonumZero))
(varop -PosSingleFlonum)
(commutative-case -PosSingleFlonum -SingleFlonum) (commutative-case -PosSingleFlonum -SingleFlonum)
(varop -NonNegSingleFlonum) (varop -NonNegSingleFlonum)
(commutative-case -NonNegSingleFlonum -SingleFlonum) (commutative-case -NonNegSingleFlonum -SingleFlonum)
@ -1307,43 +1314,43 @@
-InexactRealPosZero -InexactRealNegZero -InexactRealZero)) -InexactRealPosZero -InexactRealNegZero -InexactRealZero))
(commutative-case -PosInexactReal -InexactReal) (commutative-case -PosInexactReal -InexactReal)
(commutative-case -NonNegInexactReal -InexactReal) (commutative-case -NonNegInexactReal -InexactReal)
(map varop (list -NegInexactReal -NonPosInexactReal -InexactReal (map varop (list -NegInexactReal -NonPosInexactReal -PosInexactReal -NonNegInexactReal
-RealZero)) -InexactReal -RealZero))
(commutative-case -PosReal -Real) (commutative-case -PosReal -Real)
(commutative-case -NonNegReal -Real) (commutative-case -NonNegReal -Real)
(map varop (list -NegReal -NonPosReal -Real)))] (map varop (list -NegReal -NonPosReal -PosReal -NonNegReal -Real)))]
[min [min
(from-cases (map varop (list -Zero -One)) (from-cases (map varop (list -Zero -One))
(commutative-case -Zero -One) (commutative-case -Zero -One)
(map varop (list -PosByte -Byte -PosIndex -Index -PosFixnum -NonNegFixnum)) (map varop (list -PosByte -Byte -PosIndex -Index -PosFixnum -NonNegFixnum))
(commutative-case -NegFixnum -Fixnum) (commutative-case -NegFixnum -Fixnum)
(commutative-case -NonPosFixnum -Fixnum) (commutative-case -NonPosFixnum -Fixnum)
(map varop (list -Fixnum -PosInt -Nat)) (map varop (list -NegFixnum -NonPosFixnum -Fixnum -PosInt -Nat))
(commutative-case -NegInt -Int) (commutative-case -NegInt -Int)
(commutative-case -NonPosInt -Int) (commutative-case -NonPosInt -Int)
(map varop (list -Int -PosRat -NonNegRat)) (map varop (list -NegInt -NonPosInt -Int -PosRat -NonNegRat))
(commutative-case -NegRat -Rat) (commutative-case -NegRat -Rat)
(commutative-case -NonPosRat -Rat) (commutative-case -NonPosRat -Rat)
(map varop (list -Rat (map varop (list -NegRat -NonPosRat -Rat
-FlonumPosZero -FlonumNegZero -FlonumZero -FlonumPosZero -FlonumNegZero -FlonumZero
-PosFlonum -NonNegFlonum)) -PosFlonum -NonNegFlonum))
(commutative-case -NegFlonum -Flonum) (commutative-case -NegFlonum -Flonum)
(commutative-case -NonPosFlonum -Flonum) (commutative-case -NonPosFlonum -Flonum)
(map varop (list -Flonum (map varop (list -NegFlonum -NonPosFlonum -Flonum
-SingleFlonumPosZero -SingleFlonumNegZero -SingleFlonumZero -SingleFlonumPosZero -SingleFlonumNegZero -SingleFlonumZero
-PosSingleFlonum -NonNegSingleFlonum)) -PosSingleFlonum -NonNegSingleFlonum))
(commutative-case -NegSingleFlonum -SingleFlonum) (commutative-case -NegSingleFlonum -SingleFlonum)
(commutative-case -NonPosSingleFlonum -SingleFlonum) (commutative-case -NonPosSingleFlonum -SingleFlonum)
(map varop (list -SingleFlonum (map varop (list -NegSingleFlonum -NonPosSingleFlonum -SingleFlonum
-InexactRealPosZero -InexactRealNegZero -InexactRealZero -InexactRealPosZero -InexactRealNegZero -InexactRealZero
-PosInexactReal -NonNegInexactReal)) -PosInexactReal -NonNegInexactReal))
(commutative-case -NegInexactReal -InexactReal) (commutative-case -NegInexactReal -InexactReal)
(commutative-case -NonPosInexactReal -InexactReal) (commutative-case -NonPosInexactReal -InexactReal)
(map varop (list -InexactReal (map varop (list -NegInexactReal -NonPosInexactReal -InexactReal
-RealZero -PosReal -NonNegReal)) -RealZero -PosReal -NonNegReal))
(commutative-case -NegReal -Real) (commutative-case -NegReal -Real)
(commutative-case -NonPosReal -Real) (commutative-case -NonPosReal -Real)
(varop -Real))] (map varop (list -NegReal -NonPosReal -Real)))]
[add1 (from-cases [add1 (from-cases
(-> -Zero -One) (-> -Zero -One)