多くの状況でうまく機能する一般的な「ビュー」パターンを指摘しているイヴェスの答えは、ケース分析が必要であった。私はmath-compでビルトインサポートを使用しますが、そのテクニックはそれに特有のものではありません。あなたが次のステップに到着するcase_eq
+ simpl
を使用することができ、今
From mathcomp Require Import all_ssreflect.
Variables (T : eqType) (a b : T).
Lemma u : (if a == b then 0 else 1) = 2.
Proof.
;:
のは、あなたの最初の目標を想定してみましょうただし、より特殊化された「表示」補助儀を使用して照合することもできます。 if_spec
がどこにある
ifP : forall (A : Type) (b : bool) (vT vF : A),
if_spec b vT vF (b = false) b (if b then vT else vF)
:たとえば、あなたがifP
を使用することができ
Inductive if_spec (A : Type) (b : bool) (vT vF : A) (not_b : Prop) : bool -> A -> Set :=
IfSpecTrue : b -> if_spec b vT vF not_b true vT
| IfSpecFalse : not_b -> if_spec b vT vF not_b false vF
少し混乱見えること、重要なビットは、タイプファミリーbool -> A -> Set
のパラメータです。最初の練習問題は "ifP
補題を証明する"です。私達は私達の証明でifP
を使用する場合
実際、我々が得る:私たちは何も指定する必要はありませんでした
case: ifP.
Goal 1: (a == b) = true -> 0 = 2
Goal 2: (a == b) = false -> 1 = 2
注意!実際、形式{ A } + { B }
の補題は、このビューパターンの特殊なケースに過ぎません。このトリックは他の多くの状況で機能します。例えば、ブール値の等価性と命題1を関連付ける仕様を持つeqP
も使用できます。そうした場合:
case: eqP.
を、あなたが取得します:
Goal 1: a = b -> 0 = 2
Goal 2: a <> b -> 1 = 2
非常に便利です。実際、eqP
は基本的にtype_dec
原則の一般的なバージョンです。
あなたの質問は非常に理解しにくいです。 arithとは何ですか?それはどこから来たのですか?あなたの英語のテキストでは、cとxには異なる型があると書いていますが、if then else文の型を整えるためには、同じ型を持つ必要があります。 – Yves
@Yves:質問を編集しました。私はちょうど私の質問を簡単にしたいと思った。 – re3el
"a == b"という表記がどこから来るのかまだ分かりません。この表記は、CoqのStringライブラリには導入されていないようです。一方、そのライブラリにはsting_dec関数があります。それはあなたが使っているものですか? – Yves