Skip to main content
3 of 11
edited title

How to prove in Coq these 2 theorems with [count_fold]?

Here's a count function defined via fold, using the supplementary [eqf].

Definition eq_cor {X : Type} (eqf : X -> X -> bool) :=
  forall (x y : X), x = y <-> eqf x y = true.

Definition count_fold {X: Type} {eqf} : @eq_cor X eqf -> X -> list X ->  nat  :=
  fun _ x l => (fold X nat (fun y n => if eqf x y then n + 1 else n) l 0).

With [count_fold], I would like to prove these 2 theorems below.

First:

Theorem count_fold_nil  {X : Type} {eqf} : 
  forall (l : list X) (eq: eq_cor eqf),
     (forall (x:X), count_fold eq x l = 0) <-> l = nil.

A hint for this: I might need to prove a little lemma for one of directions: for example, that n <> S n for any n. Of course, it may also be the case that there is such a lemma in the standard library. What I tried, is to prove by induction on l, but I'm stuck.

Second:

Theorem count_occ_cons_eq {X : Type} {eqf} : 
    forall (l : list X) (eq: eq_cor eqf) (x y : X), 
    x = y <-> count_fold eq y (x::l)  = S (count_fold eq y l).

I tried unfolding [count_fold], it didn't help.

By the way, this is how [fold] is defined:

Print fold_right.
fun (A B : Type) (f : B -> A -> A) (a0 : A) =>
fix fold_right (l : list B) : A :=
  match l with
  | [] => a0
  | b :: t => f b (fold_right t)
  end
     : forall A B : Type, (B -> A -> A) -> A -> list B -> A
Definition fold (A B: Type) f l b:= @fold_right B A f b l.

Thank you in advance.