web-dev-qa-db-ja.com

Haskell関数は、正当性のプロパティで証明/モデルチェック/検証できますか?

以下のアイデアから続けます: 証明可能な実世界の言語はありますか?

私はあなたのことを知りませんが、保証できないコードを書くことにうんざりしています

上記の質問をして驚異的な応答を得た後(ありがとうございます!) Haskell への証明可能な実用的なアプローチの検索を絞り込むことにしました。 Haskellを選択したのは、それが実際に役立つためです( 多数webframeworks が記述されているため、これは良いベンチマークのようです)[〜#〜]と[〜#〜]私はそれが十分に厳しいと思います 機能的に 、証明可能であるか、少なくとも許可する不変条件のテスト。

これが私が欲しいものです(そして見つけることができませんでした)

私はHaskell関数を見て、追加して、psudocodeで記述できるフレームワークが欲しい:

add(a, b):
    return a + b

-そして、特定の不変条件がすべての実行状態を保持しているかどうかを確認します。正式な証明を希望しますが、モデルチェッカーのようなもので解決します。
この例では、不変量はabの値が与えられた場合、戻り値は常に合計a + b

これは簡単な例ですが、このようなフレームワークが存在するのは不可能ではないと思います。テストできる関数の複雑さには確かに上限があります(関数への10文字列の入力には確かに長い時間がかかります!)。メソッド。 ZまたはBを使用することを想像してください。変数/セットを定義するとき、変数に可能な最小範囲を与えることを確認してください。 INTが100を超えることがない場合は、そのように初期化してください。これらのようなテクニックと適切な問題分解は、Haskellのような純粋関数型言語の十分なチェックを可能にするべきだと思います。

私は、まだ、正式な方法やHaskellの経験はあまりありません。私のアイデアが健全なものであるかどうか、またはhaskellが適していないと思いますか?別の言語を提案する場合は、「has-a-web-framework」テストに合格していることを確認し、元の question :-)を読んでください。

70
0atman

おそらくあなたが求めているものに最も近いものは Haskabelle 、証明アシスタントに付属するツール Isabelle で、HaskellファイルをIsabelle理論に変換し、証明することができます。それらについて。私が理解している限り、このツールはHOL-ML-Haskellプロジェクト内で開発されており、 ドキュメントページ の背後にある理論に関する情報が含まれています。

私はこのプロジェクトにそれほど精通しておらず、何が行われたかについてはあまり知りません。しかし、私は Brian Huffman がこれらのことで遊んでいることを知っています、彼の論文と講演をチェックしてください、それらには関連するものが含まれているはずです。

20
svenningsson

あなたが求めるものが実際にあなたを幸せにするものであるかどうかはわかりません。 :-)

モデルは実用的であるためにはドメイン固有でなければならないので、汎用言語のモデルチェックは不可能です。ゲーデルの不完全性定理により、十分に表現力のあるロジックに証明を自動的に見つける方法はありませんがあります。

これは、あなたがしなければならないことを意味します自分自身に証明を書く。もちろん、この取り組みは非常に価値のあるもの、つまりプログラムが正しいという保証を生み出します。問題は、これが必需品であるかどうかではなく、費やされた時間がコストが大きすぎるかどうかです。証明に関することは、あなたのプログラムが正しいという"直感的"な理解があるかもしれませんですが、それはしばしばこの理解を形式化することは困難です証明としてです。直感的な理解の問題は、偶発的なミス(誤植やその他の愚かなミス)の影響を非常に受けやすいことです。これは、正しいプログラムを作成する際の基本的なジレンマです。

したがって、プログラムの正確性に関する調査は、プルーフを形式化し、それらの正確性を自動的にチェックすることを容易にすることに関するすべてです。プログラミングは「形式化の容易さ」の不可欠な部分です。考えやすいスタイルでプログラムを書くことは非常に重要です。現在、次のスペクトルがあります。

  • C、C++、Fortran、Pythonなどの命令型言語:ここで何かを形式化するのは非常に困難です。単体テストと一般的な推論は、少なくともある程度の保証を得るための唯一の方法です。静的型付けは、些細なバグのみをキャッチします(キャッチしないよりもはるかに優れています!)。

  • HaskellやMLなどの純粋に関数型の言語:表現型システムは、重要なバグやミスの発見に役立ちます。正しさを手作業で証明することは、約200行程度のスニペットでは実用的だと思います。 (私は 運用パッケージ などの証明を行いました。) Quickcheck テストは正式な証明の安価な代用品です。

  • 依存型付けされた言語とAgda、Epigram、Coqなどの証明アシスタント:証明の形式化と発見の自動化されたヘルプにより、プログラム全体を正しく証明することが可能です。ただし、負担は依然として高い。

