<!--===============================================--> <!-- tm.xsl --> <!-- The interpreter of the Turing machine --> <!--===============================================--> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xt="http://www.jclark.com/xt" version="1.0"> <xsl:template match="TM"> <xsl:call-template name="TM2"> <xsl:with-param name="TMS"> <xsl:copy-of select="."/> </xsl:with-param> </xsl:call-template> </xsl:template> <!--===============================================--> <!-- Head function --> <!--===============================================--> <xsl:template name="TM2"> <xsl:param name="TMS"/> <xsl:for-each select="xt:node-set($TMS)/TM"> <xsl:choose> <xsl:when test="State='Z'"> <TM> <xsl:copy-of select="TapeLeft"/> <xsl:copy-of select="Symbol"/> <xsl:copy-of select="TapeRight"/> </TM> </xsl:when> <xsl:otherwise> <xsl:call-template name="TM2"> <xsl:with-param name="TMS"> <TM> <xsl:copy-of select="Instruction"/> <xsl:call-template name="Step"> <xsl:with-param name="TMS"> <TM> <xsl:copy-of select="Instruction"/> <xsl:copy-of select="State"/> <xsl:copy-of select="TapeLeft"/> <xsl:copy-of select="Symbol"/> <xsl:copy-of select="TapeRight"/> </TM> </xsl:with-param> </xsl:call-template> </TM> </xsl:with-param> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:for-each> </xsl:template> <!--===============================================--> <!-- One step of the Turing machine --> <!--===============================================--> <xsl:template name="Step"> <xsl:param name="TMS"/> <xsl:for-each select="xt:node-set($TMS)/TM"> <xsl:choose> <xsl:when test="Instruction/@CurrentState=State"> <xsl:choose> <xsl:when test="Instruction/@CurrentSymbol=Symbol"> <xsl:choose> <xsl:when test="Instruction/@Move='R'"> <State> <xsl:value-of select="Instruction/@NextState"/> </State> <TapeLeft> <Node> <Square> <xsl:value-of select="Instruction/@NextSymbol"/> </Square> <xsl:copy-of select="TapeLeft/Node"/> </Node> </TapeLeft> <Symbol> <xsl:value-of select="TapeRight/Node/Square"/> </Symbol> <TapeRight> <Node> <xsl:for-each select="TapeRight/Node/Node"> <xsl:apply-templates/> </xsl:for-each> </Node> </TapeRight> </xsl:when> <xsl:when test="Instruction/@Move='L'"> <State> <xsl:value-of select="Instruction/@NextState"/> </State> <TapeLeft> <Node> <xsl:for-each select="TapeLeft/Node/Node"> <xsl:apply-templates/> </xsl:for-each> </Node> </TapeLeft> <Symbol> <xsl:value-of select="TapeLeft/Node/Square"/> </Symbol> <TapeRight> <Node> <Square> <xsl:value-of select="Instruction/@NextSymbol"/> </Square> <xsl:copy-of select="TapeRight/Node"/> </Node> </TapeRight> </xsl:when> </xsl:choose> </xsl:when> <xsl:otherwise> <xsl:call-template name="Step"> <xsl:with-param name="TMS"> <TM> <xsl:copy-of select="Instruction/Instruction"/> <xsl:copy-of select="State"/> <xsl:copy-of select="TapeLeft"/> <xsl:copy-of select="Symbol"/> <xsl:copy-of select="TapeRight"/> </TM> </xsl:with-param> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:when> <xsl:otherwise> <xsl:call-template name="Step"> <xsl:with-param name="TMS"> <TM> <xsl:copy-of select="Instruction/Instruction"/> <xsl:copy-of select="State"/> <xsl:copy-of select="TapeLeft"/> <xsl:copy-of select="Symbol"/> <xsl:copy-of select="TapeRight"/> </TM> </xsl:with-param> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:for-each> </xsl:template> <!--===============================================--> <!-- Processing of the end of a tape --> <!--===============================================--> <xsl:template match="End"> <Node><Square>b</Square> <Node><Square>b</Square> <End/> </Node></Node> </xsl:template> <xsl:template match="Node"> <xsl:copy-of select="."/> </xsl:template> <xsl:template match="Square"> <xsl:copy-of select="."/> </xsl:template> <!--===============================================--> </xsl:stylesheet> <!--===============================================-->