私は "プログラミングとIsabelle/HOLの検証"でエクササイズ4.6を解決しようとしています。リストを集合に変換する関数elems :: "'a list ⇒ 'a set"
を定義し、補助詞"x ∈ elems xs ⟹ ∃ ys zs . xs = ys @ x # zs ∧ x ∉ elems ys"
を証明するよう求めます。これまでのところ、私は遠くに来ました:"4.6 Isabelle/HOLのプログラミングと証明"のエクササイズ4.6で補題を証明するにはどうしたらいいですか?
fun elems :: "'a list ⇒ 'a set" where
"elems [] = {}" |
"elems (x # xs) = {x} ∪ elems xs"
lemma first_occ: "x ∈ elems xs ⟹ ∃ ys zs . xs = ys @ x # zs ∧ x ∉ elems ys"
proof (induction xs)
case Nil
thus ?case by simp
next
case (Cons u us)
show ?case
proof cases
assume "x = u"
thus ?case
proof
⟨…⟩
この時点で、「最初の証明方法を適用できませんでした」というエラーメッセージが表示されます。目標は?case
、提案は∃ ys zs . u # us = ys @ x # zs ∧ x ∉ elems ys
なので、具体的証人については∃
の下にその命題を示すことで、存在論的命題を証明することが可能でなければなりません。
に役立ちますか?目標が「∃x」という形式の命題である場合。 P 'である。 Isabelleは自動的に存在の導入を選択する必要があります。それは他の状況でも働いていました。(例えば、私の質問のサンプルコード[Isabelle/Isarに複数の変数を持つ実在する命題を効率的に証明するにはどうすればよいですか?]](https://stackoverflow.com/questions/47464404) –
'のような事実の中で連鎖しているので' 'ルール' 'のような証明方法は、すべての連鎖事実を正しい順序で適用するというルールの仮定で統一できれば機能します。メソッドを明示的に指定しないで、Isabelleは 'rule'に似た' standard'を使用します。デフォルトのルールセットをいくつか使用しますTL.DRあなたはほとんど事実を 'proof'に束縛したくないです。ここに「こう」の。 –