comparison src/Equality.v @ 480:f38a3af9dd17

Batch of changes based on proofreader feedback
author Adam Chlipala <adam@chlipala.net>
date Fri, 30 Nov 2012 11:57:55 -0500
parents 40a9a36844d6
children 5025a401ad9e
comparison
equal deleted inserted replaced
479:40a9a36844d6 480:f38a3af9dd17
178 This all may make it sound like the choice of [eq]'s definition is unimportant. To the contrary, in this chapter, we will see examples where alternate definitions may simplify proofs. Before that point, I will introduce proof methods for goals that use proofs of the standard propositional equality "as data." *) 178 This all may make it sound like the choice of [eq]'s definition is unimportant. To the contrary, in this chapter, we will see examples where alternate definitions may simplify proofs. Before that point, I will introduce proof methods for goals that use proofs of the standard propositional equality "as data." *)
179 179
180 180
181 (** * Heterogeneous Lists Revisited *) 181 (** * Heterogeneous Lists Revisited *)
182 182
183 (** One of our example dependent data structures from the last chapter was the heterogeneous list and its associated "cursor" type. The recursive version poses some special challenges related to equality proofs, since it uses such proofs in its definition of [fmember] types. *) 183 (** One of our example dependent data structures from the last chapter (code repeated below) was the heterogeneous list and its associated "cursor" type. The recursive version poses some special challenges related to equality proofs, since it uses such proofs in its definition of [fmember] types. *)
184 184
185 Section fhlist. 185 Section fhlist.
186 Variable A : Type. 186 Variable A : Type.
187 Variable B : A -> Type. 187 Variable B : A -> Type.
188 188
418 (** %\vspace{-.15in}% [[ 418 (** %\vspace{-.15in}% [[
419 UIP_refl 419 UIP_refl
420 : forall (U : Type) (x : U) (p : x = x), p = eq_refl x 420 : forall (U : Type) (x : U) (p : x = x), p = eq_refl x
421 ]] 421 ]]
422 422
423 The theorem %\index{Gallina terms!UIP\_refl}%[UIP_refl] comes from the [Eqdep] module of the standard library. Do the Coq authors know of some clever trick for building such proofs that we have not seen yet? If they do, they did not use it for this proof. Rather, the proof is based on an _axiom_, the term [eq_rect_eq] below. *) 423 The theorem %\index{Gallina terms!UIP\_refl}%[UIP_refl] comes from the [Eqdep] module of the standard library. (Its name uses the acronym "UIP" for "unicity of identity proofs.") Do the Coq authors know of some clever trick for building such proofs that we have not seen yet? If they do, they did not use it for this proof. Rather, the proof is based on an _axiom_, the term [eq_rect_eq] below. *)
424 424
425 (* begin hide *) 425 (* begin hide *)
426 Import Eq_rect_eq. 426 Import Eq_rect_eq.
427 (* end hide *) 427 (* end hide *)
428 Print eq_rect_eq. 428 Print eq_rect_eq.
457 (* begin thide *) 457 (* begin thide *)
458 Definition Streicher_K' := UIP_refl__Streicher_K. 458 Definition Streicher_K' := UIP_refl__Streicher_K.
459 (* end thide *) 459 (* end thide *)
460 (* end hide *) 460 (* end hide *)
461 461
462 Print Streicher_K. 462 Check Streicher_K.
463 (* end thide *) 463 (* end thide *)
464 (** %\vspace{-.15in}% [[ 464 (** %\vspace{-.15in}% [[
465 Streicher_K = 465 Streicher_K
466 fun U : Type => UIP_refl__Streicher_K U (UIP_refl U)
467 : forall (U : Type) (x : U) (P : x = x -> Prop), 466 : forall (U : Type) (x : U) (P : x = x -> Prop),
468 P (eq_refl x) -> forall p : x = x, P p 467 P eq_refl -> forall p : x = x, P p
469 ]] 468 ]]
470 469
471 This is the unfortunately named %\index{axiom K}%"Streicher's axiom K," which says that a predicate on properly typed equality proofs holds of all such proofs if it holds of reflexivity. *) 470 This is the opaquely named %\index{axiom K}%"Streicher's axiom K," which says that a predicate on properly typed equality proofs holds of all such proofs if it holds of reflexivity. *)
472 471
473 End fhlist_map. 472 End fhlist_map.
474 473
475 (* begin hide *) 474 (* begin hide *)
476 (* begin thide *) 475 (* begin thide *)
689 (** %\vspace{-.15in}% [[ 688 (** %\vspace{-.15in}% [[
690 Inductive JMeq (A : Type) (x : A) : forall B : Type, B -> Prop := 689 Inductive JMeq (A : Type) (x : A) : forall B : Type, B -> Prop :=
691 JMeq_refl : JMeq x x 690 JMeq_refl : JMeq x x
692 ]] 691 ]]
693 692
694 The identifier [JMeq] stands for %\index{John Major equality}%"John Major equality," a name coined by Conor McBride%~\cite{JMeq}% as a sort of pun about British politics. The definition [JMeq] starts out looking a lot like the definition of [eq]. The crucial difference is that we may use [JMeq] _on arguments of different types_. For instance, a lemma that we failed to establish before is trivial with [JMeq]. It makes for prettier theorem statements to define some syntactic shorthand first. *) 693 The identifier [JMeq] stands for %\index{John Major equality}%"John Major equality," a name coined by Conor McBride%~\cite{JMeq}% as an inside joke about British politics. The definition [JMeq] starts out looking a lot like the definition of [eq]. The crucial difference is that we may use [JMeq] _on arguments of different types_. For instance, a lemma that we failed to establish before is trivial with [JMeq]. It makes for prettier theorem statements to define some syntactic shorthand first. *)
695 694
696 Infix "==" := JMeq (at level 70, no associativity). 695 Infix "==" := JMeq (at level 70, no associativity).
697 696
698 (* EX: Prove UIP_refl' : forall (A : Type) (x : A) (pf : x = x), pf == eq_refl x *) 697 (* EX: Prove UIP_refl' : forall (A : Type) (x : A) (pf : x = x), pf == eq_refl x *)
699 (* begin thide *) 698 (* begin thide *)
720 (** %\vspace{-.15in}% [[ 719 (** %\vspace{-.15in}% [[
721 JMeq_eq 720 JMeq_eq
722 : forall (A : Type) (x y : A), x == y -> x = y 721 : forall (A : Type) (x y : A), x == y -> x = y
723 ]] 722 ]]
724 723
725 It may be surprising that we cannot prove that heterogeneous equality implies normal equality. The difficulties are the same kind we have seen so far, based on limitations of [match] annotations. 724 It may be surprising that we cannot prove that heterogeneous equality implies normal equality. The difficulties are the same kind we have seen so far, based on limitations of [match] annotations. The [JMeq_eq] axiom has been proved on paper to be consistent, but asserting it may still be considered to complicate the logic we work in, so there is some motivation for avoiding it.
726 725
727 We can redo our [fhapp] associativity proof based around [JMeq]. *) 726 We can redo our [fhapp] associativity proof based around [JMeq]. *)
728 727
729 Section fhapp'. 728 Section fhapp'.
730 Variable A : Type. 729 Variable A : Type.
860 Theorem out_of_luck : forall n m : nat, 859 Theorem out_of_luck : forall n m : nat,
861 n == m 860 n == m
862 -> S n == S m. 861 -> S n == S m.
863 intros n m H. 862 intros n m H.
864 863
865 (** Applying [JMeq_ind_r] is easy, as the %\index{tactics!pattern}%[pattern] tactic will transform the goal into an application of an appropriate [fun] to a term that we want to abstract. *) 864 (** Applying [JMeq_ind_r] is easy, as the %\index{tactics!pattern}%[pattern] tactic will transform the goal into an application of an appropriate [fun] to a term that we want to abstract. (In general, [pattern] abstracts over a term by introducing a new anonymous function taking that term as argument.) *)
866 865
867 pattern n. 866 pattern n.
868 (** %\vspace{-.15in}%[[ 867 (** %\vspace{-.15in}%[[
869 n : nat 868 n : nat
870 m : nat 869 m : nat