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.
```
I have a hint, but not sure if it's for the first, or the second theorem:

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.
```