カリー=ハワード同型対応単語


ニコニコ動画でカリー=ハワード同型…の動画を見に行く
カリーハワードドウケイタイオウ
2.9千文字の記事
  • 2
  • 0pt
掲示板へ

カリー=ハワード同型対応(Curry-Howard correspondence / Curry-Howard isomorphism)とは、プログラム数学の定理が対応するという理論である。

概要

カリー=ハワード同型対応とは、入力(引数)や出力(戻り値)の「」が命題に、プログラム命題明に対応するという理論である。定理証明によるプログラム検証理論的根拠にあたる。

カリーは純関数型言語Haskellカリー化にその名を残すHaskell B. Curry、ハワードHaskell B. Curryの提唱した理論を発展させて本理論の形にした論理学William Alvin Howardの名前に由来する。

どういうことなの?

上記理論をそのまま現在流通しているプログラムにあてはめるなら、整数引数にとって整数を返す関数は、整数というのが前提と結論の命題関数が前提から結論すなわち「(整数)ならば(整数)である」の明ということになる。それなんてトートロジー?

実は上記は必要なものがかなりいっぱい省略されている。

型について

まず「」という言葉だが、ここでいうというのは通常の静的型付けプログラミングでいうよりもかなり広い概念である。通常「」というと整数文字や、オブジェクトなどのようにを組み合わせたデータを考えると思うが、ここでいうにはもっと細かい条件をつけることができる。

単純な例からいくと、自然数のように「1以上の整数のようなを設定することができる。もう少し複雑な例を挙げると「昇順に並べられた整数リストというも可である。さらには出力を意識したとして、「入力の総和に等しい整数というものすら許される。

また、その処理系で扱える整数が符号付き32ビットまでなどの制限を受けている場合は「整数」も「-231 〜 231 - 1 の整数のようになる。

主語について

命題であると述べたが、上記で(整数)と書いた部分は主語がないので命題とは言い難い。命題とするには(入力が整数)とか(出力が整数)のように主語を補う必要がある。少なくとも出力のについては前述のようにに関する追加条件が付加されて(出力が「特定の条件を満たす」整数)のようになる。

述語について

もう少し命題明の関係をはっきりさせよう。

(入力が整数)ならば(出力が「特定の条件を満たす」整数)ということをもう少し命題らしくしたら、

(入力が整数)ならば「その全ての」入力について、(出力が「特定の条件を満たす」整数)となる出力方法が「少なくとも一つ存在する」。

この出力方法が存在することは、(入力が整数)ならば(出力が「特定の条件を満たす」整数)であるプログラムを実際に示す(実例を提示する)ことによって明される。ということで、プログラミング定理証明がつながるのである。

リストソートする関数だと、「入力がリストならば、出力がソートされたリストになる関数が存在する」ことをソートアルゴリズムの存在を示すことで明する形になるが、既出exitなのでここでは整数絶対値をとる関数について考えてみることにする。

整数絶対値については |a|2 = a2 かつ |a| ≥ 0 を定義として利用することにする。

前提となる命題()は「入力 x が整数である」、結論となるべき命題()は「出力 |a| は |a|2 = a2 かつ |a| ≥ 0 を満たす」となる。明すべきことは、「入力 x が整数なら、すべての x について、 abs(x)2 = x2 かつ abs(x) ≥ 0 となる関数abs(x)が少なくとも一つ存在する」である(これも一つの命題である点については考察3で触れる)。

証明1

x ≥ 0 のとき abs(x) = x, x < 0 のとき abs(x) = -x と定義すれば、定義した abs(x)はabs(x)2 = x2 かつ abs(x) ≥ 0 を満たす。よって関数abs(x)が少なくとも一つ存在することが明された。

証明2

abs(x) = x2定義すれば、定義した abs(x)はabs(x)2 = x2 かつ abs(x) ≥ 0 を満たす。よって関数abs(x)が少なくとも一つ存在することが明された。

考察1

明1に対応するプログラムabs(x) = if (x ≥ 0) x else if (x < 0) -x のようなコードになり、明2に対応するプログラムabs(x) = sqrt(x^2) のようなコードに対応する。(特定の言語に偏らないために文法はわざといい加減に書いています)

考察2

ところで、abs(x)が整数であることを明していないことにお気づきだろうか。明されていない以上、abs(x)のはあくまでも「整数xの絶対値であって整数ではない。あとでabs(x)が整数であることを利用したプログラムを書こうというのであれば、abs(x)が整数であることも明に加えなければならない。

逆に考えると、その後のプログラミングで必要にならない性質は(仮に戻り値にその性質が備わっていたとしても)明する必要はないともいえる。

考察3

「入力 x が整数なら、すべての x について、 abs(x)2 = x2 かつ abs(x) ≥ 0 となる関数abs(x)が少なくとも一つ存在する」も一つの命題である点についてはすでに述べた。命題は対応するがあるということになるが、このはいわゆる関数であり、これを引数とすると高階関数によるプログラムが現れる。

考察4

の条件を考えることが、ユニットテスト契約プログラミングでいう事前条件や事後条件を考えることに対応しているといえなくもない。

考察5

静的型付けによる安全の理論は、考え方によってはカリー=ハワード同型対応の不全な実現というように考えることができるのかもしれない。

そういった見地にたてば、いわゆる「内部で変化する「状態」を持つ」ということは、Aというが存在した場合、カリー=ハワード同型対応では状態BにおけるA(B)と状態CにおけるA(C)というものは別のであるべきなのに、言語仕様上は同じA型となり、チェックすり抜け安全を破壊してしまうのでよくないというように考えることができるといえる。

限界

命題偽を決定できるものであるが、実際には偽を決定できない命題も存在する。そういった命題は本理論定理証明の対外となる。あるいは、新たな公理を持ち込むことで明可になるかもしれない。

また、考察1でもすでに述べたが、明は少なくとも一つ存在していることを示すだけで、それが二で最適化された方法であることを示しているわけではない。たとえばソートだと、アルゴリズムが変われば明方法が異なるが、いずれでも定理証明が成立する(ボゴソートは前述の偽の決定可性問題に触れそうな気もするが)。「最適の方法であること」を命題に織り込んで明するという考え方もあると思われるが、まだそのレベルまでは到達していないのが現状であると思われる。

関連項目

【スポンサーリンク】

  • 2
  • 0pt
記事編集 編集履歴を閲覧

ニコニ広告で宣伝された記事

ニコニ広告 (単) 記事と一緒に動画もおすすめ!
提供: 宮下智子
もっと見る

この記事の掲示板に最近描かれたお絵カキコ

お絵カキコがありません

この記事の掲示板に最近投稿されたピコカキコ

ピコカキコがありません

カリー=ハワード同型対応

1 ななしのよっしん
2020/07/31(金) 03:12:49 ID: zxHNKN3jKS
プログラム言語を対関数を射とした圏を成すという説やね
圏になれば関手により大概の「素性のいい」数学的操作と対応付けられるし素性のいい圏はだいたい集合の圏になるので扱いやすい
仕様のせいでそうはならんやろとなることがあるみたいだけど
👍
高評価
0
👎
低評価
0
2 ななしのよっしん
2022/11/16(水) 22:14:11 ID: N/RJ6dE1cc
ニコニコ大百科カリーワード対応があるとは。
このあたりの類似性からどこかの天才が何かをいて、プログラミング概念自体を一新するようなパラダイムシフトが何か起きないかと10年以上前から待っているのだけど何も起きない。
👍
高評価
1
👎
低評価
0