Тактика: filter_exercise

#coq #logical-foundations

#coq #логические основы

Вопрос:

 (** **** Exercise: 3 stars, advanced (filter_exercise)

    This one is a bit challenging.  Pay attention to the form of your
    induction hypothesis. *)

Theorem filter_exercise : forall (X : Type) (test : X -> bool)
                             (x : X) (l lf : list X),
     filter test l = x :: lf ->
     test x = true.
Proof.
  intros X test x l lf. induction l as [| h t].
  - simpl. intros H. discriminate H.
  - simpl. destruct (test h) eqn:E.
     
 

Вот что я получил до сих пор:

 X : Type
test : X -> bool
x, h : X
t, lf : list X
IHt : filter test t = x :: lf -> test x = true
E : test h = true
============================
h :: filter test t = x :: lf -> test x = true
 

И здесь я застрял. Что такого особенного в гипотезе индукции, на что я должен обратить внимание?

Комментарии:

1. Я не знаю, что здесь имели в виду авторы, но вы на правильном пути. Что следует из того факта, что два непустых списка равны? Ответ позволит вам доказать первую подцель.

Ответ №1:

Дана цель со стрелой в ней,

 h :: filter test t = x :: lf -> test x = true
                             ^^
 

естественным следующим шагом является переход к intros предпосылке. Новая предпосылка

 h :: filter test t = x :: lf
 

подразумевает , что компоненты :: соответственно равны , т.е. h = x И filter test t = lf , которые могут быть извлечены с помощью inversion . Остальное тривиально.

Комментарии:

1. Я решил это сам, но я сравню свой ответ с вашим.