エレファント・ビジュアライザー調査記録

ビジュアルプログラミングで数式の変形を表すことを考えていくブロクです。

2022-01-01から1年間の記事一覧

ラムダ計算と無限ラムダ多項式(8)

Calc クラスの IterateGenerator と RepeatServer です。 public static Func<string> IterateGenerator = () => new ExpBlock { Exp.Define("take", new NameList{"count", "gen"}, Exp.If( Exp.Func("==", Exp.Name("count"), Exp.Number(0)), Exp.Nil(), new ExpB</string>…

ラムダ計算と無限ラムダ多項式(7)

Calc クラスの RepeatGenerator と、それに必要な関数の文字列版です。 private static Func<Exp, Exp> GetNextDecimalDigitAndNumbers = (Exp numbers) => Exp.From("{" + "let (number, square_difference, scale) = numbers;" + "def maxdd (dd) =" + "if dd >= 0 t</exp,>…

ラムダ計算と無限ラムダ多項式(6)

Calc クラスの RepeatGenerator と、それに必要な関数を書き直しました。 private static Func<Exp, Exp> GetNextDecimalDigitAndNumbers = (Exp numbers) => { Exp n0 = Exp.Number(0); Exp n1 = Exp.Number(1); Exp n2 = Exp.Number(2); Exp n9 = Exp.Number(9); Exp</exp,>…

ラムダ計算と無限ラムダ多項式(5)

Calc クラスの RepeatGenerator をラムダ式のようなもので書き直したものの動作するバージョンです。 public static Func<string> RepeatGenerator = () => new ExpBlock { Exp.Let("generator", Exp.From("GenerateDecimal()")), Exp.Define("GetNextDecimalDigit",</string>…

ラムダ計算と無限ラムダ多項式(4)

C# で以下のような式を書くことができるようにします。 Exp.Number ( 数値 ) 数値を表します。「数値」は整数、文字列、または BigNum です。 Exp.Bool ( 真理値 ) 真理値を表します。 Exp.String ( 文字列 ) 文字列を表します。 Exp.Name ( 文字列 ) 変数名…

ラムダ計算と無限ラムダ多項式(3)

以下は Calc クラスの RepeatGenerator をラムダ式のようなもので書き直したもののイメージです。まだ動作するものではありません。C# で書いてもエラーにはならない形式になっています。単純な式のときは文字列で書けるようになっています。 public static …

ラムダ計算と無限ラムダ多項式(2)

LISP と LOGO の本がいくつか見つかりましたが、LISP の本は古いのでクロージャーが使えるのかどうかよくわかりません。クロージャーの変数を変更できないようにしたらどうなるかを調べることが目的なので、この意味では LOGO を使って調べた方が良いかもし…

ラムダ計算と無限ラムダ多項式(1)

「関数プログラミングと無限論理多項式」でLisp の簡単な処理系を作ってクロージャーの調査をしようとしたのですが、Lisp で動作確認をするのはたいへんそうなので、まずは C# の例から徐々に Lisp 風に移行していきたいと思います。ラムダ式で書くと Lisp …

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

C# の例(16) (タプル(2)) UnfoldL もタプルを使って書き直します。 private static (Func<bool> next, Func<U> getCurrent, Action<U> setCurrent) UnfoldL<T, U>(Func<T, (U, T)> next, T init) { T src = init; U dst = default(U); bool next_() { (dst, src) = next(src); return src </t,></t,></u></u></bool>…

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

C# の例(15) (タプル) Lisp への移植用にタプルを使って書き直しました。 internal class Calc { private const int count = 21; private static IEnumerable<int> Take(int count, (Func<bool> next, Func<int> getCurrent, Action<int> setCurrent) iter) { for (int i = 0; i <</int></int></bool></int>…

中間報告(9)

「エレファントな群とリー代数」の項目では、項書き換え系の「項」を多項式のように見たものを「一般マグマの多項式」と呼びましたが、論理プログラミングの「論理式の項」に対する同様のものを「論理多項式」を呼ぶことにします。これは Wikipedia の「wiki…

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

JavaScript の例(8) (TypeScript) TypeScript 版の Apply は必要なかったのでまた書き直します。この例の場合は、このようにクロージャーの代わりに文字列を引数とすることができます。一般的にこのようなことができるかどうかはまだ調査しなければなりませ…

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

JavaScript の例(7) (TypeScript) TypeScript 版の他のクラスも同様に書き直します。 class Numbers { number: LongDecimal; square_difference: LongDecimal; scale: number; constructor(number: LongDecimal, square_difference: LongDecimal, scale: num…

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

JavaScript の例(6) (TypeScript) TypeScript 版の LongDecimal クラスを引数にクロージャーを使わないように書き直します。TypeScript ではクロージャーを引数にすることができるのですが、これができないようなプログラミング言語に移植するために書き直し…

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

C# の例(14) 続いて「仮想サーバー」の NumbersServer クラスについても考えていきます。「仮想サーバー」が状態を持たないとします。このクラスにも時刻 time を導入して、時刻 time ごとに「仮想サーバー」が存在すると考えます。「仮想ブラウザー」では N…

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

C# の例(13) 続いて「仮想サーバー」の NumbersGenerator クラスについても考えていきます。時刻 time を導入して、時刻 time ごとに「仮想サーバー」が存在すると考えます。そして求める桁と時刻 time が対応していると考えます。ある桁を計算するときは、…

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

C# の例(12) 続いて LongDecimal クラスについても考えていきます。変数とコンストラクターは以下のようにします。変更不可能なリスト ImmutableList を使います。Select の引数にラムダ式を使っていますが、これは型のチェックを避けるためなので使っても良…

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

C# の例(11) 変数が変更不可能なプログラミング言語への移植のために変数を変更しないように書き換えていきます。NumbersGenerator クラスと NumbersServer クラスは「仮想サーバー」であるため変更するのは難しいのでそのほかのところから変更していきます…

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

C# の例(10) Numbers クラスを変更しないようにします。 internal class Numbers { private readonly LongDecimal number; private readonly LongDecimal square_difference; private readonly int scale; public Numbers(LongDecimal number, LongDecimal s…

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

Go の例(5) Go の例についても同様に修正します。UnfoldL 関数を作成します。 func UnfoldL(f func(*Numbers) (int, *Numbers), init *Numbers) *IteratorSimpleImpl_int { src := init dst := 0 next := func() bool { dst, src = f(src) return true } get…

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

F# の例(5) 前回の F# 版では UnfoldL 関数を作成しましたが、Seq.unfold 関数を使えば良かったようです。NextDigitAndNumbers は以下のように変更します。値に Some がついています。 let NextDigitAndNumbers (numbers: Numbers): (int * Numbers) option …

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

Python の例(4) Python 版も同様に修正します。Numbers クラスから CurrentDigit プロパティと current_digit を削除し、コピーするメソッドを追加します。 def Copy(self): return Numbers(self.number, self.square_difference, self.scale) UnfoldL 関数…

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

F# の例(4) F# 版も同様に修正します。Numbers クラスから CurrentDigit プロパティと current_digit を削除し、コピーするメソッドを追加します。 member this.Copy(): Numbers = new Numbers(number, square_difference, scale) UnfoldL 関数を作成します…

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

JavaScript の例(5) (TypeScript) TypeScript 版も同様に修正します。Numbers クラスから CurrentDigit プロパティと current_digit を削除し、コピーするメソッドを追加します。 Copy(): Numbers { return new Numbers(this.number, this.square_difference…

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

C# の例(9) Go の例で Numbers 構造体をコピーするようにしましたが、Numbers 構造体の中に返却するための数が含まれているのは気持ち悪いので、これを構造体に含めないようにします。まず C# の例で考えます。Numbers クラスから CurrentDigit プロパティと…

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

Go の例(4) (ゴルーチン) クロージャーを使っている部分をゴルーチンで置き換えたものを考えます。イテレーターをゴルーチンで実装した IteratorChannelImpl_int 構造体と IteratorChannelIOImpl_Numbers 構造体を作成します。 type IteratorChannelImpl_int…

現状報告(5)

Windows 10 のノート PC を購入しました。

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

C# の例(9) Channel を使ったバージョンは以下のようになります。NumbersGenerator クラスの GenerateDecimal メソッドは以下のようになります。 public IteratorChannelImpl<int> GenerateDecimal() { bool SetToChannel(Channel<int> ch, int n) { async Task<bool> SetToC</bool></int></int>…

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

C# の例(8) Channel を使ったイテレーターのクラス IteratorChannelImpl を作成しました。「ConfigureAwait(false)」というのは「これがないと await の前後が同じスレッドで実行されるので Result を取得することができない」という仕様らしいです。意味が…

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

C# の例(7) C# で Channel というものを使うことができるので Go への移植の参考になるかもしれないので調べてみます。C#によるマルチコアのための非同期/並列処理プログラミング を少し参考にしていますが、けっこう古い本なので Channel や IAsyncEnumerab…