Вот задача:
Вдохновляясь из [In], напишите рекурсивную функцию [All], утверждающую, что некоторое свойство [P] содержит все элементы списка [l].Чтобы убедиться, что ваше определение верно, докажите лемму [All_In] ниже.(Конечно, ваше определение должно , а не просто переформулировать левую часть [All_In].)
In
было определено так:
Fixpoint In {A : Type} (x : A) (l : list A) : Prop :=
match l with
| [] => False
| x' :: l' => x' = x \/ In x l'
end.
Сначала я определил All
аналогичным образом:
Fixpoint All {T : Type} (P : T -> Prop) (l : list T) : Prop :=
match l with
| [] => False
| x' :: l' => P x' /\ All P l'
end.
Но потом я подумал, что это неверно, потому что False в конце соединения всегда будет давать False.
Нам нужно игнорировать последний элемент nil списка, если он не пустой (это не работает, просто идея):
Fixpoint All {T : Type} (P : T -> Prop) (l : list T) : Prop :=
match l with
| [] => False
| x' :: l' => P x' /\ if l' = [] then True else All P l'
end.
Ошибка, которую я не знаю, как решить:
Ошибка: термин "l '= []" имеет тип "Prop", который не является (ко) индуктивным.
Затем я возвращаюсь к первомуcase:
| x' :: l' => P x' /\ All P l'
и попытайтесь доказать теорему All_In:
Lemma All_In :
forall T (P : T -> Prop) (l : list T),
(forall x, In x l -> P x) <->
All P l.
Proof.
intros T P l. split.
- (* Left to right *)
intros H. induction l as [| h t IHl].
+ simpl. simpl in H.
Теперь мы застряли:
T : Type
P : T -> Prop
H : forall x : T, False -> P x
============================
False
Поскольку в выводе есть False, нов этой посылке нет ложной гипотезы, и все утверждение является ложью.
- Как правильно определить все?
- Что не так с моим доказательством?