1

私は持っている

theory Even
imports Main

begin

inductive
  structural_even :: "nat ⇒ bool"
where
  "structural_even 0"
| "structural_even n ⟹ structural_even (Suc(Suc n))"

fun
  computational_even :: "nat ⇒ bool"
where
  "computational_even 0 = True"
| "computational_even (Suc 0) = False"
| "computational_even (Suc(Suc n)) = computational_even n"


lemma "computational_even n ⟹ structural_even n"
proof (induct n rule: computational_even.induct)
 show "computational_even 0 ⟹ structural_even 0"
 by (metis structural_even.intros(1))
next

証拠の後、私は得る

goal (3 subgoals):
 1. computational_even 0 ⟹ structural_even 0
 2. computational_even (Suc 0) ⟹ structural_even (Suc 0)
 3. ⋀n. (computational_even n ⟹ structural_even n) ⟹ computational_even (Suc (Suc n)) ⟹ structural_even (Suc (Suc n))

私はスレッジハンマーからメティスの電話を受けました。

構造的な_偶数.イントロ(1) =構造的な_偶数0

私は得る

show computational_even 0 ⟹ structural_even 0 
Successful attempt to solve goal by exported rule:
 computational_even 0 ⟹ structural_even 0 
proof (state): depth 0

それから。しかし、次の後に私は得る

goal (3 subgoals):
 1. computational_even 0 ⟹ computational_even 0
 2. computational_even (Suc 0) ⟹ structural_even (Suc 0)
 3. ⋀n. (computational_even n ⟹ structural_even n) ⟹ computational_even (Suc (Suc n)) ⟹ structural_even (Suc (Suc n))

したがって、システムが「エクスポートされたルールによってゴールを解決する試みに成功しました」と言ったにもかかわらず、1. に些細な残りのサブゴールがあります。

なぜこれが起こるのか、どうすれば修正できますか?

4

1 に答える 1

2

Sledgehammer は正しい証明を見つけました (ただし、simp代わりに使用することもできます)。実際、2 番目と 3 番目のサブゴール (証明後に #1 と同様の新しいサブゴールに縮小されます) を続行し、最終的に で証明を終了できますqed

問題は、イザベルが仮定をどのように処理するかです。あなたの場合のように、それらが明示的にリストされていない場合、それらを証明するのはユーザーに任されています。この効果は、次の場合により明確になります。

show "computational_even 0 ⟹ structural_even 0"

同等のものに置き換えられます

presume "computational_even 0"
show "structural_even 0"

あなたの証明は、それstructural_even 0が真であると同時に真であることを示していcomputational_even 0ますが、イザベルは後者が真である理由を「知りません」。したがって、証明で述べられている仮定は、サブゴールで述べられている仮定から導出できるという新しいサブゴールが残ります。このサブゴールはqed、仮定を考慮に入れて証明を終了する によって処理されます。

ところで、この場合の仮定はまったく必要ありませんstructural_even 0。その定義により が真だからです。したがって、仮定は安全に削除でき、残すのは

show "structural_even 0"

さらに、 で任意の仮定を指定できますがpresume、後で証明する必要があります。たとえば、ゴールを証明できます。

presume "computational_even (Suc 0)"
show "structural_even 0"

ただし、(偽の) ゴールを証明する必要がありますcomputational_even 0 ⟹ computational_even (Suc 0)

仮定を目標の前提と統合するために、assume代わりに が使用されます。

assume "computational_even 0"
show "structural_even 0"

その場合、サブゴールの仮定を証明する必要はありません (これは との統合ステップによって既に行われていassumeます)。その結果、サブゴールの証明を終えた後、予想どおり 2 つのサブゴールのみが残ります。

無料ボーナスとして、assumeが間違った仮定で使用された場合 (たとえば、以前の誤ったケースのようにcomputational_even (Suc 0))、Isabelle は、対応するshowステートメントが保留中の目標を絞り込むことができず、先に進むことができないと不平を言います。

于 2016-02-02T17:08:58.783 に答える