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

Edit detail for SubDomain revision 7 of 7

1 2 3 4 5 6 7
Editor: Bill Page
Time: 2008/09/20 17:12:46 GMT-7
Note: problems with values of domains in types

removed:
-K := Fraction Integer
-g := matrix [[1,0,0,0], [0,-1,0,0], [0,0,-1,0], [0,0,0,-1]]
-D := CliffordAlgebra(4,K, quadraticForm g)
-D::InputForm
-unparse %

added:

Here is a useful function for parsing input strings
\begin{axiom}
parse(s:String):InputForm == ncParseFromString(s)$Lisp pretend InputForm
parse("Integer")
\end{axiom}

There are still problems problems with values of domains in types
\begin{axiom}
)set output tex off
)set output algebra on
\end{axiom}

\begin{axiom}
CliffordAlgebra(4,Fraction Integer, quadraticForm matrix [[1,0,0,0], [0,-1,0,0], [0,0,-1,0], [0,0,0,-1]])
%::InputForm
parse("CliffordAlgebra(4,Fraction Integer, quadraticForm matrix [[1,0,0,0], [0,-1,0,0], [0,0,-1,0], [0,0,0,-1]])")
interpret(%)
%::InputForm
\end{axiom}

changed:
-package.
package. But limitation of FriCAS that prevent us from passing
domain-values as parameters of functions mean we must do it
this way.

removed:
-parse(s:String):InputForm == ncParseFromString(s)$Lisp pretend InputForm

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

\label{eq1}\hbox{\axiomType{Integer}\ }(1)
Type: Type
fricas
Ring

\label{eq2}\hbox{\axiomType{Ring}\ }(2)
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 19 NOV 2024 02:50:23 AM):
; 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 19 NOV 2024 02:50:23 AM):
; 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

\label{eq3}\hbox{\axiomType{Integer}\ }(3)
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

\label{eq4}\left(\hbox{\axiomType{Integer}\ } \right)(4)
Type: 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

\label{eq5}\left(\hbox{\axiomType{Integer}\ } \right)(5)
Type: InputForm
fricas
interpret(a)$InputForm

\label{eq6}\hbox{\axiomType{Integer}\ }(6)
Type: Type
fricas
unparse(a)$InputForm

\label{eq7}\verb#"Integer()"#(7)
Type: String
fricas
b:=PrimeField(11)::InputForm

\label{eq8}\left(\hbox{\axiomType{PrimeField}\ } \ {11}\right)(8)
Type: InputForm
fricas
interpret(b)$InputForm

\label{eq9}\hbox{\axiomType{PrimeField}\ } \left({11}\right)(9)
Type: Type
fricas
unparse(b)$InputForm

\label{eq10}\verb#"PrimeField(11)"#(10)
Type: String
fricas
c:=DirectProduct(3,Fraction Integer)::InputForm

\label{eq11}\left(\hbox{\axiomType{DirectProduct}\ } \  3 \ {\left(\hbox{\axiomType{Fraction}\ } \ {\left(\hbox{\axiomType{Integer}\ } \right)}\right)}\right)(11)
Type: InputForm
fricas
interpret(c)$InputForm

\label{eq12}\hbox{\axiomType{DirectProduct}\ } \left({3, \:{\hbox{\axiomType{Fraction}\ } \left({\hbox{\axiomType{Integer}\ }}\right)}}\right)(12)
Type: Type
fricas
unparse(c)$InputForm

\label{eq13}\verb#"DirectProduct(3,Fraction(Integer()))"#(13)
Type: String
fricas
d:=Ring::InputForm

\label{eq14}\left(\hbox{\axiomType{Ring}\ } \right)(14)
Type: InputForm
fricas
interpret(d)$InputForm

\label{eq15}\hbox{\axiomType{Ring}\ }(15)
Type: Category
fricas
unparse(d)$InputForm

\label{eq16}\verb#"Ring()"#(16)
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

\label{eq17}\hbox{\axiomType{Integer}\ }(17)
Type: 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 19 NOV 2024 02:50:23 AM):
; wrote /var/aw/var/LatexWiki/INFORM1.NRLIB/INFORM1.fasl ; compilation finished in 0:00:00.008 ------------------------------------------------------------------------ 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)
Type: InputForm
fricas
interpret(parse("x^2+1"))$INFORM1(Polynomial Float)
2 (24) x + 1.0
Type: Polynomial(Float)