PositiveInteger? and NonNegativeInteger? are subdomains of Integer.
Domain
is a domain whose values are all domains.
Categories are values of the domain SubDomain Domain
.
For example:
fricas
(1) -> Integer
Type: Type
fricas
Ring
Type: Category
Unfortunately the original Axiom library did not include
definitions of these domains.
fricas
[Integer,PrimeField(3)]
LISP output:
(UNPRINTABLE UNPRINTABLE)
Type: List(Type)
fricas
[Ring,Field]
LISP output:
(UNPRINTABLE UNPRINTABLE)
Type: List(Category)
OpenAxiom has implemented Domain
and replaced
SubDomain Domain
with Category
. Here we try to provide
something similar for FriCAS.
spad
)abbrev domain DOMAIN Domain
Domain():SetCategory
== add
coerce(x:%):OutputForm ==
n:SExpression:=devaluate(x)$Lisp
#n=1 => car(n) pretend OutputForm
n pretend OutputForm
x = y ==
devaluate(x)$Lisp = devaluate(y)$Lisp
spad
Compiling FriCAS source code from file
/var/lib/zope2.10/instance/axiom-wiki/var/LatexWiki/1491057242942260927-25px004.spad
using old system compiler.
DOMAIN abbreviates domain Domain
------------------------------------------------------------------------
initializing NRLIB DOMAIN for Domain
compiling into NRLIB DOMAIN
compiling exported coerce : % -> OutputForm
Time: 0 SEC.
compiling exported = : (%,%) -> Boolean
Time: 0 SEC.
(time taken in buildFunctor: 0)
;;; *** |Domain| REDEFINED
;;; *** |Domain| REDEFINED
Time: 0 SEC.
Cumulative Statistics for Constructor Domain
Time: 0 seconds
finalizing NRLIB DOMAIN
Processing Domain for Browser database:
--->-->Domain(): Missing Description
; compiling file "/var/aw/var/LatexWiki/DOMAIN.NRLIB/DOMAIN.lsp" (written 06 DEC 2024 08:57:45 PM):
; wrote /var/aw/var/LatexWiki/DOMAIN.NRLIB/DOMAIN.fasl
; compilation finished in 0:00:00.008
------------------------------------------------------------------------
Domain is now explicitly exposed in frame initial
Domain will be automatically loaded when needed from
/var/aw/var/LatexWiki/DOMAIN.NRLIB/DOMAIN
spad
)abbrev domain SUBDOM SubDomain
SubDomain(D:Domain):SetCategory
== add
coerce(x:%):OutputForm ==
n:SExpression:=devaluate(x)$Lisp
#n=1 => car(n) pretend OutputForm
n pretend OutputForm
x = y ==
devaluate(x)$Lisp = devaluate(y)$Lisp
spad
Compiling FriCAS source code from file
/var/lib/zope2.10/instance/axiom-wiki/var/LatexWiki/1455332092143083773-25px005.spad
using old system compiler.
SUBDOM abbreviates domain SubDomain
------------------------------------------------------------------------
initializing NRLIB SUBDOM for SubDomain
compiling into NRLIB SUBDOM
compiling exported coerce : % -> OutputForm
Time: 0 SEC.
compiling exported = : (%,%) -> Boolean
Time: 0 SEC.
(time taken in buildFunctor: 0)
;;; *** |SubDomain| REDEFINED
;;; *** |SubDomain| REDEFINED
Time: 0 SEC.
Cumulative Statistics for Constructor SubDomain
Time: 0 seconds
finalizing NRLIB SUBDOM
Processing SubDomain for Browser database:
--->-->SubDomain(): Missing Description
; compiling file "/var/aw/var/LatexWiki/SUBDOM.NRLIB/SUBDOM.lsp" (written 06 DEC 2024 08:57:45 PM):
; wrote /var/aw/var/LatexWiki/SUBDOM.NRLIB/SUBDOM.fasl
; compilation finished in 0:00:00.004
------------------------------------------------------------------------
SubDomain is now explicitly exposed in frame initial
SubDomain will be automatically loaded when needed from
/var/aw/var/LatexWiki/SUBDOM.NRLIB/SUBDOM
fricas
[Integer,PrimeField(3)]
LISP output:
(UNPRINTABLE UNPRINTABLE)
Type: List(Type)
fricas
%.1
Type: Type
fricas
[Ring,Field,IntegerNumberSystem]
LISP output:
(UNPRINTABLE UNPRINTABLE UNPRINTABLE)
Type: List(Category)
Also we would like to be able to coerce both Domain and
SubDomain to InputForm
fricas
Integer::InputForm
Coercions like these are a special case in the Axiom
interpreter. Here we modify the treatment for InputForm
in references to '(InputForm) below.
From: interp/i-coerce.boot
boot
coerceInteractive(triple,t2) ==
-- bind flag for recording/reporting instantiations
-- (see recordInstantiation)
t1 := objMode triple
val := objVal triple
null(t2) or t2 = $EmptyMode => NIL
t2 = t1 => triple
t2 = '$NoValueMode => objNew(val,t2)
if t2 is ['SubDomain,x,.] then t2:= x
-- JHD added category Aug 1996 for BasicMath
-- WSP modified for coercion to InputForm Sept 2008
t1 in '((Category) (Mode) (Domain) (SubDomain (Domain))) =>
t2 = $OutputForm => objNew(val,t2)
t2 = '(InputForm) => objNewWrap(val,t2)
NIL
t1 = '$NoValueMode =>
if $compilingMap then clearDependentMaps($mapName,nil)
throwKeyedMsg("S2IC0009",[t2,$mapName])
$insideCoerceInteractive: local := true
expr2 := EQUAL(t2,$OutputForm)
if expr2 then startTimingProcess 'print
else startTimingProcess 'coercion
-- next 2 lines handle cases like '"failed"
result :=
expr2 and (t1 = val) => objNew(val,$OutputForm)
expr2 and t1 is ['Variable,var] => objNewWrap(var,$OutputForm)
t2 = '(InputForm) => objNewWrap(val,t2)
coerceInt0(triple,t2)
if expr2 then stopTimingProcess 'print
else stopTimingProcess 'coercion
result
boot
The file
/var/lib/zope2.10/instance/axiom-wiki/var/LatexWiki/5299509375252708736-25px009.boot
is needed but does not exist.
Now we get
fricas
a:=Integer::InputForm
fricas
interpret(a)$InputForm
Type: Type
fricas
unparse(a)$InputForm
Type: String
fricas
b:=PrimeField(11)::InputForm
fricas
interpret(b)$InputForm
Type: Type
fricas
unparse(b)$InputForm
Type: String
fricas
c:=DirectProduct(3,Fraction Integer)::InputForm
fricas
interpret(c)$InputForm
Type: Type
fricas
unparse(c)$InputForm
Type: String
fricas
d:=Ring::InputForm
fricas
interpret(d)$InputForm
Type: Category
fricas
unparse(d)$InputForm
Type: String
Here is a useful function for parsing input strings
fricas
parse(s:String):InputForm == ncParseFromString(s)$Lisp pretend InputForm
Function declaration parse : String -> InputForm has been added to
workspace.
Type: Void
fricas
parse("Integer")
fricas
Compiling function parse with type String -> InputForm
There are still problems problems with values of domains in types
fricas
)set output tex off
fricas
)set output algebra on
fricas
CliffordAlgebra(4,Fraction Integer, quadraticForm matrix [[1,0,0,0], [0,-1,0,0], [0,0,-1,0], [0,0,0,-1]])
There are 1 exposed and 0 unexposed library operations named
quadraticForm having 1 argument(s) but none was determined to be
applicable. Use HyperDoc Browse, or issue
)display op quadraticForm
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
quadraticForm with argument type(s)
Matrix(Integer)
Perhaps you should use "@" to indicate the required return type,
or "$" to specify which version of the function you need.
We can easily implement similar functionality at the Spad
(algebra library) level by extending the InputFormFunction1
package. But limitation of FriCAS that prevent us from passing
domain-values as parameters of functions mean we must do it
this way.
spad
)abbrev package INFORM1 InputFormFunctions1
--)boot $noSubsumption := false
++ Tools for manipulating input forms
++ Author: Manuel Bronstein
++ Date Created: ???
++ Date Last Updated: 19 April 1991
++ Description: Tools for manipulating input forms.
InputFormFunctions1(R:Type):with
packageCall: Symbol -> InputForm
++ packageCall(f) returns the input form corresponding to f$R.
interpret : InputForm -> R
++ interpret(f) passes f to the interpreter, and transforms
++ the result into an object of type R.
domainToInputForm: () -> InputForm
++ convert a domain to InputForm
== add
domainToInputForm():InputForm == devaluate(R)$Lisp
packageCall name ==
convert([convert("$elt"::Symbol), domainToInputForm(),
convert name]$List(InputForm))@InputForm
interpret form ==
retract(interpret(convert([convert("@"::Symbol), form,
domainToInputForm()]$List(InputForm))@InputForm)$InputForm)$AnyFunctions1(R)
spad
Compiling FriCAS source code from file
/var/lib/zope2.10/instance/axiom-wiki/var/LatexWiki/8025279438643830910-25px014.spad
using old system compiler.
INFORM1 abbreviates package InputFormFunctions1
------------------------------------------------------------------------
initializing NRLIB INFORM1 for InputFormFunctions1
compiling into NRLIB INFORM1
compiling exported domainToInputForm : () -> InputForm
Time: 0 SEC.
compiling exported packageCall : Symbol -> InputForm
Time: 0 SEC.
compiling exported interpret : InputForm -> R
Time: 0 SEC.
(time taken in buildFunctor: 0)
;;; *** |InputFormFunctions1| REDEFINED
;;; *** |InputFormFunctions1| REDEFINED
Time: 0 SEC.
Cumulative Statistics for Constructor InputFormFunctions1
Time: 0 seconds
finalizing NRLIB INFORM1
Processing InputFormFunctions1 for Browser database:
--------constructor---------
--------(packageCall ((InputForm) (Symbol)))---------
--------(interpret (R (InputForm)))---------
--------(domainToInputForm ((InputForm)))---------
--->/usr/local/lib/fricas/target/x86_64-linux-gnu/../../src/algebra/INFORM1.spad-->InputFormFunctions1((domainToInputForm ((InputForm)))): Improper first word in comments: convert
"convert a domain to InputForm"
; compiling file "/var/aw/var/LatexWiki/INFORM1.NRLIB/INFORM1.lsp" (written 06 DEC 2024 08:57:45 PM):
; wrote /var/aw/var/LatexWiki/INFORM1.NRLIB/INFORM1.fasl
; compilation finished in 0:00:00.004
------------------------------------------------------------------------
InputFormFunctions1 is now explicitly exposed in frame initial
InputFormFunctions1 will be automatically loaded when needed from
/var/aw/var/LatexWiki/INFORM1.NRLIB/INFORM1
fricas
domainToInputForm()$INFORM1(PrimeField 7)
(23) (PrimeField 7)
fricas
interpret(parse("x^2+1"))$INFORM1(Polynomial Float)
2
(24) x + 1.0
Type: Polynomial(Float)