ブール代数は、(たとえば)この方法で型なしラムダ計算で表現できます。
true = \t. \f. t;
false = \t. \f. t;
not = \x. x false true;
and = \x. \y. x y false;
or = \x. \y. x true y;
また、ブール代数は、この方法でSystem Fでエンコードできます。
CBool = All X.X -> X -> X;
true = \X. \t:X. \f:X. t;
false = \X. \t:X. \f:X. f;
not = \x:CBool. x [CBool] false true;
and = \x:CBool. \y:CBool. x [CBool] y false;
or = \x:CBool. \y:CBool. x [CBool] true y;
単純に型指定されたラムダ計算でブール代数を表現する方法はありますか?答えはノーだと思います。(たとえば、Predecessorとリストは単純に型付けされたラムダ計算で表現できません。)答えが実際にNOである場合、単純な型付けされたラムダ計算でブール値をエンコードすることはなぜ不可能なのですか?
更新:基本型があると仮定します。
更新:説明付きの否定的な答えがここに見つかりました(コメント「製品と無限に多くの基本型を持つ単純に型付けされたラムダ計算がブール値を持たないことを示す証明スケッチです。」)これは私が探していたものです。
2
Haskellに定義を入力して、さまざまな式に型を指定するとどうなるかを確認してください。コードがポリモーフィズムに大きく依存していることがわかります。
—
デイブクラーク
これらの用語を理解するための複数の合理的な方法があるので、つまらないことに申し訳ありませんが、これまたはその微積分の表現性についての質問は、「表現された」、「エンコードされた」および「表現された」によってあなたが何を意味するのかを明確に理解することによってのみ意味がなくなります。さらに、ベースタイプの存在を規定しているため、ベースタイプとは何か、またそれらがどのコンストラクタ/デストラクタに付属するかについて明確にする必要があります。
—
マーティンバーガー
すまなかったので申し訳ありません。答えはここに発見された:math.andrej.com/2009/03/21/...
—
イリヤKlyuchnikov
このような気の利いたブログを運営することで、ある程度の信用を得るべきだと思う:
—
アンドレバウアー
ブログで使用されるブール型の定義は、ここよりも強力です。実際には、ジェレミーの応答を示し、少なくとも1つの塩基型と単に型付きラムダ計算は、(それを呼び出す)でき OPの意味でブール代数を発現する:定義B = O → O → O、T R U E = λ X :O 。λ Y :O 。X、F 、L 、S 、E =、 N 、O 、T = λ A :B 。λ X :O 。λ Y :O 。Y 、X、 n個のD = λ :B 。λ B :B 。λ X :O 。λ Y :O 。a (b x y )y、 o r。
—
エミールイェジャベクはモニカをサポートします