Search code examples
coq

proof of adding 1 to some number changes the parity in Coq


I defined even as:

Inductive even : nat -> Prop :=
  | ev0: even O
  | evSS: forall n, even n -> even (S (S n)).

But now I want to prove:

Lemma add1_diff (x: nat) : even (S x) = ~even x.

Can I prove:

even (S O) = (~ even O)

Thanks in advance.


Solution

  • You usually can't prove the equality of two Props. An equality in Prop means that the proof terms for a logical statement are equal. This is sometimes the case, but rarely. Here are a few examples:

    Require Import PeanoNat.
    Import Nat.
    
    Inductive even : nat -> Prop :=
      | ev0: even O
      | evSS: forall n, even n -> even (S (S n)).
    
    Example ex1 (n : nat) : (n >= 1) = (1 <= n).
    Proof.
      (* The proofs are equal because >= is defined in terms of <= *)
      reflexivity.
    Qed.
    
    Example ex2: even (2+2) = even 4.
    Proof.
      (* The proofs are equal because 2+2 can be reduced to 4 *)
      reflexivity.
    Qed.
    
    Example ex3 (n : nat) : even (2+n) = even (n+2).
    Proof.
      (* The proofs are equal because 2+n is equal to n+2 *)
      rewrite add_comm.
      reflexivity.
    Qed.
    
    Example ex4 (n : nat): even (S (S n)) = even n.
    Proof.
      (* The proofs cannot be equal, because the left side proof always
         requires one evSS constructor more than the right hand side. *)
    Abort.
    

    For this reason one uses the equivalence of two Props, which is <->, rather than the equality. The equivalence of the last statement is provable:

    Example ex4 (n : nat): even (S (S n)) <-> even n.
    Proof.
      split; intros H.
      - inversion H.
        assumption.
      - constructor.
        assumption.
    Qed.
    

    So to answer your question: the equality of the two statements is most likely not provable, but the equivalence is. In case you need help with that, please ask.