私の意見では、正しいプログラムを書くための現在のスイートスポットは、純粋に関数型プログラミングです。生活がプログラムの正確さに依存している場合は、レベルを上げて証明アシスタントを使用することをお勧めします。

18

ESC/Haskellのように聞こえます: http://research.Microsoft.com/en-us/um/people/simonpj/papers/verify/index.htm

そして、AgdaにはWebフレームワーク(少なくとも概念実証)があります。 http://www.reddit.com/r/haskell/comments/d8dck/lemmachine_a_web_framework_in_agda/

5
sclv

クイックチェックをご覧になりましたか?それはあなたが必要とするもののいくつかを提供するかもしれません。

http://www.haskell.org/haskellwiki/Introduction_to_QuickCheck

4
Jonno_FTW

Zeno をご覧ください。 Wikiページの引用:

ZenoはHaskellプログラムプロパティの自動化された証明システムです。ウィリアムソネックス、ソフィアドロソプロウ、スーザンアイゼンバッハによってインペリアルカレッジロンドンで開発されました。任意の入力値について、2つのHaskell項の間の等式の一般的な問題を解決することを目的としています。

現在利用可能なプログラム検証ツールの多くは、モデルチェックの種類が豊富です。非常に大きいが有限の探索空間を非常に高速に移動できます。これらは、大きな説明の問題に適していますが、再帰的なデータ型はありません。一方、Zenoは、無限の探索空間にわたって特性を帰納的に証明するように設計されていますが、仕様は小さく単純なものだけです。

3
Petr Pudlák

一見シンプルな例のadd(a、b)は、実際には検証が困難です-浮動小数点、オーバーフロー、アンダーフロー、割り込み、コンパイラーの検証、ハードウェアの検証など。

Habit は、Haskellの簡略化された方言で、プログラムのプロパティを証明できます。

ヒューム は5つのレベルの言語であり、それぞれ制限されているため、確認が容易です。

完全ヒューム
完全再帰
 PR-ヒューム
プリミティブ再帰関数
テンプレート-ヒューム
事前定義された高次関数
帰納的データ構造
帰納的非再帰的一次関数
 FSM-Hume 
非再帰的データ構造
 HW-Hume 
関数なし
非再帰的データ構造

もちろん、プログラムのプロパティを証明するための今日最も一般的な方法は、強力な定理を提供する単体テストですが、これらの定理は過度に具体的です。 "有害と見なされるタイプ"、Pierce、スライド66

3
ja.

Haskellプログラムのsomeプロパティを正式に証明することは確かに可能です。 FP試験:2つの式が与えられ、同じ関数を表すことを証明します。Haskellはチューリング完全であるため、これを行うことは一般的に不可能です。機械的証明者は、証明アシスタント(ユーザーガイダンス付きの半自動)またはモデルチェッカーのいずれかである必要があります。

この方向での試みがありました。 P-logic:Haskellプログラムのプロパティ検証 または Mizarを使用した機能プログラムの正確性の証明 。どちらも実装よりも方法を説明する学術論文です。

2
Fred Foo

ツールを使用できます hs-to-coq Haskellをほとんど自動でCoqに変換し、Coq証明アシスタントの全機能を使用してHaskellコードを検証します。詳細については、論文 https://arxiv.org/abs/1803.0696 および https://arxiv.org/abs/1711.09286 を参照してください。

1

ツール AProVE は、(少なくとも)Haskellプログラムの終了を証明できます。これは、正確性の証明の一部です。詳細については、 このペーパー短いバージョン )を参照してください。

それとは別に、あなたは Dependent Types に興味があるかもしれません。ここでは、型システムが拡張され、間違ったプログラムを不可能にするために使用されます。

1
C-Otto

MSRケンブリッジによるごく最近の取り組み: http://research.Microsoft.com/en-us/um/people/simonpj/papers/verify/hcc-popl.pdf

1
rsinha