<xsl:template name="factorial"> <xsl:param name="n"/> <xsl:choose> <xsl:when test="$n = 0">1</xsl:when> <!-- factorial(0) = 1 --> <xsl:when test="$n > 0"> <!-- factorial(n) = --> <xsl:variable name="factor"> <xsl:call-template name="factorial"> <xsl:with-param name="n" select="$n - 1"/> </xsl:call-template> </xsl:variable> <xsl:value-of select="$n * $factor"/> <!-- n*factorial(n-1) --> </xsl:when> </xsl:choose> </xsl:template>
a) The same program can be written in Relfun (Prolog-like syntax) as
factorial(0) :& 1. factorial(N) :- >(N,0), Factor .= factorial(-(N,1)) & *(N,Factor).Change this Relfun program such that the auxiliary variable Factor is no longer needed. Hint: Substitute Factor's second occurrence with the value of its first occurrence.
b) Considering an a)-like change also in the XSLT program, what would be required here for a factorial definition without the auxiliary variable factor?
c) Define a recursive factorial function in RFML, MathML, or some other markup language. Hint: RFML markup may be produced automatically from Relfun's Prolog-like syntax via "style xml" of the Relfun system.
d) List three essential features making the XSLT version different (longer or shorter) than your version defined in c).
e) Copy and edit the XSLT version such that it defines the non-recursive function ab2(a,b) := a*a + 2*a*b + b*b. Hint: Consider whether or not you'll need a variable corresponding to factor.
f) Define a function factorialab2 in XSLT, which composes the factorial and ab2 functions as follows: factorialab2(m,n) := factorial(ab2(m,n)). Hint: In Relfun factorialab2 could be defined directly, like in the above nesting, or with an auxiliary variable, as factorialab2(M,N) :- Squaresum .= ab2(M,N) & factorial(Squaresum).