6

時々、私が適用スタイルの証明を書いているとき、私は証明方法 fooを次のように変更する方法を望んでいました

foo最初の目標を試してください。それが目標を解決するなら、良いです。それでも解決しない場合は、元の状態に戻して失敗します。

これは次のコードで発生しました:

qed (subst fibs.simps, (subst fib.simps)?, simp add: nth_zipWith nth_tail)+

さらに上に変更を加えると、への呼び出しsimpは目標を完全に解決できなくなり、ループします。私が次のようなものを指定できたら

qed (solve_goal(subst fibs.simps, (subst fib.simps)?, simp add: nth_zipWith nth_tail))+

または(代替案のsynatx)

qed ((subst fibs.simps, (subst fib.simps)?, simp add: nth_zipWith nth_tail)!)+

または(おそらくさらに良い構文)

qed ((subst fibs.simps, (subst fib.simps)?, simp add: nth_zipWith nth_tail)[1!])+

このスクリプトでは解決できなかった最初の目標で停止していました。

4

4 に答える 4

3

イザベルにはそのようなコンビネータがありません。これも私が見逃していることです。多くの場合、または(解決または失敗の動作をする)を置き換えるautosimp呼び出すと、このようなコンビネータの必要性を回避できます。fastforceforce

したがって、simpあなたの例のが(ループせずに)目標を解決することになっている場合、

qed (subst fibs.simps, (subst fib.simps)?, fastforce simp: nth_zipWith nth_tail)+

より堅牢なバリアントである可能性があります。

于 2013-03-08T09:40:47.657 に答える
3

Eisbach証明スクリプト言語の出現以来、これは現在サポートされています。インポート後"~~/src/HOL/Eisbach/Eisbach"、置き換えることができます

apply foo

apply (solves ‹foo›)

solvesそして、新しい目標を生み出すと、ラインは失敗します。[1]これは、次のように組み合わせることができます

apply (solves ‹(auto)[1]›)

必要に応じて。

の定義solvesは実際には非常に単純です。

method solves methods m = (m; fail)
于 2016-05-20T08:12:32.467 に答える
1

組み込みの戦術やコンビネータはありませんが、次のように自分で実装できます。

ML {*
fun solved_tac thm =
  if nprems_of thm = 0 then Seq.single thm else Seq.empty
*}

method_setup solved = {*
  Scan.succeed (K (SIMPLE_METHOD solved_tac))
*}

solvedこれにより、現在の目標が完全に解決された場合に成功するか、1つ以上のサブ目標がまだ残っている場合に失敗する新しいメソッドが作成されます。

たとえば、次のように使用できます。

lemma "a ∨ ¬ a "
  apply ((rule disjI1, solved) | (simp, solved))
  done

solved条項がないと、Isabelleはステップのrule disjI1側面を選択applyし、解決できない目標を残します。solved両側に句がある場合、Isabelleは使用を試み、rule disjI1目標の解決に失敗すると、成功した目標に切り替えますsimp

(...)[1]これは、Isabelleの構文を使用して、個々の目標を解決するために使用できます。たとえば、次のステートメントは、を使用してできるだけ多くのサブゴールを解決しようとしますが、完全に解決できsimpない場合はサブゴールを変更せずに残します。simp

apply ((simp, solved)[1])+
于 2013-04-10T00:17:14.220 に答える
0

IsabelleのIsar言語は、その機能を提供していません。isabelle開発者リストで説明されているように、これは意図的なものであり、バグではありません。

Isar証明メソッド言語は、証明テキストのいくつかの操作面の「様式化された」仕様に到達するために、特定の方法で設計されました。意図的に、あらゆる種類のプログラミングや高度な制御構造を除外しています。

于 2013-03-15T22:25:18.417 に答える