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

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

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

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

MonIter コードの実行

引数で渡すバージョン

MonIter のコード(スペース、改行などは無視されます)

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

を実行するには以下のようにします。Take は自由モノイドの先頭から指定した数の項を取得します。GetCount は個数をテキストボックスから取得します。ここでは 20 となっています。

        /// <summary>
        /// フィボナッチ数列 MonIter 版(引数あり)
        /// </summary>
        /// <returns>フィボナッチ数列の文字列</returns>
        private string InfiniteFibpnacciPrms()
        {
            string src = "def fib(x, y) = x & fib(y, x + y); fib(0, 1)";
            Prog prog = MonParser.ParseProg(src);
            return string.Join(", ", prog.Eval().Take(GetCount()));
        }

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

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181
Zip を使うバージョン

MonIter のコード

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

を実行するには以下のようにします。

        /// <summary>
        /// フィボナッチ数列 MonIter 版(Zip)
        /// </summary>
        /// <returns>フィボナッチ数列の文字列</returns>
        private string InfiniteFibpnacciZip()
        {
            string src = "def fib(x, y) = x & y & $zipsum(fib(x, y), $tail(fib(x, y))); fib(0, 1)";
            Prog prog = MonParser.ParseProg(src);
            return string.Join(", ", prog.Eval().Take(GetCount()));
        }

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

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181