Я застрял с теоремой, которую легко сформулировать:
«Если максимальный элемент вектора равен 0, то каждый элемент вектора равен 0».
Цель состоит в том, чтобы использовать такую идиому, как "fold_left orb false v".
Поэтому моя первая цель - доказать эту конкретную лемму:
Lemma all_then_some (A:Type) :
forall (n:nat) (p:Fin.t (S n))
(v : Vector.t bool (S n))
(H : (Vector.fold_left orb false v) = false),
(Vector.nth v p) = false.
Proof.
...
Некоторые мысли:
1) Чтобы укрепить гипотезу и доказать что-то вроде этого:
(forall (b:bool), (List.fold_left orb l b) = b) <->
(forall (p:nat), (List.nth p l false) = false)
(** NB: variant for lists here! **)
2) Использовать принцип "rectS" из стандартной библиотеки / Vectors / Fin.v
3) Использовать небольшую библиотеку отражений.
ОБНОВЛЕНИЕ: чтобы найти частичное решение, смотрите мой ответ ниже. (Ged)
ОБНОВЛЕНИЕ 2: Решение здесь: https://github.com/georgydunaev/TRASH/blob/master/UNIV_INST.v
(это называется "Теорема all_then_someV")