関数コードが正しいことを証明するための一般的な正式なテクニックは何ですか?


10

論文の一部として作成しているHaskellプログラムの一部の証明を提供したいと思います。しかし、これまでのところ、良い参考資料を見つけることができませんでした。

グラハムハットンの入門書 『HaskellでのプログラミングGoogleブックス)』は、Haskellの学習中に読んだものですが、次のようなプログラムについて推論するためのいくつかのテクニックに触れています。

  • 等式推論
  • 重複しないパターンを使用する
  • リストの誘導

第13章で説明しますが、あまり詳細ではありません。

Haskell、またはその他の機能的なコードの正式な証明手法の詳細を提供する推奨できる本や記事はありますか?

回答:


5

関数型プログラミングで結果を証明するためのデファクトメソッドの1つは、Richard Birdのグループによるものです。

特に、方程式の推論とリストの帰納についての詳細なアプローチ、または少なくともより包括的なアプローチを求めます。これは、「構成的関数型プログラミングの講義」で提供されています。

より一般的には、Bird and de Moorによる「Algebra of Programming」というテキストは、最適化や動的プログラミング問題などの関数型アルゴリズムの正確さも扱っています。


この問題に関する他の有用なリソースを見つけた場合は、それらについて言及してください。おそらく、この投稿をwikiに変えることができます。


ありがとうございました!確かに、もし私がもっと多くのリソースを見つけたら、私はそれらを私の投稿に追加することを確認します。
FK82

6

あなたはから始めることができます

トピックには、ロジックの基本概念、コンピューター支援定理証明、Coq証明アシスタント、関数型プログラミング、操作セマンティクス、Hoareロジック、静的型システムが含まれます。博覧会は、上級の大学生から博士課程の学生や研究者まで、幅広い読者を対象としています。ある程度の数学的成熟度が役立つであろうが、論理またはプログラミング言語の特定の背景は想定されていません。

プログラミング言語の理論の部分をスキップ(またはスキップ)して、序文からIndPrinciplesまでの正式な証明の処理方法のみを学ぶことができます。この本は本当によく書かれていて、輝かしいです。

次に、続行することができます

このボリュームでは、ソートアルゴリズム、バイナリサーチツリー、バランスバイナリサーチツリー、および優先度キューを指定および検証する方法(正しいことを証明する方法)を学びます。この本を使用する前に、標準の学部アルゴリズムの教科書で利​​用できるこれらのアルゴリズムとデータ構造についてある程度理解しておく必要があります。Software Foundations Volume 1(Logic Foundations)のすべての内容を理解する必要があります

警告のメモ:VFAはまだベータリリースです!


(2番目のリンクは間違った場所を指しています。)また、Agdaには 検証済み関数型プログラミングがあります。これは正式にはプログラミング言語であるAgdaを使用していますが、Unicodeを使用しているため、数学表記に近いものです。
Musa Al-hassy

訂正、ありがとう。はい、VFPiAを読みましたが、私の好みではありません。
アントントルノフ2016

回答ありがとうございます!誤解があると思います。アルゴリズムを証明するための機能的手法(証明アシスタントなど)を探しているのではなく、関数コードを証明するための手法(たとえば、特定のアルゴリズムの機能的な実装が正しいことを証明するための手法)を探しています。望ましい答え。私がそれを逃し、あなたが引用した本もこの側面をカバーしている場合、関連する章を追加していただけませんか?
FK82 2016

@ FK82 リストのTheorem app_assoc : ∀ l1 l2 l3 : natlist, (l1 ++ l2) ++ l3 = l1 ++ (l2 ++ l3)からの引用です。この例は、あなたが興味を持っているもののように見えますか?それらはCoqでの関数型プログラミングから始まりますが、関数型プログラムのプロパティについての推論に移ります。序文からIndPrinciplesまでの章はそれらの両方をカバーしており、プログラミングと推論はそこで絡み合っていると思います。
アントントルノフ2016

1
@ FK82(1)私はこのコメントに完全に同意します。(2)R. Bird著の本「Haskellで機能的に考える」(2015)をご覧になることをお勧めします。この本には、Haskellについての推論の例がたくさんあります。(3)また、同じ著者による「Pearls of Functional Algorithm Design」(2010)も参考になるかもしれません。
アントントルノフ2016

5

純粋な関数型言語について証明するための証明手法と例の優れた情報源は、通常は仕様言語の一部として含まれている証明アシスタントであることがわかりますです。

特定の証明アシスタント、つまりCoqでのこの種の推論の詳細な紹介については、「依存型のある認定プログラミング」のような本を参照することをお勧めします。


ありがとう!私は実際にHaskellのテクニックを特に探しています。私の投稿はすべての機能コードを含むように編集されましたが、それは私の意図をはるかに超えています。
FK82 2016

1
Haskellを具体的に検証するように設計されたシステムについては知りませんが、1)Coq(およびAgda)の機能コアは本質的にHaskellの機能コアと区別できません(機能全体に対する制限を除く)および2)検証されたプログラムCoqとAgdaはHaskell に抽出できます(Haskellへの抽出は、CoqがよりOcaml中心であるAgdaでサポートされていると思いますが)
cody

知っておきたい!ただし、これは私のプログラム(または関連部分)をCoqまたはAgdaで書き換えることを意味します。私の場合、それは合理的ではないと思います。
FK82 2016

HaskellをIsabelle変換する、Isabelleを使用して同等性直接証明しようとする非常に実験的な「フロントエンド」がいくつかありますが、私はそれらの成熟度にあまり多くの在庫を持ちません。コードを書き直すと、最終的には作業が少なくなると思います。
cody

4

プログラムロジックを使用することをお勧めします。彼らはタイピングシステムよりもはるかに効果的に対処します。

関数型言語のプログラムロジックは多数あります。これはエフェクトで面白くなります。たとえば、ローカル状態の高階関数の論理推論を参照してください。

ArthurCharguéraudの作品は、プログラムロジックアプローチと証明アシスタントを統合しています。たとえば、この概要ページをご覧ください

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