Algebra
SandBoxNonZeroInteger is an attempt to define the domain
of Integers without 0 as a SubDomain.
fricas
(1) -> <spad>
fricas
)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>
fricas
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.01 SEC.
compiling exported + : (%,%) -> %
Time: 0 SEC.
(time taken in buildFunctor: 733)
;;; *** |NonZeroInteger| REDEFINED
;;; *** |NonZeroInteger| REDEFINED
Time: 0 SEC.
Cumulative Statistics for Constructor NonZeroInteger
Time: 0.01 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 24 FEB 2025 06:49:00 AM):
; wrote /var/aw/var/LatexWiki/NZINT.NRLIB/NZINT.fasl
; compilation finished in 0:00:00.012
------------------------------------------------------------------------
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
The file
/var/lib/zope2.10/instance/axiom-wiki/var/LatexWiki/5761030551384222823-25px002.boot
is needed but does not exist.
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
Your user access level is compiler and this command is therefore not
available. See the )set userlevel command for more information.
fricas
isSubDomain(devaluate(NonNegativeInteger)$Lisp,devaluate(Integer)$Lisp)$Lisp
fricas
isSubDomain(devaluate(PositiveInteger)$Lisp,devaluate(Integer)$Lisp)$Lisp
fricas
isSubDomain(devaluate(NonZeroInteger)$Lisp,devaluate(Integer)$Lisp)$Lisp
fricas
)show NZINT
NonZeroInteger is a domain constructor.
Abbreviation for NonZeroInteger is NZINT
This constructor is exposed in this frame.
24 Names for 28 Operations in this Domain.
------------------------------- Operations --------------------------------
?*? : (PositiveInteger, %) -> % ?*? : (%, %) -> %
?+? : (%, %) -> % -? : % -> %
?<? : (%, %) -> Boolean ?<=? : (%, %) -> Boolean
?=? : (%, %) -> Boolean ?>? : (%, %) -> Boolean
?>=? : (%, %) -> Boolean 1 : () -> %
?^? : (%, PositiveInteger) -> % coerce : % -> OutputForm
gcd : (%, %) -> % latex : % -> String
max : (%, %) -> % min : (%, %) -> %
one? : % -> Boolean recip : % -> Union(%,"failed")
sample : () -> % smaller? : (%, %) -> Boolean
?~=? : (%, %) -> Boolean
?^? : (%, NonNegativeInteger) -> %
leftPower : (%, NonNegativeInteger) -> %
leftPower : (%, PositiveInteger) -> %
leftRecip : % -> Union(%,"failed")
rightPower : (%, NonNegativeInteger) -> %
rightPower : (%, PositiveInteger) -> %
rightRecip : % -> Union(%,"failed")
fricas
i:NZINT := 1$NZINT
fricas
i:NZINT := (1::Integer)
fricas
i:NZINT := 1
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
fricas
i+1
There are 13 exposed and 11 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.
fricas
i-j
There are 9 exposed and 6 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.
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 24 FEB 2025 06:49:00 AM):
; wrote /var/aw/var/LatexWiki/NZ.NRLIB/NZ.fasl
; compilation finished in 0:00:00.008
------------------------------------------------------------------------
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.
23 Names for 27 Operations in this Domain.
------------------------------- Operations --------------------------------
?*? : (PositiveInteger, %) -> % ?*? : (%, %) -> %
?+? : (%, %) -> % -? : % -> %
?<? : (%, %) -> Boolean ?<=? : (%, %) -> Boolean
?=? : (%, %) -> Boolean ?>? : (%, %) -> Boolean
?>=? : (%, %) -> Boolean 1 : () -> %
?^? : (%, PositiveInteger) -> % coerce : % -> OutputForm
latex : % -> String max : (%, %) -> %
min : (%, %) -> % one? : % -> Boolean
recip : % -> Union(%,"failed") sample : () -> %
smaller? : (%, %) -> Boolean ?~=? : (%, %) -> Boolean
?^? : (%, NonNegativeInteger) -> %
leftPower : (%, NonNegativeInteger) -> %
leftPower : (%, PositiveInteger) -> %
leftRecip : % -> Union(%,"failed")
rightPower : (%, NonNegativeInteger) -> %
rightPower : (%, PositiveInteger) -> %
rightRecip : % -> Union(%,"failed")
fricas
f:NonZero(Float):=1
fricas
g:NonZero(Float):=-f
fricas
f+(1.1::NonZero(Float))
Cannot convert the value from type Float to NonZero(Float) .