私はCoq標準ライブラリのListSet
モジュールを使って作業しています。私は、証明で条件文を推論する方法が不明です。たとえば、私は次の証明に問題があります。定義は文脈のために提供される。Coqの条件文についての考え方を教えてください。
Fixpoint set_mem (x : A) (xs : set) : bool :=
match xs with
| nil => false
| cons y ys =>
match Aeq_dec x y with
| left _ => true
| right _ => set_mem x ys
end
end.
Definition set_In : A -> set -> Prop := In (A := A).
Lemma set_mem_correct1 : forall (x : A) (xs : set),
set_mem x xs = true -> set_In x xs.
Proof. intros. induction xs.
discriminate.
simpl; destruct Aeq_dec with a x.
intuition.
simpl in H.
現在の証拠状態が仮説としてAeq_dec
のinr
含みます。私は帰納の基本事例とinl
がAeq_dec
である帰納的事例を捨てました。
A : Type
Aeq_dec : forall x y : A, {x = y} + {x <> y}
x : A
a : A
xs : list A
H : (if Aeq_dec x a then true else set_mem x xs) = true
IHxs : set_mem x xs = true -> set_In x xs
n : a <> x
============================
a = x \/ set_In x xs
set_mem xs
がtrueの場合a <> x
がある場合H
が真になるための唯一の方法。私はset_mem xs
を得るためにH
の条件をa <> x
に適用できるはずです。しかし、私はこれを行う方法を理解していません。条件付き取引を処理、分解、または適用するにはどうすればよいですか?
私は理解していると思います。 'tactic destruct(Aeq_dec)'は、 'H 'の中の合計を破壊し、合計の左右の枝に対して2つの副目標を生成します。最初のケースは矛盾した仮説を生み出します。 2番目は誘導仮説の前件を導入する。私は仮説の中に入れられた金額を破壊することができないことを認識していませんでした。これを指摘していただきありがとうございます。 – danportin