Я хочу доказать следующие леммы.
Lemma AppendAndSplit {n m}(e:Euc n) (f:Euc m): # (e +++ f) = (e, f).
Proof.
induction e.
reflexivity.
remember (r:::e).
Admitted.
Lemma SplitRule {n m}(e:Euc (n+m)) : (fst (# e)) +++ (snd (# e)) = e.
Proof.
induction n.
reflexivity.
Admitted.
#
и +++
являются обозначениями EucAppend
и Split_Euc
.
Я чувствую, что это работает, но не знаю, как это доказать.
Подскажите, пожалуйста, несколько приемов.
(* Необходимые коды ниже *)
Require Import Coq.Reals.Reals.
Inductive Euc:nat -> Type:=
|RO : Euc 0
|Rn : forall {n:nat}, R -> Euc n -> Euc (S n).
Notation "[ ]" := RO.
Notation "[ r1 , .. , r2 ]" := (Rn r1 .. ( Rn r2 RO ) .. ).
Infix ":::" := Rn (at level 60, right associativity).
Fixpoint EucAppend {n m} (e:Euc n) (f:Euc m) :Euc (n+m):=
match e with
|[] => f
|e' ::: es => e' ::: (EucAppend es f)
end.
Infix "+++" := EucAppend (at level 60, right associativity).
Fixpoint split_Euc {n m : nat} (xi : Euc (n + m)) : Euc n ∧ Euc m.
Proof.
destruct n as [ | n].
- exact (RO, xi).
- inversion_clear xi.
apply split_Euc in H0 as [l r].
exact (Rn H l, r).
Defined.
Notation "# n" := (split_Euc n) (at level 60, right associativity).
1 ответ
Основная проблема, которую вы не можете решить для своих целей, - это проблема с определениями. Split_Euc определен для выполнения индукции по n, и это нормально, однако определения выполняют инверсию по Euc. Инверсия обычно является тактикой доказательств, если тактика порождает очень тяжелые условия доказательства:
Fixpoint split_Euc {n m : nat} (xi : Euc (n + m)) : Euc n * Euc m.
Proof.
destruct n as [ | n].
- exact (RO, xi).
- inversion_clear xi.
Show Proof. (* let see what is actually the problem *)
...
Defined.
Вы увидите что-то вроде этого:
eq_rec_r (fun n2 : nat => R -> Euc n2 -> Euc (S n0) * Euc m)
(fun (H6 : R) (H7 : Euc (n0 + m)) =>
?Goal@{n:=n0; H:=H6; H0:=H7}) H5) H3) H1 H H0
Обратите внимание, что в вашем определении используется термин доказательства (схема индукции равенства) для объединения кортежа. Термины доказательства нелегко нормализовать, а некоторые другие даже не получают нормализованного члена (это случай непрозрачных доказательств). Решение состоит в том, чтобы избегать тактики, которая генерирует тяжелые условия доказательства и заменяет схемы индукции (например, уничтожение, индукция, случай ...), когда они "свободны" или почти не содержат автоматических доказательств.
Definition rect_euc {n : nat} (v : Euc (S n)) : forall (P : Euc (S n) -> Type) (H : forall ys a, P (a ::: ys)), P v.
refine (
match v with
|@Rn _ _ _ => _
|R0 => _
end).
exact idProp.
intros.
apply : H.
Defined.
Fixpoint split_Euc {n m : nat} (xi : Euc (n + m)) : Euc n * Euc m.
Proof.
destruct n as [ | n].
- exact (RO, xi).
- elim/@rect_euc : xi.
intros.
pose (split_Euc _ _ ys).
exact (Rn a (fst p), (snd p)).
Defined.
Теперь, когда split_euc определяется с помощью индукции по n, вы должны сделать то же самое, чтобы получить прямое доказательство.
Lemma AppendAndSplit {n m}(e:Euc n) (f:Euc m): # (e +++ f) = (e, f).
Proof.
induction n.
- remember 0.
destruct e.
reflexivity.
inversion Heqn.
- apply (rect_euc e).
intros.
assert (forall n (xs ys : Euc n) (x y : R), x = y -> xs = ys -> x ::: xs = y ::: ys).
intros.
rewrite H; rewrite H0; trivial.
pose (IHn ys).
apply : injective_projections.
simpl;apply : H; trivial.
exact (f_equal fst e0).
exact (f_equal snd e0).
Qed.
Lemma SplitRule {n m}(e:Euc (n+m)) : (fst (split_Euc e)) +++ (snd (split_Euc e)) = e.
YOUR_TURN. (* now it's your turn, just do the same and u will get the goal*)
Qed.
Похожие вопросы
Новые вопросы
coq
Coq - это формальная система управления доказательствами, полуинтерактивный инструмент проверки теорем и функциональный язык программирования. Coq используется для верификации программного обеспечения, формализации языков программирования, формализации математических теорем, обучения и многого другого. В связи с интерактивной природой Coq, мы рекомендуем при необходимости ссылаться на ссылки на исполняемые примеры на https://x80.org/collacoq/.