Я хочу доказать следующие леммы.

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).
coq
0
Daisuke Sugawara 5 Окт 2020 в 16:21

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.
1
Tiago Campos 6 Окт 2020 в 05:37