私の理論では、より大きな定義があります。そこから補題を使っていくつかの簡単なプロパティを導き出します。状態が未知の条件付き書き直し規則
私の問題は、プロパティを導出するための補助定理が簡略化では使用されておらず、手動でインスタンス化する必要があるということです。これをより自動化する方法はありますか?
最小限の例を以下に示します。
definition complexFact :: "int ⇒ int ⇒ int ⇒ bool" where
"complexFact x y z ≡ x = y + z"
lemma useComplexFact: "complexFact x y z ⟹ x = y + z"
by (simp add: complexFact_def)
lemma example_1:
assumes cf: "complexFact a b c"
shows "a = b + c"
apply (simp add: cf useComplexFact) (* easy, works *)
done
lemma example_2a:
assumes cf: "complexFact a b c"
shows "a - b = c"
apply (simp add: cf useComplexFact) (* does not work *)
oops
lemma example_2b:
assumes cf: "complexFact a b c"
shows "a - b = c"
apply (simp add: useComplexFact[OF cf]) (* works *)
done
lemma example_2c:
assumes cf: "complexFact a b c"
shows "a - b = c"
apply (subst useComplexFact) (* manually it also works*)
apply (subst cf)
apply simp+
done
私はリファレンスマニュアルの次の段落を見つけたので、私は、私はカスタムソルバーと私の問題を解決することができると思います。 しかし、私は本当にイザベルの内部のMLの部分に触れたことはありませんし、どこから始めるべきか分かりません。
書き換えは未知数をインスタンス化しません。たとえば、 だけを書き直すと、∈Aを証明できません。なぜなら、これをインスタンス化する必要があるからです。しかし、 ソルバーは任意の手法であり、未知数 をインスタンス化することができます。これはSimplifierが条件に余分な変数を含む 条件付き書き換えルールを処理できる唯一の方法です。
ありがとうございます。なぜ、次の2つのアプローチ、すなわちcf apply(simp add:useComplexFact [where x = a])を使用して、仮定ソルバが動作しないのですか。私は左辺を一定にし、simp_traceは '[0]書き換えルール" ??。unknown "を追加することを示します: complexFact a?y1?z1⟹a≡?y1 +?z1'。しかし、仮定ソルバーは未知数をインスタンス化しませんか? – peq
'simp add:useComplexFact [where x = a]'は動作しません。その結果の書き換えルールは 'complexFact a?y?z ==> a =?y +?z'です。だから、単純化する者が 'a'を見て、このルールを使ってみようとすると、' complexFact a?y?z'という条件を解決しなければなりません。シンプル化はソルバの前に最初に呼び出されるので、この条件を処理しようとしますが、これには 'a'が含まれています。したがって、単純化深さの限界に達するまで、同じ条件付きの書き換えルールを再度使用しようとします。単純化子は条件付き書き換えのチェーン全体を打ち切ります(簡略化ではバックトラックはありません)。 –