Вызовите теорему, используя 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.
Другие вопросы по тегам