2017-11-24 8 views
0

私は "プログラミングと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なので、具体的証人についてはの下にその命題を示すことで、存在論的命題を証明することが可能でなければなりません。

答えて

0

proofの問題点は、proofはデフォルトのルールを適用することです。上記の証拠では、Isabelleは、あなたが実在の紹介をしたいと思うことを理解できません。たとえば、proof (intro exI)のようなものを続けるなど、システムに明示的に伝えたいと思うかもしれません。

私は願って、これはなぜイザベルがこれを把握することはできません、 ルネ

+0

に役立ちますか?目標が「∃x」という形式の命題である場合。 P 'である。 Isabelleは自動的に存在の導入を選択する必要があります。それは他の状況でも働いていました。(例えば、私の質問のサンプルコード[Isabelle/Isarに複数の変数を持つ実在する命題を効率的に証明するにはどうすればよいですか?]](https://stackoverflow.com/questions/47464404) –

+0

'のような事実の中で連鎖しているので' 'ルール' 'のような証明方法は、すべての連鎖事実を正しい順序で適用するというルールの仮定で統一できれば機能します。メソッドを明示的に指定しないで、Isabelleは 'rule'に似た' standard'を使用します。デフォルトのルールセットをいくつか使用しますTL.DRあなたはほとんど事実を 'proof'に束縛したくないです。ここに「こう」の。 –

関連する問題