私はCoq。空リストと非空リストの論理和が真であることをどのように証明できますか?空で空でないリストとcoqの論理和
l = [] \/ l <> []
これは私が働いているの補題です:
Lemma in_list: forall (X : Type) (a : X) l (P : X -> Prop),
(a :: l <> [] /\ exists b : X, In b (a :: l) -> P b) ->
(P a /\ l = [] \/
P a /\ l <> [] \/ ~ P a /\ l <> [] /\ (exists b : X, In b l -> P b))
ので補題を証明する一つの方法は、2つのケースを考慮しているようだ:
if l = [] or l <> []
その後
if l = [], P a holds
および
if l <> [], ~ P a /\ l <> [] /\ (exists b : X, In b l -> P b) holds
私はこのように補題を証明することができますが、私はこのようにする方法を知らない。私はProp型の変数R(TrueまたはFalseの2つのケースを考慮する)のように、Prop型(リストではない)と同様のことをしました。私はリストに似たようなことができるかどうかはわかりません。
destruct (classic R) as [r | rn].
おかげで、
問題を完全にはっきりさせないために残念です。私は私の質問を編集しました。 –
この 'in_list'補題は証明できないようです。前者には情報が不足しているため(つまり '' x '(x)'の中には '' x ''のように見えない)、 '' l = [] 'x <> a'のときに便利です)。 'in_list'が使われるべきところに問題を述べることができますか? –
リストlが[]なら私の前提で(存在する...)、リストにはP aが保持する 'a'でなければならない要素がなければならない。 –