単純に型付けされた組み合わせロジック?


8

型付けされていないラムダ計算と単純に型付けされたラムダ計算(たとえば、ベンジャミンピアースの本のタイプとプログラミング言語で説明されている)があるので、単純に型付けされた組み合わせロジックはありますか?

たとえば、コンビネータS、K、およびIの自然な型は、

S : (a -> b -> c) -> (a -> b) -> a -> c
K : a -> b -> a
I : a -> a

ここで、a、b、およびcは、タイプTのいくつかのセットにわたるタイプ変数です。ここで、おそらく単一の基本タイプBoolから始めることができます。タイプTのセットは、3つのパターンを使用して形成できるタイプと一緒にBoolになります。

(a -> b -> c) -> (a -> b) -> a -> c
a -> b -> a
a -> a

ここで、Tのa、b、c。

言語には2つの新しい定数があります。

T : Bool
F : Bool

したがって、この言語は括弧S、K、I、T、Fと記号で構成されています。これには、1つの基本タイプBoolと、S、K、およびIコンビネーターパターンから作成できる「関数タイプ」があります。

このシステムを機能させることはできますか?たとえば、S、K、I、T、Fのみから形成できる、よく型付けされたif-then-else構造はありますか?


「型付き組み合わせ代数」の検索。
Andrej Bauer

興味深いことに、型付けされた組み合わせロジックは、ヒルベルトスタイルの論理公理との類似性により、不適切な名前の「カレーハワード」の対応に最初に気付きました。en.wikipedia.org
wiki

回答:


11

クイックノート、私はそのように、このシステムでは、パラメトリック多型(システムF)を許可SKおよびIすべての種類を超える作業することができます。

パターンマッチングがないと、if何をしたとしても書き込めないことに注意してください。ブール演算は一切行いません。区別するための方法はありませんTrueからはFalse。代わりに試してください

true : a -> a -> a
true = \t -> \f -> t

false : a -> a -> a
false = \t -> \f -> f

Bool = a -> a -> aわかりやすくしましょう。

 if : Bool -> a -> a -> a
 if = \bool -> \a -> \b -> bool a b

これで、ラムダ計算式をコンビネーターにコンパイルするだけの問題になりました。

if : Bool -> a -> a -> a -- Or just Bool -> Bool
if    = I

true : a -> a -> a
true  = K

false : a -> a -> a
false = K I
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.