エレファント・コンピューティング調査報告

極限に関する順序を論理プログラミングの手法を使って指定することを目指すブロクです。

関数プログラミングと無限論理多項式(28)

Python の例(4)

Python 版も同様に修正します。

Numbers クラスから CurrentDigit プロパティと current_digit を削除し、コピーするメソッドを追加します。

    def Copy(self):
        return Numbers(self.number, self.square_difference, self.scale)

UnfoldL 関数を作成します。Iterate を UnfoldL で置き換えます。

def UnfoldL(next, init):
    src = init
    while True:
        dd, src = next(src)
        yield dd

NextNumbers を以下の NextDigitAndNumbers で置き換えます。

def NextDigitAndNumbers(numbers):
    numbers_copy = numbers.Copy()
    dd = numbers_copy.GetNextDecimalDigit()
    return dd, numbers_copy

Calc クラスの IterateServer メソッドは以下のように UnfoldL を使うように変更します。GetNextDecimalDigit を1回呼び出しているところは削除します。

    def IterateServer(self):
        number = LongDecimal([])
        square_difference = LongDecimal([3])
        init_numbers = Numbers(number, square_difference, 0)
        dec = list(Take(self.count, UnfoldL(NextDigitAndNumbers, init_numbers)))
        return LongDecimal(dec).Print()