login  home  contents  what's new  discussion  bug reports     help  links  subscribe  changes  refresh  edit

Algebra

SandBoxNonZeroInteger is an attempt to define the domain of Integers without 0 as a SubDomain.

spad
)abbrev domain NZINT NonZeroInteger
NonZeroInteger: Join(OrderedAbelianSemiGroup, Monoid, CommutativeStar
                     --,CoercibleTo(Integer)
                    ) with
            gcd: (%,%) -> %
              ++ gcd(a,b) computes the greatest common divisor of two
              ++ positive integers \spad{a} and b.
            _-: % -> %
            --retract:Integer->%
            --retractIfCan:Integer->Union(%,"failed")
            --retract:NonNegativeInteger->%
            --retractIfCan:NonNegativeInteger->Union(%,"failed")
            --convert:NonNegativeInteger->%
 == SubDomain(Integer,#1 ~= 0) add
     x:%
     y:%
     z:Integer
     nz:NonNegativeInteger
     -x == (-(x pretend Integer)) pretend %
     x+y ==
      (z:=(x pretend Integer)+(y pretend Integer)) = 0 => error "zero"
      z pretend %
--coerce(x):Integer == x pretend Integer --retract(z)== z pretend % --convert(nz):% == retract(nz) --retractIfCan(z) == -- zero?(z) => "failed" -- retract(z) --retract(nz)== nz pretend % --retractIfCan(nz) == -- zero?(nz) => "failed" -- retract(nz)
spad
   Compiling FriCAS source code from file 
      /var/lib/zope2.10/instance/axiom-wiki/var/LatexWiki/5667241515969378538-25px001.spad
      using old system compiler.
   NZINT abbreviates domain NonZeroInteger 
------------------------------------------------------------------------
   initializing NRLIB NZINT for NonZeroInteger 
   compiling into NRLIB NZINT 
   compiling exported - : $ -> $
      NZINT;-;2$;1 is replaced by - 
Time: 0.02 SEC.
compiling exported + : ($,$) -> $ Time: 0 SEC.
(time taken in buildFunctor: 10)
;;; *** |NonZeroInteger| REDEFINED
;;; *** |NonZeroInteger| REDEFINED Time: 0.01 SEC.
Cumulative Statistics for Constructor NonZeroInteger Time: 0.03 seconds
--------------non extending category---------------------- .. NonZeroInteger of cat (|Join| (|OrderedAbelianSemiGroup|) (|Monoid|) (|CommutativeStar|) (CATEGORY |domain| (SIGNATURE |gcd| ($ $ $)) (SIGNATURE - ($ $)))) has no (|IntegerNumberSystem|) finalizing NRLIB NZINT Processing NonZeroInteger for Browser database: --->-->NonZeroInteger(constructor): Not documented!!!! --------(gcd (% % %))--------- --->-->NonZeroInteger((- (% %))): Not documented!!!! --->-->NonZeroInteger(): Missing Description ; compiling file "/var/aw/var/LatexWiki/NZINT.NRLIB/NZINT.lsp" (written 31 JUL 2013 03:50:19 PM):
; /var/aw/var/LatexWiki/NZINT.NRLIB/NZINT.fasl written ; compilation finished in 0:00:00.015 ------------------------------------------------------------------------ NonZeroInteger is now explicitly exposed in frame initial NonZeroInteger will be automatically loaded when needed from /var/aw/var/LatexWiki/NZINT.NRLIB/NZINT

Built-in

There are at least two places where critical knowledge of sub-domains is built into FriCAS.

In src/interp/i-util.boot we must extend the 'subDomainList':

boot
isSubDomain(d1,d2) ==
  -- d1 and d2 are different domains
  --subDomainList := '(Integer NonNegativeInteger PositiveInteger)
  subDomainList := '(Integer NonZeroInteger NonNegativeInteger PositiveInteger)
  ATOM d1 or ATOM d2 => nil
  l := MEMQ(first d2, subDomainList) =>
    MEMQ(first d1, rest l)
  nil
boot
 
   >> System error:
   invalid number of arguments: 1
>> System error: failed to find the TRUENAME of 5761030551384222823-25px002.clisp: No such file or directory

In src/interp/daase.lisp we need to make sure NonZeroInteger is known to have a 'superdomain':

lisp
(defun getdatabase (constructor key)
 (declare (special $spadroot) (special *miss*))
 (when (eq *miss* t) (format t "getdatabase call: ~20a ~a~%" constructor key))
 (let (data table stream ignore struct)
  (declare (ignore ignore))
  (when (or (symbolp constructor)
          (and (eq key 'hascategory) (pairp constructor)))
  (case key
; note that abbreviation, constructorkind and cosig are heavy hitters
; thus they occur first in the list of things to check
   (abbreviation
    (setq stream *interp-stream*)
    (when (setq struct (get constructor 'database))
      (setq data (database-abbreviation struct))))
   (constructorkind
    (setq stream *interp-stream*)
    (when (setq struct (get constructor 'database))
     (setq data (database-constructorkind struct))))
   (cosig
    (setq stream *interp-stream*)
    (when (setq struct (get constructor 'database))
     (setq data (database-cosig struct))))
   (operation
    (setq stream *operation-stream*)
    (setq data (gethash constructor *operation-hash*)))
   (constructormodemap
    (setq stream *interp-stream*)
    (when (setq struct (get constructor 'database))
     (setq data (database-constructormodemap struct))))
   (constructorcategory
    (setq stream *interp-stream*)
    (when (setq struct (get constructor 'database))
     (setq data (database-constructorcategory struct))
     (when (null data) ;domain or package then subfield of constructormodemap
      (setq data (cadar (getdatabase constructor 'constructormodemap))))))
   (operationalist
    (setq stream *interp-stream*)
    (when (setq struct (get constructor 'database))
     (setq data (database-operationalist struct))))
   (modemaps
    (setq stream *interp-stream*)
    (when (setq struct (get constructor 'database))
     (setq data (database-modemaps struct))))
   (hascategory
    (setq table  *hasCategory-hash*)
    (setq stream *category-stream*)
    (setq data (gethash constructor table)))
   (object
    (setq stream *interp-stream*)
    (when (setq struct (get constructor 'database))
     (setq data (database-object struct))))
   (asharp?
    (setq stream *interp-stream*)
    (when (setq struct (get constructor 'database))
     (setq data (database-object struct))))
   (niladic
    (setq stream *interp-stream*)
    (when (setq struct (get constructor 'database))
     (setq data (database-niladic struct))))
   (constructor?
    (when (setq struct (get constructor 'database))
      (setq data (when (database-operationalist struct) t))))
;(superdomain ; only 2 superdomains in the world ; (case constructor ; (|NonNegativeInteger| ; (setq data '((|Integer|) (IF (< |#1| 0) |false| |true|)))) ; (|PositiveInteger| ; (setq data '((|NonNegativeInteger|) (< 0 |#1|)))))) (superdomain ; 3 superdomains in the world (case constructor (|NonNegativeInteger| (setq data '((|Integer|) (IF (< |#1| 0) |false| |true|)))) (|NonZeroInteger| (setq data '((|Integer|) (IF (= |#1| 0) |false| |true|)))) (|PositiveInteger| (setq data '((|NonZeroInteger|) (< 0 |#1|))))))
(constructor (when (setq data (get constructor 'abbreviationfor)))) (defaultdomain (setq data (cadr (assoc constructor *defaultdomain-list*)))) (ancestors (setq stream *interp-stream*) (when (setq struct (get constructor 'database)) (setq data (database-ancestors struct)))) (sourcefile (setq stream *browse-stream*) (when (setq struct (get constructor 'database)) (setq data (database-sourcefile struct)))) (constructorform (setq stream *browse-stream*) (when (setq struct (get constructor 'database)) (setq data (database-constructorform struct)))) (constructorargs (setq data (cdr (getdatabase constructor 'constructorform)))) (attributes (setq stream *browse-stream*) (when (setq struct (get constructor 'database)) (setq data (database-attributes struct)))) (predicates (setq stream *browse-stream*) (when (setq struct (get constructor 'database)) (setq data (database-predicates struct)))) (documentation (setq stream *browse-stream*) (when (setq struct (get constructor 'database)) (setq data (database-documentation struct)))) (parents (setq stream *browse-stream*) (when (setq struct (get constructor 'database)) (setq data (database-parents struct)))) (users (setq stream *browse-stream*) (when (setq struct (get constructor 'database)) (setq data (database-users struct)))) (dependents (setq stream *browse-stream*) (when (setq struct (get constructor 'database)) (setq data (database-dependents struct)))) (otherwise (warn "~%(GETDATABASE ~a ~a) failed~%" constructor key))) (when (numberp data) ;fetch the real data (when *miss* (format t "getdatabase miss: ~20a ~a~%" constructor key)) (file-position stream data) (setq data (unsqueeze (read stream))) (case key ; cache the result of the database read (operation (setf (gethash constructor *operation-hash*) data)) (hascategory (setf (gethash constructor *hascategory-hash*) data)) (constructorkind (setf (database-constructorkind struct) data)) (cosig (setf (database-cosig struct) data)) (constructormodemap (setf (database-constructormodemap struct) data)) (constructorcategory (setf (database-constructorcategory struct) data)) (operationalist (setf (database-operationalist struct) data)) (modemaps (setf (database-modemaps struct) data)) (object (setf (database-object struct) data)) (niladic (setf (database-niladic struct) data)) (abbreviation (setf (database-abbreviation struct) data)) (constructor (setf (database-constructor struct) data)) (ancestors (setf (database-ancestors struct) data)) (constructorform (setf (database-constructorform struct) data)) (attributes (setf (database-attributes struct) data)) (predicates (setf (database-predicates struct) data)) (documentation (setf (database-documentation struct) data)) (parents (setf (database-parents struct) data)) (users (setf (database-users struct) data)) (dependents (setf (database-dependents struct) data)) (sourcefile (setf (database-sourcefile struct) data)))) (case key ; fixup the special cases (sourcefile (when (and data (string= (directory-namestring data) "") (string= (pathname-type data) "spad"))
(setq data (concatenate 'string $spadroot "/../../src/algebra/" data)))) (asharp? ; is this asharp code? (if (consp data) (setq data (cdr data)) (setq data nil))) (object ; fix up system object pathname (if (consp data) (setq data (if (string= (directory-namestring (car data)) "") (concatenate 'string $spadroot "/algebra/" (car data) "." *lisp-bin-filetype*) (car data))) (when (and data (string= (directory-namestring data) "")) (setq data (concatenate 'string $spadroot "/algebra/" data "." *lisp-bin-filetype*))))))) data))
lisp
; compiling file "/var/aw/var/LatexWiki/2574875374267770522-25px003.lisp" (written 31 JUL 2013 03:50:19 PM):
; /var/lib/zope2.10/instance/axiom-wiki/var/LatexWiki/2574875374267770522-25px003.fasl written ; compilation finished in 0:00:00.060 Value = T

fricas
isSubDomain(devaluate(NonNegativeInteger)$Lisp,devaluate(Integer)$Lisp)$Lisp

\label{eq1}\left(\hbox{\axiomType{NonNegativeInteger}\ } \  \hbox{\axiomType{PositiveInteger}\ } \right)(1)
Type: SExpression?
fricas
isSubDomain(devaluate(PositiveInteger)$Lisp,devaluate(Integer)$Lisp)$Lisp

\label{eq2}\left(\hbox{\axiomType{PositiveInteger}\ } \right)(2)
Type: SExpression?
fricas
isSubDomain(devaluate(NonZeroInteger)$Lisp,devaluate(Integer)$Lisp)$Lisp

\label{eq3}\left(\right)(3)
Type: SExpression?

fricas
)show NZINT
NonZeroInteger is a domain constructor Abbreviation for NonZeroInteger is NZINT This constructor is exposed in this frame. ------------------------------- Operations -------------------------------- ?*? : (%,%) -> % ?*? : (PositiveInteger,%) -> % ?+? : (%,%) -> % -? : % -> % ?<? : (%,%) -> Boolean ?<=? : (%,%) -> Boolean ?=? : (%,%) -> Boolean ?>? : (%,%) -> Boolean ?>=? : (%,%) -> Boolean 1 : () -> % ?^? : (%,PositiveInteger) -> % coerce : % -> OutputForm gcd : (%,%) -> % hash : % -> SingleInteger latex : % -> String max : (%,%) -> % min : (%,%) -> % one? : % -> Boolean recip : % -> Union(%,"failed") sample : () -> % smaller? : (%,%) -> Boolean ?~=? : (%,%) -> Boolean ?^? : (%,NonNegativeInteger) -> % hashUpdate! : (HashState,%) -> HashState

fricas
i:NZINT := 1$NZINT

\label{eq4}1(4)
Type: NonZeroInteger?
fricas
i:NZINT := (1::Integer)

\label{eq5}1(5)
Type: NonZeroInteger?
fricas
i:NZINT := 1

\label{eq6}1(6)
Type: NonZeroInteger?

fricas
j:NZINT := -1
Cannot convert right-hand side of assignment - 1
to an object of the type NonZeroInteger of the left-hand side.

fricas
j:NZINT:=-i

\label{eq7}- 1(7)
Type: NonZeroInteger?
fricas
i+1
There are 11 exposed and 8 unexposed library operations named + having 2 argument(s) but none was determined to be applicable. Use HyperDoc Browse, or issue )display op + to learn more about the available operations. Perhaps package-calling the operation or using coercions on the arguments will allow you to apply the operation.
Cannot find a definition or applicable library operation named + with argument type(s) NonZeroInteger PositiveInteger
Perhaps you should use "@" to indicate the required return type, or "$" to specify which version of the function you need. j+1
There are 11 exposed and 8 unexposed library operations named + having 2 argument(s) but none was determined to be applicable. Use HyperDoc Browse, or issue )display op + to learn more about the available operations. Perhaps package-calling the operation or using coercions on the arguments will allow you to apply the operation.
Cannot find a definition or applicable library operation named + with argument type(s) NonZeroInteger PositiveInteger
Perhaps you should use "@" to indicate the required return type, or "$" to specify which version of the function you need. i+j
>> Error detected within library code: zero

fricas
i-j
There are 8 exposed and 4 unexposed library operations named - having 2 argument(s) but none was determined to be applicable. Use HyperDoc Browse, or issue )display op - to learn more about the available operations. Perhaps package-calling the operation or using coercions on the arguments will allow you to apply the operation.
Cannot find a definition or applicable library operation named - with argument type(s) NonZeroInteger NonZeroInteger
Perhaps you should use "@" to indicate the required return type, or "$" to specify which version of the function you need. retractIfCan(0)$NZINT
The function retractIfCan is not implemented in NonZeroInteger .

Can we define NonZero as a functor?

spad
)abbrev domain NZ NonZero
NonZero(T:Ring): Join(OrderedAbelianSemiGroup, Monoid, CommutativeStar) with
    _-: % -> %
 == SubDomain(T,#1 ~= 0) add
     x:%
     y:%
     z:T
     -x == (-(x pretend T)) pretend %
     x+y ==
      (z:=(x pretend T)+(y pretend T)) = 0 => error "zero"
      z pretend %
spad
   Compiling FriCAS source code from file 
      /var/lib/zope2.10/instance/axiom-wiki/var/LatexWiki/1454296815955665866-25px010.spad
      using old system compiler.
   NZ abbreviates domain NonZero 
------------------------------------------------------------------------
   initializing NRLIB NZ for NonZero 
   compiling into NRLIB NZ 
   compiling exported - : $ -> $
Time: 0 SEC.
compiling exported + : ($,$) -> $ Time: 0 SEC.
(time taken in buildFunctor: 0)
;;; *** |NonZero| REDEFINED
;;; *** |NonZero| REDEFINED Time: 0 SEC.
Cumulative Statistics for Constructor NonZero Time: 0 seconds
finalizing NRLIB NZ Processing NonZero for Browser database: --->-->NonZero(constructor): Not documented!!!! --->-->NonZero((- (% %))): Not documented!!!! --->-->NonZero(): Missing Description ; compiling file "/var/aw/var/LatexWiki/NZ.NRLIB/NZ.lsp" (written 31 JUL 2013 03:50:20 PM):
; /var/aw/var/LatexWiki/NZ.NRLIB/NZ.fasl written ; compilation finished in 0:00:00.014 ------------------------------------------------------------------------ NonZero is now explicitly exposed in frame initial NonZero will be automatically loaded when needed from /var/aw/var/LatexWiki/NZ.NRLIB/NZ

fricas
)show NonZero(Float)
NonZero(Float) is a domain constructor. Abbreviation for NonZero is NZ This constructor is exposed in this frame. ------------------------------- Operations --------------------------------
?*? : (PositiveInteger,%) -> % ?*? : (%,%) -> % ?+? : (%,%) -> % -? : % -> % ?<? : (%,%) -> Boolean ?<=? : (%,%) -> Boolean ?=? : (%,%) -> Boolean ?>? : (%,%) -> Boolean ?>=? : (%,%) -> Boolean 1 : () -> % ?^? : (%,PositiveInteger) -> % coerce : % -> OutputForm hash : % -> SingleInteger latex : % -> String max : (%,%) -> % min : (%,%) -> % one? : % -> Boolean recip : % -> Union(%,"failed") sample : () -> % smaller? : (%,%) -> Boolean ?~=? : (%,%) -> Boolean ?^? : (%,NonNegativeInteger) -> % hashUpdate! : (HashState,%) -> HashState

fricas
f:NonZero(Float):=1

\label{eq8}1.0(8)
Type: NonZero?(Float)
fricas
g:NonZero(Float):=-f

\label{eq9}-{1.0}(9)
Type: NonZero?(Float)
fricas
f+(1.1::NonZero(Float))
Cannot convert from type Float to NonZero(Float) for value 1.1
f + -g

\label{eq10}2.0(10)
Type: NonZero?(Float)
fricas
f+g
>> Error detected within library code: zero




  Subject:   Be Bold !!
  ( 13 subscribers )  
Please rate this page: