How do I prove that two Fibonacci implementations are equal in Coq?

后端 未结 6 1281
南方客
南方客 2021-01-03 16:36

I\'ve two Fibonacci implementations, seen below, that I want to prove are functionally equivalent.

I\'ve already proved properties about natural numbers, but this ex

6条回答
  •  暖寄归人
    2021-01-03 17:03

    @larsr's answer inspired this alternative answer.

    First of all, let's define fib_v2:

    Require Import Coq.Arith.Arith. 
    
    Definition fib_v2 n := visit_fib_v2 n 0 1.
    

    Then, we are going to need a lemma, which is the same as fib_v2_lemma in @larsr's answer. I'm including it here for consistency and to show an alternative proof.

    Lemma visit_fib_v2_main_property n: forall a0 a1,
      visit_fib_v2 (S (S n)) a0 a1 =
      visit_fib_v2 (S n) a0 a1 + visit_fib_v2 n a0 a1.
    Proof.
      induction n; intros a0 a1; auto with arith.
      change (visit_fib_v2 (S (S (S n))) a0 a1) with
             (visit_fib_v2 (S (S n)) a1 (a0 + a1)).
      apply IHn.
    Qed.
    

    As suggested in the comments by larsr, the visit_fib_v2_main_property lemma can be also proved by the following impressive one-liner:

    now induction n; firstorder.
    

    Because of the nature of the numbers in the Fibonacci series it's very convenient to define an alternative induction principle:

    Lemma pair_induction (P : nat -> Prop) :
      P 0 ->
      P 1 ->
      (forall n, P n -> P (S n) -> P (S (S n))) ->
      forall n, P n.
    Proof.
      intros H0 H1 Hstep n.
      enough (P n /\ P (S n)) by tauto.
      induction n; intuition.
    Qed.
    

    The pair_induction principle basically says that if we can prove some property P for 0 and 1 and if for every natural number k > 1, we can prove P k holds under the assumption that P (k - 1) and P (k - 2) hold, then we can prove forall n, P n.

    Using our custom induction principle, we get the proof as follows:

    Lemma fib_v1_eq_fib2 n :
      fib_v1 n = fib_v2 n.
    Proof.
      induction n using pair_induction.
      - reflexivity.
      - reflexivity.
      - unfold fib_v2.
        rewrite visit_fib_v2_main_property.
        simpl; auto.
    Qed.
    

提交回复
热议问题