<!--===============================================-->
<!--  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="Go">
	<xsl:call-template name="Go2">
	<xsl:with-param name="TMS">
		<xsl:copy-of select="."/>
	</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>