From 345c0ee557465d7d2f22ac34898388dfbb57cd0f Mon Sep 17 00:00:00 2001 From: letouzey Date: Thu, 7 Jan 2010 15:32:22 +0000 Subject: OrderTac: use TotalOrder, no more "change" before calling "order" (stuff with Inline) git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@12636 85f007b7-540e-0410-9357-904b9bb8a0f7 --- theories/Arith/NatOrderedType.v | 7 +- theories/NArith/NOrderedType.v | 7 +- theories/NArith/POrderedType.v | 7 +- theories/QArith/QOrderedType.v | 3 +- theories/Reals/ROrderedType.v | 6 +- theories/Structures/OrderTac.v | 174 ++++++++++++++++++++++---------- theories/Structures/OrderedType.v | 12 +-- theories/Structures/OrderedType2Facts.v | 64 +++--------- theories/ZArith/ZOrderedType.v | 6 +- 9 files changed, 148 insertions(+), 138 deletions(-) diff --git a/theories/Arith/NatOrderedType.v b/theories/Arith/NatOrderedType.v index 287d0c9559..d9b2b30f04 100644 --- a/theories/Arith/NatOrderedType.v +++ b/theories/Arith/NatOrderedType.v @@ -7,7 +7,7 @@ (************************************************************************) Require Import Lt Peano_dec Compare_dec EqNat - DecidableType2 OrderedType2 OrderedType2Facts. + DecidableType2 OrderedType2 OrderTac. (** * DecidableType structure for Peano numbers *) @@ -53,10 +53,7 @@ End Nat_as_OT. (** * An [order] tactic for Peano numbers *) Module NatOrder := OTF_to_OrderTac Nat_as_OT. -Ltac nat_order := - change (@eq nat) with NatOrder.OrderElts.eq in *; - NatOrder.order. +Ltac nat_order := NatOrder.order. (** Note that [nat_order] is domain-agnostic: it will not prove [1<=2] or [x<=x+x], but rather things like [x<=y -> y<=x -> x=y]. *) - diff --git a/theories/NArith/NOrderedType.v b/theories/NArith/NOrderedType.v index 08391d33f7..06db5fa1ce 100644 --- a/theories/NArith/NOrderedType.v +++ b/theories/NArith/NOrderedType.v @@ -6,8 +6,7 @@ (* * GNU Lesser General Public License Version 2.1 *) (************************************************************************) -Require Import BinNat - DecidableType2 OrderedType2 OrderedType2Facts. +Require Import BinNat DecidableType2 OrderedType2 OrderTac. Local Open Scope N_scope. @@ -54,9 +53,7 @@ End N_as_OT. (** * An [order] tactic for [N] numbers *) Module NOrder := OTF_to_OrderTac N_as_OT. -Ltac n_order := - change (@eq N) with NOrder.OrderElts.eq in *; - NOrder.order. +Ltac n_order := NOrder.order. (** Note that [n_order] is domain-agnostic: it will not prove [1<=2] or [x<=x+x], but rather things like [x<=y -> y<=x -> x=y]. *) diff --git a/theories/NArith/POrderedType.v b/theories/NArith/POrderedType.v index 85667e29ae..041a3a01be 100644 --- a/theories/NArith/POrderedType.v +++ b/theories/NArith/POrderedType.v @@ -6,8 +6,7 @@ (* * GNU Lesser General Public License Version 2.1 *) (************************************************************************) -Require Import BinPos - DecidableType2 OrderedType2 OrderedType2Facts. +Require Import BinPos DecidableType2 OrderedType2 OrderTac. Local Open Scope positive_scope. @@ -55,9 +54,7 @@ End Positive_as_OT. (** * An [order] tactic for positive numbers *) Module PositiveOrder := OTF_to_OrderTac Positive_as_OT. -Ltac p_order := - change (@eq positive) with PositiveOrder.OrderElts.eq in *; - PositiveOrder.order. +Ltac p_order := PositiveOrder.order. (** Note that [p_order] is domain-agnostic: it will not prove [1<=2] or [x<=x+x], but rather things like [x<=y -> y<=x -> x=y]. *) diff --git a/theories/QArith/QOrderedType.v b/theories/QArith/QOrderedType.v index c49ded7403..74770d6e11 100644 --- a/theories/QArith/QOrderedType.v +++ b/theories/QArith/QOrderedType.v @@ -6,8 +6,7 @@ (* * GNU Lesser General Public License Version 2.1 *) (************************************************************************) -Require Import QArith_base - DecidableType2 OrderedType2 OrderedType2Facts. +Require Import QArith_base DecidableType2 OrderedType2 OrderTac. Local Open Scope Q_scope. diff --git a/theories/Reals/ROrderedType.v b/theories/Reals/ROrderedType.v index 4ef8d7bcc6..ea20db99fb 100644 --- a/theories/Reals/ROrderedType.v +++ b/theories/Reals/ROrderedType.v @@ -6,7 +6,7 @@ (* * GNU Lesser General Public License Version 2.1 *) (************************************************************************) -Require Import Rbase DecidableType2 OrderedType2 OrderedType2Facts. +Require Import Rbase DecidableType2 OrderedType2 OrderTac. Local Open Scope R_scope. @@ -88,9 +88,7 @@ End R_as_OT. (** * An [order] tactic for real numbers *) Module ROrder := OTF_to_OrderTac R_as_OT. -Ltac r_order := - change (@eq R) with ROrder.OrderElts.eq in *; - ROrder.order. +Ltac r_order := ROrder.order. (** Note that [r_order] is domain-agnostic: it will not prove [1<=2] or [x<=x+x], but rather things like [x<=y -> y<=x -> x=y]. *) diff --git a/theories/Structures/OrderTac.v b/theories/Structures/OrderTac.v index f75e1ae913..43df377c08 100644 --- a/theories/Structures/OrderTac.v +++ b/theories/Structures/OrderTac.v @@ -6,7 +6,7 @@ (* * GNU Lesser General Public License Version 2.1 *) (***********************************************************************) -Require Import Setoid Morphisms. +Require Import Setoid Morphisms Basics DecidableType2 OrderedType2. Set Implicit Arguments. (** * The order tactic *) @@ -23,25 +23,6 @@ Set Implicit Arguments. The tactic will fail if it doesn't solve the goal. *) -(** ** The requirements of the tactic : an equivalence [eq], - a strict order [lt] total and compatible with [eq], and - a larger order [le] synonym of [lt\/eq]. *) - -Module Type OrderSig. - -Parameter Inline t : Type. -Parameters eq lt le : t -> t -> Prop. -Declare Instance eq_equiv : Equivalence eq. -Declare Instance lt_strorder : StrictOrder lt. -Declare Instance lt_compat : Proper (eq==>eq==>iff) lt. -Parameter lt_total : forall x y, lt x y \/ eq x y \/ lt y x. -Parameter le_lteq : forall x y, le x y <-> lt x y \/ eq x y. - -End OrderSig. - -(** NB : we should _not_ use "Inline" for these predicates, - otherwise the ltac matching will not work properly later. *) - (** An abstract vision of the predicates. This allows a one-line statement for interesting transitivity properties: for instance [trans_ord OLE OLE = OLE] will imply later @@ -56,19 +37,46 @@ Definition trans_ord o o' := | OLE, OLE => OLE | _, _ => OLT end. -Infix "+" := trans_ord : order. +Local Infix "+" := trans_ord. -(** ** [MakeOrderTac] : The functor providing the order tactic. *) -Module MakeOrderTac(Import O:OrderSig). +(** ** The requirements of the tactic : [TotalOrder]. -Local Open Scope order. + [TotalOrder] contains an equivalence [eq], + a strict order [lt] total and compatible with [eq], and + a larger order [le] synonym for [lt\/eq]. -Infix "==" := eq (at level 70, no associativity) : order. -Infix "<" := lt : order. -Infix "<=" := le : order. + NB: we create here a clone of TotalOrder, but without the [Inline] Pragma. + This is important for having later the exact shape in Ltac matching. +*) -(** ** Properties that will be used by the tactic *) +Module Type TotalOrder_NoInline <: TotalOrder. + Parameter Inline t : Type. + Parameters eq lt le : t -> t -> Prop. + Include Type IsEq <+ IsStrOrder <+ LeIsLtEq <+ LtIsTotal. +End TotalOrder_NoInline. + +Module Type TotalOrder_NoInline' := TotalOrder_NoInline <+ EqLtLeNotation. + +(** We make explicit aliases to help ltac matching *) + +Module CloneOrder (O:TotalOrder_NoInline) <: TotalOrder. +Definition t := O.t. +Definition eq := O.eq. +Definition lt := O.lt. +Definition le := O.le. +Definition eq_equiv := O.eq_equiv. +Definition lt_compat := O.lt_compat. +Definition lt_strorder := O.lt_strorder. +Definition le_lteq := O.le_lteq. +Definition lt_total := O.lt_total. +End CloneOrder. + + + +(** ** Properties that will be used by the [order] tactic *) + +Module OrderFacts(Import O:TotalOrder_NoInline'). (** Reflexivity rules *) @@ -104,8 +112,8 @@ Ltac subst_eqns := end. Definition interp_ord o := - match o with OEQ => eq | OLT => lt | OLE => le end. -Notation "#" := interp_ord : order. + match o with OEQ => O.eq | OLT => O.lt | OLE => O.le end. +Local Notation "#" := interp_ord. Lemma trans : forall o o' x y z, #o x y -> #o' y z -> #(o+o') x z. Proof. @@ -113,15 +121,15 @@ destruct o, o'; simpl; intros x y z; rewrite ?le_lteq; intuition; subst_eqns; eauto using (StrictOrder_Transitive x y z) with *. Qed. -Definition eq_trans x y z : x==y -> y==z -> x==z := trans OEQ OEQ x y z. -Definition le_trans x y z : x<=y -> y<=z -> x<=z := trans OLE OLE x y z. -Definition lt_trans x y z : x y x y x y<=z -> x y x y==z -> x y<=z -> x<=z := trans OEQ OLE x y z. -Definition le_eq x y z : x<=y -> y==z -> x<=z := trans OLE OEQ x y z. +Definition eq_trans x y z : x==y -> y==z -> x==z := @trans OEQ OEQ x y z. +Definition le_trans x y z : x<=y -> y<=z -> x<=z := @trans OLE OLE x y z. +Definition lt_trans x y z : x y x y x y<=z -> x y x y==z -> x y<=z -> x<=z := @trans OEQ OLE x y z. +Definition le_eq x y z : x<=y -> y==z -> x<=z := @trans OLE OEQ x y z. Lemma eq_neq : forall x y z, x==y -> ~y==z -> ~x==z. Proof. eauto using eq_trans, eq_sym. Qed. @@ -151,8 +159,15 @@ Qed. Lemma le_neq_lt : forall x y, x<=y -> ~x==y -> x