Я работаю через модуль 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.
Текущее состояние доказательства включает inr
из Aeq_dec
в качестве гипотезы. Я отбросил базовый случай индукции и индуктивный случай, когда 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
Единственный способ для H
быть истиной, если a <> x
- если set_mem xs
- истина. Я должен быть в состоянии применить условное в H
к a <> x
, чтобы получить set_mem xs
. Однако я не понимаю, как это сделать. Как мне работать, или разлагать, или применять условные выражения?