Помогите с доказательством кока для подпоследовательности

StackOverflow https://stackoverflow.com/questions/3220050

  •  13-09-2020
  •  | 
  •  

Вопрос

У меня есть определенные индуктивные типы:

Inductive InL (A:Type) (y:A) : list A -> Prop := 
  | InHead : forall xs:list A, InL y (cons y xs) 
  | InTail : forall (x:A) (xs:list A), InL y xs -> InL y (cons x xs).

Inductive SubSeq (A:Type) : list A -> list A -> Prop :=
 | SubNil : forall l:list A, SubSeq nil l
 | SubCons1 : forall (x:A) (l1 l2:list A), SubSeq l1 l2 -> SubSeq l1 (x::l2)
 | SubCons2 : forall (x:A) (l1 l2:list A), SubSeq l1 l2 -> SubSeq (x::l1) (x::l2).
.

Теперь я должен доказать серию свойств этого индуктивного типа, но я продолжаю застревать.

Lemma proof1: forall (A:Type) (x:A) (l1 l2:list A), SubSeq l1 l2 -> InL x l1 -> InL x l2.
Proof.
 intros.
 induction l1.
 induction l2.
 exact H0.

Qed.
.

Может ли кто-нибудь помочь мне продвинуться.

Это было полезно?

Решение

На самом деле, легче сделать индукцию на подмноженном решении напрямую. Тем не менее, вы должны быть как можно более общее, поэтому вот мой совет:

Lemma proof1: forall (A:Type) (x:A) (l1 l2:list A), 
  SubSeq l1 l2 -> InL x l1 -> InL x l2.
(* first introduce your hypothesis, but put back x and In foo
   inside the goal, so that your induction hypothesis are correct*)
intros. 
revert x H0. induction H; intros.
(* x In [] is not possible, so inversion will kill the subgoal *)
inversion H0.

(* here it is straitforward: just combine the correct hypothesis *)
apply InTail; apply IHSubSeq; trivial.

(* x0 in x::l1 has to possible sources: x0 == x or x0 in l1 *)
inversion H0; subst; clear H0.
apply InHead.
apply InTail; apply IHSubSeq; trivial.
Qed.
.

«Инверсия» - это тактика, которая проверяет индуктивный термин и дает вам все возможное способом построить такой термин! Без какой-либо гипотезы индукции !! Это только дает вам конструктивные предпосылки.

Вы могли бы сделать это непосредственно путем индукции на L1, а затем L2, но вам придется построить вручную правильный экземпляр инверсии, потому что ваша индукционная гипотеза была бы действительно слабой.

Надеюсь, это поможет, V.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top