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

Here we give two examples of defining functions by mutual recursion in Axiom

Recursion between Separate Domains

First we show how to define two separate domains EVEN and ODD both of which have an attribute represented by the polymorthic function parity.

We must start with a "bootstrap" definition of parity(n)$even. All that is really needed here is a package that exports a function named parity with the right signature. This particular function will never be called and will be re-defined later. It's only purpose is as a placeholder to allow the later definition of ODD.

spad
)abbrev domain EVEN even
even(): E == I where
  E == with
    parity: Integer -> Boolean
  I == add
    parity(n) == true
spad
   Compiling FriCAS source code from file 
      /var/zope2/var/LatexWiki/3342984326569348053-25px001.spad using 
      old system compiler.
   EVEN abbreviates domain even 
------------------------------------------------------------------------
   initializing NRLIB EVEN for even 
   compiling into NRLIB EVEN 
   compiling exported parity : Integer -> Boolean
      EVEN;parity;IB;1 is replaced by QUOTET 
Time: 0 SEC.
(time taken in buildFunctor: 0)
;;; *** |even| REDEFINED
;;; *** |even| REDEFINED Time: 0 SEC.
Cumulative Statistics for Constructor even Time: 0 seconds
finalizing NRLIB EVEN Processing even for Browser database: --->-->even((parity ((Boolean) (Integer)))): Not documented!!!! --->-->even(constructor): Not documented!!!! --->-->even(): Missing Description ------------------------------------------------------------------------ even is now explicitly exposed in frame initial even will be automatically loaded when needed from /var/zope2/var/LatexWiki/EVEN.NRLIB/code

Now we can define parity(n)$odd. It depends on EVEN.

spad
)abbrev domain ODD odd
odd(): E == I where
  E == with
    parity: Integer -> Boolean
  I == add
    parity(n:Integer) ==
--    output("ODD",n::OutputForm)$OutputPackage
      (n>0) => parity(n-1)$even
      (n<0) => parity(n+1)$even
      false
spad
   Compiling FriCAS source code from file 
      /var/zope2/var/LatexWiki/7392352806104595030-25px002.spad using 
      old system compiler.
   ODD abbreviates domain odd 
------------------------------------------------------------------------
   initializing NRLIB ODD for odd 
   compiling into NRLIB ODD 
   compiling exported parity : Integer -> Boolean
Time: 0 SEC.
(time taken in buildFunctor: 0)
;;; *** |odd| REDEFINED
;;; *** |odd| REDEFINED Time: 0 SEC.
Cumulative Statistics for Constructor odd Time: 0 seconds
finalizing NRLIB ODD Processing odd for Browser database: --->-->odd((parity ((Boolean) (Integer)))): Not documented!!!! --->-->odd(constructor): Not documented!!!! --->-->odd(): Missing Description ------------------------------------------------------------------------ odd is now explicitly exposed in frame initial odd will be automatically loaded when needed from /var/zope2/var/LatexWiki/ODD.NRLIB/code

But the bootstrap definition of EVEN is incomplete. It really depends (recusively) on ODD. So finally we need the full (re-)definition of parity(n)$even

spad
)abbrev domain EVEN even
even(): E == I where
  E == with
    parity: Integer -> Boolean
  I == add
    parity(n) ==
--    output("EVEN",n::OutputForm)$OutputPackage
      n>0 => parity(n-1)$odd
      n<0 => parity(n+1)$odd
      true
spad
   Compiling FriCAS source code from file 
      /var/zope2/var/LatexWiki/8584362905457126194-25px003.spad using 
      old system compiler.
   Illegal NRLIB 
   EVEN.NRLIB claims that its constructor name is the domain even but 
      even is already known to be the for package EVEN .
   EVEN abbreviates domain even 
------------------------------------------------------------------------
   initializing NRLIB EVEN for even 
   compiling into NRLIB EVEN 
   compiling exported parity : Integer -> Boolean
Time: 0 SEC.
(time taken in buildFunctor: 0)
;;; *** |even| REDEFINED
;;; *** |even| REDEFINED Time: 0 SEC.
Cumulative Statistics for Constructor even Time: 0 seconds
finalizing NRLIB EVEN Processing even for Browser database: --->/var/zope2/var/LatexWiki/3342984326569348053-25px001.spad-->even((parity ((Boolean) (Integer)))): Not documented!!!! --->/var/zope2/var/LatexWiki/3342984326569348053-25px001.spad-->even(constructor): Not documented!!!! --->/var/zope2/var/LatexWiki/3342984326569348053-25px001.spad-->even(): Missing Description ------------------------------------------------------------------------ even is already explicitly exposed in frame initial even will be automatically loaded when needed from /var/zope2/var/LatexWiki/EVEN.NRLIB/code

Now we can test the new function:

axiom
parity(10)$even
LatexWiki Image(1)
Type: Boolean
axiom
parity(8)$odd
LatexWiki Image(2)
Type: Boolean
axiom
parity(-1111)$odd
LatexWiki Image(3)
Type: Boolean

Recursion within a Single Domain

It is possible to write this same recursion as a domain that exports two functions Even and Odd. In this case we do not need to supply any initial bootstrap code because the compiler is able to resolve both functions simultaneously.

spad
)abbrev domain PARITY Parity
Parity(): Exports == Implements where
  Exports == with
    Even: Integer -> Boolean
    Odd: Integer -> Boolean
  Implements == add
    Odd(n: Integer) ==
      n>0 => Even(n-1)
      n<0 => Even(n+1)
      false
    Even(n: Integer) ==
      n>0 => Odd(n-1)
      n<0 => Odd(n+1)
      true
spad
   Compiling FriCAS source code from file 
      /var/zope2/var/LatexWiki/2188084076688500475-25px005.spad using 
      old system compiler.
   PARITY abbreviates domain Parity 
------------------------------------------------------------------------
   initializing NRLIB PARITY for Parity 
   compiling into NRLIB PARITY 
   compiling exported Odd : Integer -> Boolean
Time: 0.01 SEC.
compiling exported Even : Integer -> Boolean Time: 0 SEC.
(time taken in buildFunctor: 0)
;;; *** |Parity| REDEFINED
;;; *** |Parity| REDEFINED Time: 0 SEC.
Cumulative Statistics for Constructor Parity Time: 0.01 seconds
finalizing NRLIB PARITY Processing Parity for Browser database: --->-->Parity((Even ((Boolean) (Integer)))): Not documented!!!! --->-->Parity((Odd ((Boolean) (Integer)))): Not documented!!!! --->-->Parity(constructor): Not documented!!!! --->-->Parity(): Missing Description ------------------------------------------------------------------------ Parity is now explicitly exposed in frame initial Parity will be automatically loaded when needed from /var/zope2/var/LatexWiki/PARITY.NRLIB/code

Test

axiom
Even(10)$Parity
LatexWiki Image(4)
Type: Boolean
axiom
Odd(8)$Parity
LatexWiki Image(5)
Type: Boolean
axiom
Odd(-1111)$Parity
LatexWiki Image(6)
Type: Boolean




subject:
  ( 7 subscribers )  
Please rate this page: