だから私は頭をカリーハワードに回そうとしている。(私は何度か試してみましたが、ゲル化していない/抽象的すぎるとは思われません)。具体的な問題に取り組むために、私はウィキペディアからリンクされたいくつかのHaskellチュートリアル、特にTim Newshamのチュートリアルに取り組んでいます。Newshamがチュートリアルを投稿したときにも役立つディスカッションがあります。
(しかし、私はNewshamとPiponiのdata
ラッパーを無視し、基礎となる型について話します。)ヒルベルトの公理スキーム(S、Kコンビネーターとして表されます)があります。タイプとしての命題があります。関数矢印としての意味; および関数アプリケーションとしてのModus Ponens:
axK :: p -> q -> p
axK = const
axS :: (p -> q -> r) -> (p -> q) -> p -> r
axS f g x = f x (g x)
modPons = ($); infixl 0 `modPons` -- infix Left, cp ($) is Right
次に、アイデンティティ法を導出できます。
ident = axS `modPons` axK `modPons` axK -- (S K K)
-- ident :: p -> p -- inferred
これらの型を単に命題に対応する裸の型変数として持つことは、想像を絶するようです。より多くの型システムを使用して、命題を実際に構築できますか?考えている:
data IsNat n = IsNat !n -- [Note **]
data Z = Z
axNatZ :: IsNat Z
axNatZ = IsNat Z
data S n = S !n
axNatS :: IsNat n -> IsNat (S n)
axNatS (IsNat n) = IsNat (S n)
twoIsNat = axNatS `modPons` (axNatS `modPons` axNatZ)
-- ===> IsNat (S (S Z))
[注意**] _ | _の導入を回避するために、ディスカッションスレッドに従って厳密なコンストラクターを使用しています。
どこ:
IsNat
述語です:用語から命題を作る。n
変数です。S
変数から項を作成する関数です。Z
定数(ニラディック関数)です。
だから私は(一次)述語論理(?)を埋め込んだようです
私のタイプはあまり衛生的ではないことに感謝します。typevar-as-propositionとtypevar-as-termを簡単に組み合わせることができました。多分私はKind
それらを分離するためにシステムを使うべきです。OTOH私の公理は、どんな結論に至るにも見事に間違っているに違いありません。
私は表現していません:
- 普遍的な量指定子:これは自由な変数に対して暗黙的です。
- 存在量:実際には定数はスコーレム化された存在量として機能します。
- 用語の同等性:含意の中で繰り返しtypevarを使用しました。
- 関係:これはうまくいくようです、またはそれは困惑ですか?...
data PlusNat n m l = PlusNat !n !m !l
axPlusNatZ :: IsNat m -> PlusNat Z m m
axPlusNatZ (IsNat m) = PlusNat Z m m
axPlusNatS :: PlusNat n m l -> PlusNat (S n) m (S l)
axPlusNatS (PlusNat n m l) = PlusNat (S n) m (S l)
plus123 = axPlusNatS `modPons`
(axPlusNatZ `modPons`
(axNatS `modPons` (axNatS `modPons` axNatZ)) )
-- ===> PlusNat (S Z) (S (S Z)) (S (S (S Z)))
公理の記述は簡単で、ワドラーの定理は無料です。。証明を書くのは大変です。(私はドロップしてmodPons
関数アプリケーションを使用します。)
これは実際にロジックを実現していますか。それともクレイジーなものですか?脳に害を及ぼす前に止めるべきですか?
Curry-HowardでFOPLを表現するには、依存型が必要になるはずです。しかし、私はそうしていないようです(?)
IsNat
は単なる型であるため、命題でなければなりません。OK、同じようIsNat n
に単なるタイプなので、命題でなければなりません。n
論理接続詞への引数として、提案領域/出現に逃げさせないように、「名誉」にならなければなりません(そのため、私はタイプの衛生について話しました)。NatsにChurchエンコーディングを使用した方が幸せですか?型レベルのコンストラクタでλ-calcを拡張しているだけだと思います。用語レベルのHaskellと同じです(?)
n
ある命題:私が住んでいています"と言っています。これはCHの下でtypevarが言っていることと同じです。IsNat n
が言っている/目撃している:さらに、の住民はn
特定の「種類」、別名「ソート」の論理です。次に、単純に型指定されたλ-calc(?)を超えます
IsNat
、用語からの命題ではなく、命題からの命題です。