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