<!--===============================================-->
<!-- TMDoublePQ.xsl -->
<!-- The interpreter of the Turing machine -->
<!--===============================================-->
<!-- Example of the program for the Turing machine -->
<!-- Multiplication on 2 in a unary notation -->
<!--===============================================-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xt="http://www.jclark.com/xt"
version="1.0">
<xsl:template match="Go">
<xsl:call-template name="Go2">
<xsl:with-param name="TMS">
<Go>
<Instruction CurrentState="start"
CurrentSymbol="B" NextSymbol="B"
NextState="stop" Movement="right">
<Instruction CurrentState="start"
CurrentSymbol="Q" NextSymbol="Q"
NextState="start" Movement="right">
<Instruction CurrentState="start"
CurrentSymbol="P" NextSymbol="Q"
NextState="moveleft" Movement="left">
<Instruction CurrentState="moveleft"
CurrentSymbol="Q" NextSymbol="Q"
NextState="moveleft" Movement="left">
<Instruction CurrentState="moveleft"
CurrentSymbol="B" NextSymbol="Q"
NextState="start" Movement="right">
</Instruction>
</Instruction>
</Instruction>
</Instruction>
</Instruction>
<State>start</State>
<xsl:copy-of select="TapeLeft"/>
<xsl:copy-of select="Symbol"/>
<xsl:copy-of select="TapeRight"/>
</Go>
</xsl:with-param>
</xsl:call-template>
</xsl:template>
<!--===============================================-->
<!-- Head function -->
<!--===============================================-->
<xsl:template name="Go2">
<xsl:param name="TMS"/>
<xsl:for-each select="xt:node-set($TMS)/Go">
<xsl:choose>
<xsl:when test="State='stop'">
<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="Go2">
<xsl:with-param name="TMS">
<Go>
<xsl:copy-of select="Instruction"/>
<xsl:call-template name="Step">
<xsl:with-param name="TMS">
<Go>
<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"/>
</Go>
</xsl:with-param>
</xsl:call-template>
</Go>
</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)/Go">
<xsl:choose>
<xsl:when test="Instruction/@CurrentState=State">
<xsl:choose>
<xsl:when test="Instruction/@CurrentSymbol=Symbol">
<xsl:choose>
<xsl:when test="Instruction/@Movement='right'">
<State>
<xsl:value-of select="Instruction/@NextState"/>
</State>
<TapeLeft>
<Nod>
<Square>
<xsl:value-of select="Instruction/@NextSymbol"/>
</Square>
<xsl:copy-of select="TapeLeft/Nod"/>
</Nod>
</TapeLeft>
<Symbol>
<xsl:value-of select="TapeRight/Nod/Square"/>
</Symbol>
<TapeRight>
<xsl:copy-of select="TapeRight/Nod/Nod"/>
</TapeRight>
</xsl:when>
<xsl:when test="Instruction/@Movement='left'">
<State>
<xsl:value-of select="Instruction/@NextState"/>
</State>
<TapeLeft>
<xsl:copy-of select="TapeLeft/Nod/Nod"/>
</TapeLeft>
<Symbol>
<xsl:value-of select="TapeLeft/Nod/Square"/>
</Symbol>
<TapeRight>
<Nod>
<Square>
<xsl:value-of select="Instruction/@NextSymbol"/>
</Square>
<xsl:copy-of select="TapeRight/Nod"/>
</Nod>
</TapeRight>
</xsl:when>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="Step">
<xsl:with-param name="TMS">
<Go>
<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"/>
</Go>
</xsl:with-param>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="Step">
<xsl:with-param name="TMS">
<Go>
<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"/>
</Go>
</xsl:with-param>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>