正整数のゲーデル数化?
Posted feedbacks - XSLT
累乗は標準では定義されないので、自作しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | <xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
xmlns:my="uri:ja.doukaku.org:my-functions"
exclude-result-prefixes="my"
>
<xsl:output method="text" />
<xsl:template match="/" >
<xsl:text>geodel(9)=</xsl:text>
<xsl:value-of select="my:goedel(9)" />
<xsl:text>
goedel(81)=</xsl:text>
<xsl:value-of select="my:goedel(81)" />
<xsl:text>
goedel(230)=</xsl:text>
<xsl:value-of select="my:goedel(230)" />
<xsl:text>
</xsl:text>
</xsl:template>
<xsl:function name="my:goedel" as="xs:integer">
<xsl:param name="n" as="xs:integer" />
<xsl:if test="n<=0">
<xsl:message terminate="yes">
n must be positive integer
</xsl:message>
</xsl:if>
<xsl:variable name="n_" as="xs:string" select="xs:string($n)" />
<xsl:variable name="primes" as="xs:integer*"
select="my:primes(fn:string-length($n_))" />
<xsl:variable name="elem" as="xs:integer*">
<xsl:for-each select="fn:string-to-codepoints($n_)">
<xsl:variable name="i" as="xs:integer"
select="xs:integer(fn:codepoints-to-string((.)))" />
<xsl:variable name="idx" as="xs:integer"
select="position()" />
<xsl:sequence select="my:power($primes[$idx],$i)" />
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="my:PI($elem)" />
</xsl:function>
<xsl:function name="my:power" as="xs:integer">
<xsl:param name="n" as="xs:integer" />
<xsl:param name="m" as="xs:integer" />
<xsl:choose>
<xsl:when test="$m=0">
<xsl:value-of select="1" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$n*my:power($n,$m - 1)" />
</xsl:otherwise>
</xsl:choose>
</xsl:function>
<xsl:function name="my:primes" as="xs:integer*">
<xsl:param name="n" as="xs:integer" />
<xsl:sequence select="my:primes_($n,2,())" />
</xsl:function>
<xsl:function name="my:primes_" as="xs:integer*">
<xsl:param name="n" as="xs:integer" />
<xsl:param name="m" as="xs:integer" />
<xsl:param name="r" as="xs:integer*" />
<xsl:choose>
<xsl:when test="$n=0">
<xsl:sequence select="$r" />
</xsl:when>
<xsl:otherwise>
<xsl:variable name="is_prime" as="xs:boolean"
select="fn:empty($r[($m mod .)=0])" />
<xsl:choose>
<xsl:when test="$is_prime">
<xsl:variable name="r_" as="xs:integer*">
<xsl:sequence select="$r" />
<xsl:sequence select="$m" />
</xsl:variable>
<xsl:sequence select="my:primes_($n - 1,$m + 1, $r_)" />
</xsl:when>
<xsl:otherwise>
<xsl:sequence select="my:primes_($n,$m + 1, $r)" />
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:function>
<xsl:function name="my:PI" as="xs:integer">
<xsl:param name="seq" as="xs:integer*" />
<xsl:choose>
<xsl:when test="fn:empty($seq)" >
<xsl:value-of select="0" />
</xsl:when>
<xsl:when test="fn:count($seq)=1">
<xsl:value-of select="$seq[1]" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$seq[1] * my:PI(fn:subsequence($seq,2))" />
</xsl:otherwise>
</xsl:choose>
</xsl:function>
</xsl:stylesheet>
|

nobsun
#4420()
Rating2/2=1.00
see: ゲーデル数
[ reply ]