Upgrade to Pro — share decks privately, control downloads, hide ads and more …

プログラムを書いて証明しよう! -- Coqを用いた形式証明の解説 --

soukouki
October 15, 2022
66

プログラムを書いて証明しよう! -- Coqを用いた形式証明の解説 --

2022年 Zli 秋の大LT スライド

soukouki

October 15, 2022
Tweet

More Decks by soukouki

Transcript

  1. sou7といいます 学部2年 Zli 次期副代表 GDSC(Google Developer Student Community) Aizu Lead

    プログラミング言語触ったりしてます Twitter : @sou7___ Github : @soukouki .                 やぁ > 2
  2. 5

  3. 実際に見てみよう この命題を関数に落とすと (p -> q) -> p -> q という型を持つ関数(変数)を定義す

    ることになります。 modusPonens :: (p -> q) -> p -> q modusPonens hpq hp = hpq hp (P → Q) → P → Q 6
  4. もうちょっと違う例で見てみましょう。 に対応する型は、 ((A -> B), (B -> C)) -> (A

    -> C) です。 syllogism :: ((a -> b), (b -> c)) -> (a -> c) syllogism (hab, hbc) ha = hbc (hab ha) (A → B) ∧ (B → C) → (A → C) 7
  5. ド・モルガンの法則の一部は、こんなふうに書けます。 import Data.Void and_l :: (p, q) -> p and_l

    (hp, _) = hp and_r :: (p, q) -> q and_r (_, hq) = hq deMorgan :: (Either (p -> Void) (q -> Void)) -> ((p, q) -> Void) deMorgan (Left hnp) = hnp . and_l deMorgan (Right hnq) = hnq . and_r ¬P ∨ ¬Q → ¬(P ∧ Q) 8
  6. じゃぁCoqだとどんなふうに証明するの? これまではHaskellでの証明を見てきましたが、証明の割にとてもややこしいコードに なってしまいます。 そこでCoqは、タクティックと呼ばれる構文を使うことで、証明を簡単に書けるよう にしました。 Theorem ModusPonens (P Q: Prop):

    (P -> Q) -> P -> Q. Proof. move=> Hpq Hp. (* Proof.からQed.までの3行がタクティック *) apply Hpq. apply Hp. Qed. (このコードはSSReflectのタクティックを使っているため、実際にはSSReflectをイン ポートする必要があります。) 9
  7. (* (2.3)' *) Theorem subsets_cap: forall A B C, C

    \subset A -> C \subset B -> C \subset A \cap B. Proof. move=> A B C HC_subset_A HC_subset_B x. split. - by apply HC_subset_A. - by apply HC_subset_B. Qed. (* (2.4)' *) Theorem cap_diag: forall A, A \cap A = A. Proof. move=> A. apply eq_subset' => x; rewrite -cap_and. - by case. - by split => //. Qed. 11