Here we give two examples of defining functions by mutual recursion in Axiom Recursion between Separate DomainsFirst 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 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.Now we can define 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.But the bootstrap definition of EVEN is incomplete. It really
depends (recusively) on ODD. So finally we need the full
(re-)definition of 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.Now we can test the new function: axiom parity(10)$even
Type: Boolean
axiom parity(8)$odd
Type: Boolean
axiom parity(-1111)$odd
Type: Boolean
Recursion within a Single DomainIt 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.Test axiom Even(10)$Parity
Type: Boolean
axiom Odd(8)$Parity
Type: Boolean
axiom Odd(-1111)$Parity
Type: Boolean
|