web-dev-qa-db-ja.com

Coqと比較したIsabelle証明アシスタントの長所と短所は何ですか?

Isabelle/HOLプルーフアシスタントには、Coqと比較して弱点と長所がありますか?

61
elysefaulkner

私は主にCoqに精通しており、Isabelle/HOLの経験はあまりありませんが、少し助けられるかもしれません。おそらく、Isabelle/HOLの経験が豊富な人がこれを改善するのに役立つでしょう。

2つのシステムの間には2つの大きな相違点があります:基礎となる理論スタイルの相互作用。各ケースの主な違いの概要を簡単に説明します。

理論

CoqとIsabelle/HOLは両方とも、強力で非常に表現力の高い高次ロジックに基づいています。ただし、これらのロジックはいくつかの機能が異なります。

依存型

Coqの論理は依存型理論であり、帰納法の計算/ [〜#〜] cic [〜#〜] forショート)。ここでの「依存型」とは、Coqの型が通常の値を参照できることを意味します。たとえば、次のタイプの行列乗算関数multを書くことができます。

mult : forall (n m p : nat), matrix n m -> matrix m p -> matrix n p

この関数の型は、2つの行列を入力として受け取ります。1つは次元n x m、もう1つは次元m x pで、次元n x pの行列を返します。一方、Isabelle/HOLの理論には依存型がありません。したがって、上記と同じ型のmult関数を書くことはできません。代わりに、 any 種類の行列に機能する関数を記述し、事後的この関数の特定のプロパティを証明する必要があります。適切な種類の引数を受け取ります。言い換えると、Isabelle/HOLで作業する場合、Coq型で明示されている特定のプロパティを個別の定理としてアサートする必要があります。

依存型はいくつかの点で興味深いものですが、それらが一般にどれほど有用であるかは明確ではありません。私の印象では、一部のプロパティは使用が非常に複雑であり、特定のプロパティを型レベルで表現することと、それらを個別の定理として持つことの利点は、この追加の複雑さに値しません。個人的には、明確な理由がある場合には、いくつかのケースで依存型を使用するのが好きです。

基本的な推論の原則

Coqの理論には、デフォルトでは、 除外されたミドルの法則 (つまり、非構成的に推論する能力)、拡張性など、数学の慣習で一般的な多くの推論原理が欠けています。 (たとえば、同等の結果を生成する関数自体は同等であると言えます)、および選択の公理。一方、Isabelle/HOLでは、このような原則が組み込まれています。

理論的には、これは大きな問題ではありません。Coqのロジックは、これらの推論の原則を安全に追加の公理として追加できるように設計されているためです。それでも、Isabelle/HOLでこのような推論を行う方が簡単だという印象があります。論理をサポートするためにゼロからロジックが構築されたからです。

(そのような基本原則をCoqのロジックから除外する理由は何だろうと思うかもしれません。動機は哲学的です。Coqのコアロジックでは、証明は実行可能なプログラムと見なすことができます。中間は、たとえば、分離A \/ Bの証明が、AまたはBのどちらが真であるかを示すビットを返すプログラムに対応することです。したがって、除外された中間 この質問 は問題についてもう少し議論します)

相互作用のスタイル

CoqとIsabelle/HOLは両方ともインタラクティブな定理証明者です。それらは、それらについての定義と証明を書くための言語です。これらの証明は、間違いがないことを確認するためにコンピューターによってチェックされます。どちらのシステムでも、何かを証明する方法を説明するコマンドを与えることにより、証拠を書き留めます。ただし、各システムでこれが発生する方法は異なります。

Isabelle/HOLは一般的に、「プッシュボタン」プルーフオートメーションのより成熟したサポートを備えています。たとえば、有名なsledgehammer戦術が付属しています。これは、いくつかの外部自動定理証明者とソルバーを呼び出して定理を証明しようとします。 Coqには、omegacongruenceなどの多くの強力な証明自動化手順も付属していますが、それらは一般的に適用可能ではなく、Isabelle/HOLの1つのコマンドで解決できる多くの定理が必要ですCoqのより明示的な証明。

もちろん、この便利さには代償が伴います。システムはそれ自体で多くのことをしようとするので、Isabelle/HOLで自分の証明を制御するのは難しいと言われました。これは、単純な定理を証明するときは問題になりませんが、証明の自動化が十分に強力ではなく、定理証明者に詳細に進める方法を伝える必要がある場合に問題になります。

ユーザー定義の証明自動化手順をサポートする場合、状況は少し異なります。 Coqには、Ltacとして知られるプルーフを書くための戦術言語が付属しています。これは独自のプログラミング言語です。 Ltacにはいくつかの設計上の問題がありますが、かなり複雑なプルーフ自動化手順を軽量にエンコードすることができます。より重いタスクの場合、Coqでは、ユーザーがCoqの実装言語であるOCamlでプラグインを作成することもできます。一方、Isabelle/HOLには、Ltacのような高レベルの自動化言語はなく、ユーザーがカスタムプルーフ自動化手順をプログラムできる唯一の方法はプラグインを使用することです。

イザベル/ HOLの「プッシュボタン」の有効性の1つの側面は、カントールによる古典的な「対角化」引数の 自動化 です(これは、電力セットの自然、またはより一般的にはany電力セットに設定)。

theorem Cantor: "∄f :: 'a ⇒ 'a set. ∀A. ∃x. A = f x"
proof
  assume "∃f :: 'a ⇒ 'a set. ∀A. ∃x. A = f x"
  then obtain f :: "'a ⇒ 'a set" where *: "∀A. ∃x. A = f x" ..
  let ?D = "{x. x ∉ f x}"
  from * obtain a where "?D = f a" by blast
  moreover have "a ∈ ?D ⟷ a ∉ f a" by blast
  ultimately show False by blast
qed

私があなたに提示したのは、カントールの古典的な議論のイザベル/ HOLへの翻訳でしょう。間違いなく、独創的です! Isabelle/HOLは、偶数this証明から洞察を自動化できますが、

theorem "∄f :: 'a ⇒ 'a set. ∀A. ∃x. f x = A"
  by best

theorem "∄f :: 'a ⇒ 'a set. ∀A. ∃x. f x = A"
  by force

証明システムは、Cantorの声明を自動的に証明することができます。研究者にとっては、一方でこれは有用ですが、これは両刃の剣であるという感覚があります。私の定理はより洗練されているので、対角化の引数と同じくらい複雑な真のステートメントがIsabelle/HOLの内部で証明されると信頼できると便利です。一方、コンピューターの自動化可能な進歩によって推進されている研究に進むと、定理が真である理由または原理について次第に説明できなくなります。私たちだけがそれを尋ねることができるなら、コンピューターだけがその理由を知っています!

13
user48801

「Isabelle/HOL」は質問で正確に記述されているため、Isabelleで使用されるHOLロジックについて説明します。私は型システムとロジックの専門家ではありませんが、ここで言うことは少なくとも大体正しいと思います。これも確かに好みの問題です;-)、私の答えは主観的かもしれません。

最も重大な違いは、型システムとロジックにあります。

私は、MLファミリーの機能的言語を知っている人(さらにSMLを知っている人)にとってはより自然であること、そして、たとえば基礎。その型システムは、Hindley Milnerの型システムに近く、デフォルトで終了します(ユーザーによって変更されていない場合)。

一方、Coqはより厳密で、直観主義的なロジックを使用します。いくつかの順序を持​​つ特殊な型システムを備えており、型の依存関係を扱うことができます。また、イザベルでは直接不可能なプルーフ(比較的非効率的かもしれない)からプログラムを抽出できます。

9
Mathieu