非専門的シンギュラリティー研究所

無限に動き続けるシステムを表す方法を AI なども使って考えていきます。

自由モノイドのイテレーター(35)

自由モノイドプログラミング言語の作成(MonIter バージョン1.2 仕様(19))

MonIter コードから Python コードに変換

Python コードについては「自由モノイドのイテレーター(9) - エレファント・ビジュアライザー調査記録」を参照してください。

引数で渡すバージョン

MonIter のコード

    def fib(x, y) = x & fib(y, x + y);
    fib(0, 1)

Python のコードに変換するには以下のようにします。

        /// <summary>
        /// フィボナッチ数列 Python コード出力(引数あり)
        /// </summary>
        /// <returns>フィボナッチ数列の Python コード</returns>
        private string InfiniteFibpnacciPrmsPythonCode()
        {
            string src = "def fib(x, y) = x & fib(y, x + y); fib(0, 1)";
            Prog prog = MonParser.ParseProg(src);
            Func<string, string> perf = x => $"print(take({GetCount()}, {x}))";
            return prog.GeneratePython(true, perf);
        }

結果は以下のようになります。

def fib(x, y):
    yield x
    yield from fib(y, x + y)
print(take(20, fib(0, 1)))
Zip を使うバージョン

MonIter のコード

    def fib(x, y) = x & y & $zipsum(fib(x, y), $tail(fib(x, y)));
    fib(0, 1)

Python のコードに変換するには以下のようにします。

        /// <summary>
        /// フィボナッチ数列 Python コード出力(Zip)
        /// </summary>
        /// <returns>フィボナッチ数列の Python コード</returns>
        private string InfiniteFibpnacciZipPythonCode()
        {
            string src = "def fib(x, y) = x & y & $zipsum(fib(x, y), $tail(fib(x, y))); fib(0, 1)";
            Prog prog = MonParser.ParseProg(src);
            Func<string, string> perf = x => $"print(take({GetCount()}, {x}))";
            return prog.GeneratePython(true, perf);
        }

結果は以下のようになります。

def fib(x, y):
    yield x
    yield y
    yield from zipsum(fib(x, y), tail(fib(x, y)))
print(take(20, fib(0, 1)))