Mutual Recursion
last edited 7 years ago by test1

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

Recursion between Separate Domains

Mutual recursion between domains is allowed. However, compiling such domains is a little tricky. Fist one need to compile files in "bootstrap mode". That is one needs to give:

)boot $bootStrapMode := true

Then compile domains first time using )compile. Next, compile again in normal way. That is give

)boot $bootStrapMode := false

and angain use )compile.

Note, that goal of "bootstrap mode" compilation is to break cycles, so for example if there are two mutially dependent domains, then it is enough to compile in "bootstrap mode" just one.

This process can not be used on the wiki, because wiki software automatically issues compilation commands. Instead one can use manual workaround which we describe below.

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.

fricas
(1) -> <spad>
fricas
)abbrev domain EVEN even
even(): E == I where
 E == with
 parity: Integer -> Boolean
 I == add
 parity(n) == true</spad>
fricas
Compiling FriCAS source code from file 
 /var/lib/zope2.10/instance/axiom-wiki/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) Time: 0 SEC.
Cumulative Statistics for Constructor even Time: 0 seconds
finalizing NRLIB EVEN Processing even for Browser database: --->-->even(constructor): Not documented!!!! --->-->even((parity ((Boolean) (Integer)))): Not documented!!!! --->-->even(): Missing Description ; compiling file "/var/aw/var/LatexWiki/EVEN.NRLIB/EVEN.lsp" (written 10 OCT 2025 03:54:34 AM):
; wrote /var/aw/var/LatexWiki/EVEN.NRLIB/EVEN.fasl ; compilation finished in 0:00:00.008 ------------------------------------------------------------------------ even is now explicitly exposed in frame initial even will be automatically loaded when needed from /var/aw/var/LatexWiki/EVEN.NRLIB/EVEN

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/lib/zope2.10/instance/axiom-wiki/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) Time: 0 SEC.
Cumulative Statistics for Constructor odd Time: 0 seconds
finalizing NRLIB ODD Processing odd for Browser database: --->-->odd(constructor): Not documented!!!! --->-->odd((parity ((Boolean) (Integer)))): Not documented!!!! --->-->odd(): Missing Description ; compiling file "/var/aw/var/LatexWiki/ODD.NRLIB/ODD.lsp" (written 10 OCT 2025 03:54:34 AM):
; wrote /var/aw/var/LatexWiki/ODD.NRLIB/ODD.fasl ; compilation finished in 0:00:00.008 ------------------------------------------------------------------------ odd is now explicitly exposed in frame initial odd will be automatically loaded when needed from /var/aw/var/LatexWiki/ODD.NRLIB/ODD

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/lib/zope2.10/instance/axiom-wiki/var/LatexWiki/8584362905457126194-25px003.spad
 using old system compiler.
 Illegal NRLIB 
 EVENNRLIB 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/lib/zope2.10/instance/axiom-wiki/var/LatexWiki/3342984326569348053-25px001.spad-->even(constructor): Not documented!!!! --->/var/lib/zope2.10/instance/axiom-wiki/var/LatexWiki/3342984326569348053-25px001.spad-->even((parity ((Boolean) (Integer)))): Not documented!!!! --->/var/lib/zope2.10/instance/axiom-wiki/var/LatexWiki/3342984326569348053-25px001.spad-->even(): Missing Description ; compiling file "/var/aw/var/LatexWiki/EVEN.NRLIB/EVEN.lsp" (written 10 OCT 2025 03:54:34 AM):
; wrote /var/aw/var/LatexWiki/EVEN.NRLIB/EVEN.fasl ; compilation finished in 0:00:00.004 ------------------------------------------------------------------------ even is already explicitly exposed in frame initial even will be automatically loaded when needed from /var/aw/var/LatexWiki/EVEN.NRLIB/EVEN

Now we can test the new function:

fricas
parity(10)$even
Type: Boolean
fricas
parity(8)$odd
Type: Boolean
fricas
parity(-1111)$odd
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/lib/zope2.10/instance/axiom-wiki/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 SEC.
compiling exported Even : Integer -> Boolean Time: 0 SEC.
(time taken in buildFunctor: 0) Time: 0 SEC.
Cumulative Statistics for Constructor Parity Time: 0 seconds
finalizing NRLIB PARITY Processing Parity for Browser database: --->-->Parity(constructor): Not documented!!!! --->-->Parity((Even ((Boolean) (Integer)))): Not documented!!!! --->-->Parity((Odd ((Boolean) (Integer)))): Not documented!!!! --->-->Parity(): Missing Description ; compiling file "/var/aw/var/LatexWiki/PARITY.NRLIB/PARITY.lsp" (written 10 OCT 2025 03:54:34 AM):
; wrote /var/aw/var/LatexWiki/PARITY.NRLIB/PARITY.fasl ; compilation finished in 0:00:00.008 ------------------------------------------------------------------------ Parity is now explicitly exposed in frame initial Parity will be automatically loaded when needed from /var/aw/var/LatexWiki/PARITY.NRLIB/PARITY

Test

fricas
Even(10)$Parity
Type: Boolean
fricas
Odd(8)$Parity
Type: Boolean
fricas
Odd(-1111)$Parity
Type: Boolean




Subject: Be Bold !!
( 15 subscribers )
Please rate this page:

AltStyle によって変換されたページ (->オリジナル) /