如何证明Coq标准库中filter引理

在这里插入图片描述

如何证明Coq标准库中filter引理
Require Import Arith.
Require Import ZArith.
Require Import Bool.
Require Import List.
Variable A : Type.
Variable f: A -> bool.
Fixpoint filter (l:list A) : list A :=
\quad match l with
\quad | nil => nil
\quad | x ::l => if f x then x :: (filter l)
\qquad \qquad else filter l
\quad end.
Lemma or_and : forall P Q R : Prop,
(P / Q) /\ R <-> (P /\ R) / (Q /\ R).
Proof .
\quad unfold iff.
\quad intros P Q R.
\quad split.
\quad - intros [[H | H0] H1].
\qquad + left.
\qquad \quad Search and.
\qquad \quad apply conj.
\qquad \quad * apply H.
\qquad \quad * apply H1.
\qquad + right.
\qquad \quad apply conj.
\qquad \quad * apply H0.
\qquad \quad * apply H1.
\quad - intros [[H H0] | [H1 H2]].
\qquad + apply conj.
\qquad \quad * left.
\qquad \qquad apply H.
\qquad \quad * apply H0.
\qquad + apply conj.
\qquad \quad * right.
\qquad \qquad apply H1.
\qquad \quad * apply H2.
Qed .

Lemma filter_in : forall x l, In x (filter l) <-> In x l /\ f x = true.
Proof .
\quad intros x l.
\quad generalize dependent x.
\quad induction l as [| n l’ IHl’].
\quad - intro x.
\qquad split.
\qquad + intro H0.
\qquad \quad simpl in H0.
\qquad \quad inversion H0.
\qquad + intros [H0 H1].
\qquad \quad simpl.
\qquad \quad inversion H0.
\quad - intro x.
\qquad split.
\qquad + simpl.
\qquad \quad intro H0.
\qquad \quad destruct (f n) eqn : H.
\qquad \quad * rewrite -> or_and.
\qquad \qquad simpl in H0.
\qquad \qquad destruct H0.
\qquad \qquad { left.
\qquad \qquad \quad rewrite H0 in H.
\qquad \qquad \quad apply conj.
\qquad \qquad \quad apply H0.
\qquad \qquad \quad apply H.
\qquad \qquad }
\qquad \qquad { right.
\qquad \qquad \quad apply IHl’.
\qquad \qquad \quad apply H0.
\qquad \qquad }
\qquad \quad * rewrite -> or_and.
\qquad \qquad right.
\qquad \qquad apply IHl’.
\qquad \qquad apply H0.
\qquad + simpl.
\qquad \quad intros [[H | H0] H1].
\qquad \quad * destruct (f n) eqn : H2.
\qquad \qquad { simpl.
\qquad \qquad \quad left.
\qquad \qquad \quad apply H.
\qquad \qquad }
\qquad \qquad { rewrite H in H2.
\qquad \qquad \quad rewrite H1 in H2.
\qquad \qquad \quad inversion H2.
\qquad \qquad }
\qquad \quad * destruct (f n) eqn : H2.
\qquad \qquad { simpl.
\qquad \qquad \quad right.
\qquad \qquad \quad apply IHl’.
\qquad \qquad \quad apply conj.
\qquad \qquad \quad apply H0.
\qquad \qquad \quad apply H1.
\qquad \qquad }
\qquad \qquad { apply IHl’.
\qquad \qquad \quad apply conj.
\qquad \qquad \quad apply H0.
\qquad \qquad \quad apply H1.
\qquad \qquad }
Qed .
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值