Вызовите теорему, используя let-in
У меня есть функция f
возвращая пару. Тогда я докажу некоторые результаты по этому поводу. В моих леммах моя первая попытка получить каждый компонент использовал let (x, y) := f z in
, Но тогда попытка использовать эти леммы кажется громоздкой. apply
не работает напрямую, я должен добавить лемму в гипотезу, используя pose proof
или вариант его и уничтожить f z
чтобы иметь возможность использовать его. Есть ли способ использовать плавный ввод в леммах? Или это не рекомендуется, потому что это больно использовать?
Чтобы закончить мой вопрос, вот другие попытки, которые я сделал, чтобы написать леммы о f
, Я пытался с помощью fst (f z)
а также snd (f z)
напрямую, но я также нашел это громоздким. Наконец, я начал свои леммы с forall x y, (x,y) = f z ->
,
Вот конкретный пример.
Require Import List. Import ListNotations.
Fixpoint split {A} (l:list A) :=
match l with
| [] => ([], [])
| [a] => ([a], [])
| a::b::l => let (l1, l2) := split l in (a::l1, b::l2)
end.
Lemma split_in : forall {A} (l:list A) x,
let (l1, l2) := split l in
In x l1 \/ In x l2 <-> In x l.
Lemma split_in2 : forall {A} (l:list A) x,
In x (fst (split l)) \/ In x (snd (split l)) <-> In x l.
Lemma split_in3 : forall {A} (l:list A) x l1 l2,
(l1, l2) = split l ->
In x l1 \/ In x l2 <-> In x l.
1 ответ
Вы нашли то, что я считаю правильным решением. let (l1, l2) := ... in ...
заблокирует сокращение и сломает все. Используете ли вы split_in2
или же split_in3
зависит от того, какова ваша отправная точка.
Обратите внимание, однако, что включение Primitive Projections
и переопределение prod
в качестве примитивной записи сделаю так, чтобы split_in
а также split_in2
на самом деле те же теоремы, потому что split l
а также (fst (split l), snd (split l))
объективно равны. Вы можете сделать это с
Set Primitive Projections.
Record prod {A B} := pair { fst : A ; snd : B }.
Arguments prod : clear implicits.
Arguments pair {A B}.
Add Printing Let prod.
Notation "x * y" := (prod x y) : type_scope.
Notation "( x , y , .. , z )" := (pair .. (pair x y) .. z) : core_scope.
Hint Resolve pair : core.