Ich bin neu in Coq. Wie kann ich beweisen, dass die Trennung von leerer und nicht leerer Liste wahr ist?Disjunktion der leeren und nicht leeren Liste in Coq
l = [] \/ l <> []
Dies ist das Lemma Ich arbeite an:
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))
Also das Lemma eine Möglichkeit zu beweisen, scheint zwei Fälle in Betracht ziehen:
if l = [] or l <> []
Dann
if l = [], P a holds
und
if l <> [], ~ P a /\ l <> [] /\ (exists b : X, In b l -> P b) holds
Ich kann das Lemma auf diese Weise beweisen, aber ich weiß nicht, wie ich diesen Weg gehen soll. Ich habe etwas Ähnliches für Prop-Typ (keine Liste) wie folgt für Variable R vom Typ Prop gemacht, die zwei Fälle von True oder False berücksichtigt. Ich bin mir nicht sicher, ob ich etwas ähnliches für die Liste machen kann.
destruct (classic R) as [r | rn].
Danke,
Entschuldigung für das Problem nicht vollständig zu klären. Ich habe meine Frage bearbeitet. –
Dieses 'in_list' Lemma scheint nicht beweisbar zu sein. 'If I = [], P a hält' ist nicht beweisbar, weil es einfach nicht genug Informationen in den Prämissen gibt (ich meine' In x [a] -> P x '(für einige" x ") scheint nicht nützlich sein, wenn 'x <> a'). Können Sie das Problem angeben, wo 'in_list' verwendet werden soll? –
In meiner Annahme (existiert ...), wenn die Liste l [] ist, muss es ein Element in der Liste geben, das "a" sein muss, das P a enthält. –