aboutsummaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
authorclrenard2001-07-10 12:03:32 +0000
committerclrenard2001-07-10 12:03:32 +0000
commitefe54347f3c6ebdced8142c5656c05ff46caa693 (patch)
treecfa2ebadc8f38555e0239c09257435196ac0fdaf /contrib
parent9c007d7d9744bababdb8b57da0a7ee7835bac434 (diff)
Changement de place de la tactique Setoid_rewrite
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@1840 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'contrib')
-rw-r--r--contrib/setoid/Setoid_replace.v76
-rw-r--r--contrib/setoid/setoid_replace.ml671
2 files changed, 0 insertions, 747 deletions
diff --git a/contrib/setoid/Setoid_replace.v b/contrib/setoid/Setoid_replace.v
deleted file mode 100644
index 53ca5b82a9..0000000000
--- a/contrib/setoid/Setoid_replace.v
+++ /dev/null
@@ -1,76 +0,0 @@
-(***********************************************************************)
-(* v * The Coq Proof Assistant / The Coq Development Team *)
-(* <O___,, * INRIA-Rocquencourt & LRI-CNRS-Orsay *)
-(* \VV/ *************************************************************)
-(* // * This file is distributed under the terms of the *)
-(* * GNU Lesser General Public License Version 2.1 *)
-(***********************************************************************)
-
-(* $Id$: *)
-
-Declare ML Module "setoid_replace".
-
-Grammar tactic simple_tactic : ast :=
- setoid_replace [ "Setoid_replace" constrarg($c1) "with" constrarg($c2) ] -> [(Setoid_replace $c1 $c2)]
-.
-
-Grammar tactic simple_tactic : ast :=
- setoid_rewriteLR [ "Setoid_rewrite" "->" constrarg($c) ] -> [(Setoid_rewriteLR $c)]
-| setoid_rewriteRL [ "Setoid_rewrite" "<-" constrarg($c) ] -> [(Setoid_rewriteRL $c)]
-| setoid_rewrite [ "Setoid_rewrite" constrarg($c) ] -> [(Setoid_rewriteLR $c)]
-.
-
-Syntax tactic level 0 :
- setoid_replace [<<(Setoid_replace $c1 $c2)>>] -> [[<hov 0>"Setoid_replace " $c1 [1 1] "with " $c2]]
- | setoid_rewritelr [<<(Setoid_rewriteLR $c)>>] -> ["Setoid_rewrite " $c]
- | setoid_rewriterl [<<(Setoid_rewriteRL $c)>>] -> ["Setoid_rewrite <- " $c]
-.
-
-Grammar vernac vernac : ast :=
- add_setoid [ "Add" "Setoid" constrarg($a) constrarg($aeq) constrarg($t) "." ]
- -> [(AddSetoid $a $aeq $t)]
-| new_morphism [ "New" "Morphism" identarg($s) constrarg($m) "." ] -> [(NamedNewMorphism $s $m)]
-| new_morphism [ "New" "Morphism" identarg($m) "." ] -> [(NewMorphism $m)]
-.
-
-Section Setoid.
-
-Variable A : Type.
-Variable Aeq : A -> A -> Prop.
-
-Record Setoid_Theory : Prop :=
-{ Seq_refl : (x:A) (Aeq x x);
- Seq_sym : (x,y:A) (Aeq x y) -> (Aeq y x);
- Seq_trans : (x,y,z:A) (Aeq x y) -> (Aeq y z) -> (Aeq x z)
-}.
-
-End Setoid.
-
-Definition Prop_S : (Setoid_Theory Prop ([x,y:Prop] x<->y)).
-Split; Tauto.
-Save.
-
-Add Setoid Prop iff Prop_S.
-
-Hint prop_set : setoid := Resolve (Seq_refl Prop iff Prop_S).
-Hint prop_set : setoid := Resolve (Seq_sym Prop iff Prop_S).
-Hint prop_set : setoid := Resolve (Seq_trans Prop iff Prop_S).
-
-New Morphism or.
-Tauto.
-Save.
-
-New Morphism and.
-Tauto.
-Save.
-
-New Morphism not.
-Tauto.
-Save.
-
-Definition fleche [A,B:Prop] := A -> B.
-
-New Morphism fleche.
-Tauto.
-Save.
-
diff --git a/contrib/setoid/setoid_replace.ml b/contrib/setoid/setoid_replace.ml
deleted file mode 100644
index a337b6e627..0000000000
--- a/contrib/setoid/setoid_replace.ml
+++ /dev/null
@@ -1,671 +0,0 @@
-(***********************************************************************)
-(* v * The Coq Proof Assistant / The Coq Development Team *)
-(* <O___,, * INRIA-Rocquencourt & LRI-CNRS-Orsay *)
-(* \VV/ *************************************************************)
-(* // * This file is distributed under the terms of the *)
-(* * GNU Lesser General Public License Version 2.1 *)
-(***********************************************************************)
-
-(* $Id$ *)
-
-open Tacmach
-open Proof_type
-open Libobject
-open Reduction
-open Term
-open Names
-open Util
-open Pp
-open Printer
-open Vernacinterp
-open Environ
-open Termast
-open Command
-open Tactics
-
-type setoid =
- { set_a : constr;
- set_aeq : constr;
- set_th : constr
- }
-
-type morphism =
- { lem : constr;
- profil : bool list;
- arg_types : constr list;
- lem2 : constr option
- }
-
-let constr_of c = Astterm.interp_constr Evd.empty (Global.env()) c
-
-let constant dir s =
- let dir = "Coq"::"setoid"::dir in
- let id = id_of_string s in
- try
- Declare.global_reference_in_absolute_module dir id
- with Not_found ->
- anomaly ("Setoid: cannot find "^(Nametab.string_of_qualid (Nametab.make_qualid dir id)))
-
-let global_constant dir s =
- let dir = "Coq"::"Init"::dir in
- let id = id_of_string s in
- try
- Declare.global_reference_in_absolute_module dir id
- with Not_found ->
- anomaly ("Setoid: cannot find "^(Nametab.string_of_qualid (Nametab.make_qualid dir id)))
-
-let current_constant id =
- try
- Declare.global_reference CCI id
- with Not_found ->
- anomaly ("Setoid: cannot find "^(string_of_id id))
-
-(* Setoid_theory *)
-
-let coq_Setoid_Theory = lazy(constant ["Setoid_replace"] "Setoid_Theory")
-
-let coq_seq_refl = lazy(constant ["Setoid_replace"] "Seq_refl")
-let coq_seq_sym = lazy(constant ["Setoid_replace"] "Seq_sym")
-let coq_seq_trans = lazy(constant ["Setoid_replace"] "Seq_trans")
-
-let coq_fleche = lazy(constant ["Setoid_replace"] "fleche")
-
-(* Coq constants *)
-
-let coqeq = lazy(global_constant ["Logic"] "eq")
-
-let coqconj = lazy(global_constant ["Logic"] "conj")
-
-(************************* Table of declared setoids **********************)
-
-
-(* Setoids are stored in a table which is synchronised with the Reset mechanism. *)
-
-module Cmap = Map.Make(struct type t = constr let compare = compare end)
-
-let setoid_table = ref Gmap.empty
-
-let setoid_table_add (s,th) = setoid_table := Gmap.add s th !setoid_table
-let setoid_table_find s = Gmap.find s !setoid_table
-let setoid_table_mem s = Gmap.mem s !setoid_table
-
-let equiv_list () = List.map (fun x -> x.set_aeq) (Gmap.rng !setoid_table)
-
-let _ =
- Summary.declare_summary "setoid-table"
- { Summary.freeze_function = (fun () -> !setoid_table);
- Summary.unfreeze_function = (fun t -> setoid_table := t);
- Summary.init_function = (fun () -> setoid_table := Gmap .empty);
- Summary.survive_section = false }
-
-(* Declare a new type of object in the environment : "setoid-theory". *)
-
-let (setoid_to_obj, obj_to_setoid)=
- let cache_set (_,(s, th)) = setoid_table_add (s,th)
- and export_set x = Some x
- in
- declare_object ("setoid-theory",
- { cache_function = cache_set;
- load_function = (fun _ -> ());
- open_function = cache_set;
- export_function = export_set})
-
-(******************************* Table of declared morphisms ********************)
-
-(* Setoids are stored in a table which is synchronised with the Reset mechanism. *)
-
-let morphism_table = ref Gmap.empty
-
-let morphism_table_add (m,c) = morphism_table := Gmap.add m c !morphism_table
-let morphism_table_find m = Gmap.find m !morphism_table
-let morphism_table_mem m = Gmap.mem m !morphism_table
-
-let _ =
- Summary.declare_summary "morphism-table"
- { Summary.freeze_function = (fun () -> !morphism_table);
- Summary.unfreeze_function = (fun t -> morphism_table := t);
- Summary.init_function = (fun () -> morphism_table := Gmap .empty);
- Summary.survive_section = false }
-
-(* Declare a new type of object in the environment : "morphism-definition". *)
-
-let (morphism_to_obj, obj_to_morphism)=
- let cache_set (_,(m, c)) = morphism_table_add (m, c)
- and export_set x = Some x
- in
- declare_object ("morphism-definition",
- { cache_function = cache_set;
- load_function = (fun _ -> ());
- open_function = cache_set;
- export_function = export_set})
-
-(************************** Adding a setoid to the database *********************)
-
-(* Find the setoid theory associated with a given type A.
-This implies that only one setoid theory can be declared for
-a given type A. *)
-
-let find_theory a =
- try
- setoid_table_find a
- with Not_found ->
- errorlabstrm "Setoid"
- [< 'sTR "No Declared Setoid Theory for ";
- prterm a; 'fNL;
- 'sTR "Use Add Setoid to declare it">]
-
-(* Add a Setoid to the database after a type verification. *)
-
-let eq_lem_proof env a eq sym trans =
- lambda_create env
- (a, lambda_create env
- (a, lambda_create env
- (a, lambda_create env
- (a, lambda_create env
- ((mkApp (eq, [|(mkRel 4);(mkRel 3)|])), lambda_create env
- ((mkApp (eq, [|(mkRel 3);(mkRel 2)|])), lambda_create env
- ((mkApp (eq, [|(mkRel 6);(mkRel 4)|])),
- (mkApp (trans,
- [|(mkRel 6);(mkRel 7);(mkRel 4);
- (mkApp (sym, [|(mkRel 7);(mkRel 6);(mkRel 3)|]));
- (mkApp (trans,
- [|(mkRel 7);(mkRel 5);(mkRel 4);(mkRel 1);(mkRel 2)|]))|]
- )))))))))
-
-let eq_lem2_proof env a eq sym trans =
- lambda_create env
- (a, lambda_create env
- (a, lambda_create env
- (a, lambda_create env
- (a, lambda_create env
- ((mkApp (eq, [|(mkRel 4);(mkRel 3)|])), lambda_create env
- ((mkApp (eq, [|(mkRel 3);(mkRel 2)|])),
- (mkApp ((Lazy.force coqconj),
- [|(mkArrow
- (mkApp (eq, [|(mkRel 6);(mkRel 4)|]))
- (mkApp (eq, [|(mkRel 6);(mkRel 4)|])));
- (mkArrow
- (mkApp (eq, [|(mkRel 5);(mkRel 3)|]))
- (mkApp (eq, [|(mkRel 7);(mkRel 5)|])));
- (lambda_create env
- ((mkApp (eq, [|(mkRel 6);(mkRel 4)|])),
- (mkApp (trans,
- [|(mkRel 6);(mkRel 7);(mkRel 4);
- (mkApp (sym, [|(mkRel 7);(mkRel 6);(mkRel 3)|]));
- (mkApp (trans,
- [|(mkRel 7);(mkRel 5);(mkRel 4);(mkRel 1);(mkRel 2)|]))|]))));
- (lambda_create env
- ((mkApp (eq, [|(mkRel 5);(mkRel 3)|])),
- (mkApp (trans,
- [|(mkRel 7);(mkRel 6);(mkRel 5);(mkRel 3);
- (mkApp (trans,
- [|(mkRel 6);(mkRel 4);(mkRel 5);(mkRel 1);
- (mkApp (sym, [|(mkRel 5);(mkRel 4);(mkRel 2)|]))|]))|]))))|]))))))))
-
-let gen_eq_lem_name =
- let i = ref 0 in
- function () ->
- incr i;
- id_of_string ("setoid_eq_ext"^(string_of_int !i))
-
-let add_setoid a aeq th =
- if setoid_table_mem a
- then errorlabstrm "Add Setoid"
- [< 'sTR "A Setoid Theory is already declared for "; prterm a >]
- else let env = Global.env () in
- if (is_conv env Evd.empty (Typing.type_of env Evd.empty th)
- (mkApp ((Lazy.force coq_Setoid_Theory), [| a; aeq |])))
- then (Lib.add_anonymous_leaf
- (setoid_to_obj
- (a, { set_a = a;
- set_aeq = aeq;
- set_th = th}));
- let sym = mkApp ((Lazy.force coq_seq_sym), [|a; aeq; th|]) in
- let trans = mkApp ((Lazy.force coq_seq_trans), [|a; aeq; th|]) in
- let eq_morph = eq_lem_proof env a aeq sym trans in
- let eq_morph2 = eq_lem2_proof env a aeq sym trans in
- Options.if_verbose pPNL [< prterm a;'sTR " is registered as a setoid">];
- let eq_ext_name = gen_eq_lem_name () in
- let eq_ext_name2 = gen_eq_lem_name () in
- let _ = Declare.declare_constant eq_ext_name
- ((Declare.ConstantEntry {Declarations.const_entry_body = eq_morph;
- Declarations.const_entry_type = None}),
- Declare.NeverDischarge,true) in
- let _ = Declare.declare_constant eq_ext_name2
- ((Declare.ConstantEntry {Declarations.const_entry_body = eq_morph2;
- Declarations.const_entry_type = None}),
- Declare.NeverDischarge,true) in
- let eqmorph = (current_constant eq_ext_name) in
- let eqmorph2 = (current_constant eq_ext_name2) in
- (Lib.add_anonymous_leaf
- (morphism_to_obj (aeq,
- { lem = eqmorph;
- profil = [true; true];
- arg_types = [a;a];
- lem2 = (Some eqmorph2)})));
- Options.if_verbose pPNL [< prterm aeq;'sTR " is registered as a morphism">])
- else errorlabstrm "Add Setoid" [< 'sTR "Not a valid setoid theory" >]
-
-(* The vernac command "Add Setoid" *)
-
-let constr_of_comarg = function
- | VARG_CONSTR c -> constr_of c
- | _ -> anomaly "Add Setoid"
-
-let _ =
- vinterp_add "AddSetoid"
- (function
- | [(VARG_CONSTR a); (VARG_CONSTR aeq); (VARG_CONSTR th)] ->
- (fun () -> (add_setoid
- (constr_of a)
- (constr_of aeq)
- (constr_of th)))
- | _ -> anomaly "AddSetoid")
-
-(***************** Adding a morphism to the database ****************************)
-
-(* We maintain a table of the currently edited proofs of morphism lemma
- in order to add them in the morphism_table when the user does Save *)
-
-let edited = ref Gmap.empty
-
-let new_edited id m profil =
- edited := Gmap.add id (m,profil) !edited
-
-let is_edited id =
- Gmap.mem id !edited
-
-let no_more_edited id =
- edited := Gmap.remove id !edited
-
-let what_edited id =
- Gmap.find id !edited
-
-let check_is_dependent t n =
- let rec aux t i n =
- if (i<n)
- then (dependent (mkRel i) t) || (aux t (i+1) n)
- else false
- in aux t 0 n
-
-let gen_lem_name m = match kind_of_term m with
- | IsVar id -> id_of_string ((string_of_id id)^"_ext")
- | IsConst (sp, _) -> id_of_string ((string_of_id(basename sp))^"_ext")
- | IsMutInd ((sp, i), _) -> id_of_string ((string_of_id(basename sp))^(string_of_int i)^"_ext")
- | IsMutConstruct (((sp,i),j), _) -> id_of_string
- ((string_of_id(basename sp))^(string_of_int i)^(string_of_int i)^"_ext")
- | _ -> errorlabstrm "New Morphism" [< 'sTR "The term "; prterm m; 'sTR "is not a known name">]
-
-let gen_lemma_tail m lisset body n =
- let l = (List.length lisset) in
- let a1 = Array.create l (mkRel 0) in
- let a2 = Array.create l (mkRel 0) in
- let rec aux i n = function
- | true::q ->
- a1.(i) <- (mkRel n);
- a2.(i) <- (mkRel (n-1));
- aux (i+1) (n-2) q
- | false::q ->
- a1.(i) <- (mkRel n);
- a2.(i) <- (mkRel n);
- aux (i+1) (n-1) q
- | [] -> () in
- aux 0 n lisset;
- if (eq_constr body mkProp)
- then mkArrow (mkApp (m,a1)) (lift 1 (mkApp (m, a2)))
- else if (setoid_table_mem body)
- then mkApp ((setoid_table_find body).set_aeq, [|(mkApp (m, a1)); (mkApp (m, a2))|])
- else mkApp ((Lazy.force coqeq), [|body; (mkApp (m, a1)); (mkApp (m, a2))|])
-
-let gen_lemma_middle m larg lisset body n =
- let rec aux la li i n = match (la, li) with
- | ([], []) -> gen_lemma_tail m lisset body n
- | (t::q, true::lq) ->
- mkArrow (mkApp ((setoid_table_find t).set_aeq,
- [|(mkRel i); (mkRel (i-1))|])) (aux q lq (i-1) (n+1))
- | (t::q, false::lq) -> aux q lq (i-1) n
- | _ -> assert false
- in aux larg lisset n n
-
-let gen_compat_lemma env m body larg lisset =
- let rec aux la li n = match (la, li) with
- | (t::q, true::lq) ->
- prod_create env (t,(prod_create env (t, (aux q lq (n+2)))))
- | (t::q, false::lq) ->
- prod_create env (t, (aux q lq (n+1)))
- | ([],[]) -> gen_lemma_middle m larg lisset body n
- | _ -> assert false
- in aux larg lisset 0
-
-let new_morphism m id =
- if morphism_table_mem m
- then errorlabstrm "New Morphism"
- [< 'sTR "The term "; prterm m; 'sTR " is already declared as a morpism">]
- else
- let env = Global.env() in
- let typeofm = (Typing.type_of env Evd.empty m) in
- let typ = (nf_betaiota typeofm) in (* nf_bdi avant, mais bug *)
- let (argsrev, body) = (decompose_prod typ) in
- let args = (List.rev argsrev) in
- if (args=[])
- then errorlabstrm "New Morphism"
- [< 'sTR "The term "; prterm m; 'sTR " is not a product">]
- else if (check_is_dependent typ (List.length args))
- then errorlabstrm "New Morphism"
- [< 'sTR "The term "; prterm m; 'sTR " should not be a dependent product">]
- else (
- let args_t = (List.map snd args) in
- let poss = (List.map setoid_table_mem args_t) in
- let lem = (gen_compat_lemma env m body args_t poss) in
- let lemast = (ast_of_constr true env lem) in
- new_edited id m poss;
- start_proof_com (Some id) Declare.NeverDischarge lemast;
- (Options.if_verbose Vernacentries.show_open_subgoals ()))
-
-let rec sub_bool l1 n = function
- | [] -> []
- | true::q -> ((List.hd l1), n)::(sub_bool (List.tl l1) (n-2) q)
- | false::q -> (sub_bool (List.tl l1) (n-1) q)
-
-let gen_lemma_iff_tail m mext larg lisset n k =
- let a1 = Array.create k (mkRel 0) in
- let a2 = Array.create k (mkRel 0) in
- let nb = List.length lisset in
- let b1 = Array.create nb (mkRel 0) in
- let b2 = Array.create nb (mkRel 0) in
- let rec aux i j = function
- |[] -> ()
- |true::q ->
- (a1.(i) <- (mkRel j);
- a1.(i+1) <- (mkRel (j-1));
- a2.(i) <- (mkRel (j-1));
- a2.(i+1) <- (mkRel j);
- aux (i+2) (j-2) q)
- |false::q ->
- (a1.(i) <- (mkRel j);
- a2.(i) <- (mkRel j);
- aux (i+1) (j-1) q) in
- let rec aux2 i j = function
- | (t,p)::q ->
- let th = (setoid_table_find t).set_th
- and equiv = (setoid_table_find t).set_aeq in
- a1.(i) <- (mkRel j);
- a2.(i) <- mkApp ((Lazy.force coq_seq_sym),
- [|t; equiv; th; (mkRel p); (mkRel (p-1)); (mkRel j)|]);
- aux2 (i+1) (j-1) q
- | [] -> () in
- let rec aux3 i j = function
- | true::q ->
- b1.(i) <- (mkRel j);
- b2.(i) <- (mkRel (j-1));
- aux3 (i+1) (j-2) q
- | false::q ->
- b1.(i) <- (mkRel j);
- b2.(i) <- (mkRel j);
- aux3 (i+1) (j-1) q
- | [] -> () in
- aux 0 k lisset;
- aux2 n (k-n) (sub_bool larg k lisset);
- aux3 0 k lisset;
- mkApp ((Lazy.force coqconj),
- [|(mkArrow (mkApp (m,b1)) (lift 1 (mkApp (m, b2))));
- (mkArrow (mkApp (m,b2)) (lift 1 (mkApp (m, b1))));
- (mkApp (mext, a1));(mkApp (mext, a2))|])
-
-let gen_lemma_iff_middle env m mext larg lisset n =
- let rec aux la li i k = match (la, li) with
- | ([], []) -> gen_lemma_iff_tail m mext larg lisset n k
- | (t::q, true::lq) ->
- lambda_create env ((mkApp ((setoid_table_find t).set_aeq, [|(mkRel i); (mkRel (i-1))|])),
- (aux q lq (i-1) (k+1)))
- | (t::q, false::lq) -> aux q lq (i-1) k
- | _ -> assert false
- in aux larg lisset n n
-
-let gen_lem_iff env m mext larg lisset =
- let rec aux la li n = match (la, li) with
- | (t::q, true::lq) ->
- lambda_create env (t,(lambda_create env (t, (aux q lq (n+2)))))
- | (t::q, false::lq) ->
- lambda_create env (t, (aux q lq (n+1)))
- | ([],[]) -> gen_lemma_iff_middle env m mext larg lisset n
- | _ -> assert false
- in aux larg lisset 0
-
-let add_morphism lem_name (m,profil) =
- if morphism_table_mem m
- then errorlabstrm "New Morphism"
- [< 'sTR "The term "; prterm m; 'sTR " is already declared as a morpism">]
- else
- let env = Global.env() in
- let mext = (current_constant lem_name) in
- let typeofm = (Typing.type_of env Evd.empty m) in
- let typ = (nf_betaiota typeofm) in
- let (argsrev, body) = (decompose_prod typ) in
- let args = List.rev argsrev in
- let args_t = (List.map snd args) in
- let poss = (List.map setoid_table_mem args_t) in
- let _ = assert (poss=profil) in
- (if (eq_constr body mkProp)
- then
- (let lem_2 = gen_lem_iff env m mext args_t poss in
- let lem2_name = (id_of_string ((string_of_id lem_name)^"2")) in
- let _ = Declare.declare_constant lem2_name
- ((Declare.ConstantEntry {Declarations.const_entry_body = lem_2;
- Declarations.const_entry_type = None}),
- Declare.NeverDischarge,true) in
- let lem2 = (current_constant lem2_name) in
- (Lib.add_anonymous_leaf
- (morphism_to_obj (m,
- { lem = mext;
- profil = poss;
- arg_types = args_t;
- lem2 = (Some lem2)})));
- Options.if_verbose message ((string_of_id lem2_name) ^ " is defined"))
- else
- (Lib.add_anonymous_leaf
- (morphism_to_obj (m,
- { lem = mext;
- profil = poss;
- arg_types = args_t;
- lem2 = None}))));
- Options.if_verbose pPNL [< prterm m;'sTR " is registered as a morphism">]
-
-let _ =
- let current_save = vinterp_map "SaveNamed" in
- overwriting_vinterp_add "SaveNamed"
- (function
- |[] -> (fun () ->
- let pf_id = Pfedit.get_current_proof_name () in
- current_save [] ();
- if (is_edited pf_id)
- then
- (add_morphism pf_id (what_edited pf_id);
- no_more_edited pf_id))
- | _ -> assert false)
-
-let _ =
- let current_defined = vinterp_map "DefinedNamed" in
- overwriting_vinterp_add "DefinedNamed"
- (function
- |[] -> (fun () -> let pf_id = Pfedit.get_current_proof_name () in
- current_defined [] ();
- if (is_edited pf_id)
- then
- (add_morphism pf_id (what_edited pf_id);
- no_more_edited pf_id))
- | _ -> assert false)
-
-let _ =
- vinterp_add "NewMorphism"
- (function
- | [(VARG_IDENTIFIER s)] ->
- (fun () ->
- try
- (let m = Declare.global_reference CCI s in
- new_morphism m (gen_lem_name m))
- with
- Not_found ->
- errorlabstrm "New Morphism"
- [< 'sTR "The term "; 'sTR(string_of_id s); 'sTR" is not a known name">])
- | _ -> anomaly "NewMorphism")
-
-let _ =
- vinterp_add "NamedNewMorphism"
- (function
- | [(VARG_IDENTIFIER s);(VARG_CONSTR m)] ->
- (fun () -> new_morphism (constr_of m) s)
- | _ -> anomaly "NewMorphism")
-
-(****************************** The tactic itself *******************************)
-
-type constr_with_marks =
- | MApp of constr_with_marks array
- | Toreplace
- | Tokeep
- | Mimp of constr_with_marks * constr_with_marks
-
-let is_to_replace = function
- | Tokeep -> false
- | Toreplace -> true
- | MApp _ -> true
- | Mimp _ -> true
-
-let get_mark a =
- Array.fold_left (||) false (Array.map is_to_replace a)
-
-let rec mark_occur t in_c =
- if (eq_constr t in_c) then Toreplace else
- match kind_of_term in_c with
- | IsApp (c,al) ->
- let a = Array.map (mark_occur t) al
- in if (get_mark a) then (MApp a) else Tokeep
- | IsProd (_, c1, c2) ->
- if (dependent (mkRel 1) c2)
- then Tokeep
- else
- let c1m = mark_occur t c1 in
- let c2m = mark_occur t c2 in
- if ((is_to_replace c1m)||(is_to_replace c2m))
- then (Mimp (c1m, c2m))
- else Tokeep
- | _ -> Tokeep
-
-let create_args ca ma bl c1 c2 =
- let rec aux i = function
- | [] -> []
- | true::q ->
- if (is_to_replace ma.(i))
- then (replace_term c1 c2 ca.(i))::ca.(i)::(aux (i+1) q)
- else ca.(i)::ca.(i)::(aux (i+1) q)
- | false::q -> ca.(i)::(aux (i+1) q)
- in
- aux 0 bl
-
-
-let res_tac c a hyp =
- let sa = setoid_table_find a in
- let fin = match hyp with
- | None -> Auto.full_trivial
- | Some h ->
- tclORELSE (tclTHEN (tclTRY (apply h)) (tclFAIL 0))
- (tclORELSE (tclTHEN (tclTRY (tclTHEN (apply (mkApp ((Lazy.force coq_seq_sym), [|sa.set_a; sa.set_aeq; sa.set_th|]))) (apply h))) (tclFAIL 0))
- Auto.full_trivial) in
- tclORELSE (tclTHEN (tclTRY (apply (mkApp ((Lazy.force coq_seq_refl), [|sa.set_a; sa.set_aeq; sa.set_th;c|])))) (tclFAIL 0))
- (tclORELSE assumption
- (tclORELSE (tclTHEN (tclTRY (apply (mkApp ((Lazy.force coq_seq_sym), [|sa.set_a; sa.set_aeq; sa.set_th|])))) assumption)
- fin))
-
-let id_res_tac c a =
- let sa = setoid_table_find a in
- (tclTRY (apply (mkApp ((Lazy.force coq_seq_refl), [|sa.set_a; sa.set_aeq; sa.set_th; c|]))))
-
-let rec create_tac_list i a al c1 c2 hyp args_t = function
- | [] -> []
- | false::q -> create_tac_list (i+1) a al c1 c2 hyp args_t q
- | true::q ->
- if (is_to_replace a.(i))
- then (zapply false al.(i) a.(i) c1 c2 hyp)::(create_tac_list (i+1) a al c1 c2 hyp args_t q)
- else (id_res_tac al.(i) (List.nth args_t i))::(create_tac_list (i+1) a al c1 c2 hyp args_t q)
-(* else tclIDTAC::(create_tac_list (i+1) a al c1 c2 hyp q) *)
-
-and zapply is_r gl gl_m c1 c2 hyp glll = (match ((kind_of_term gl), gl_m) with
- | ((IsApp (c,al)),(MApp a)) -> (
- try
- let m = morphism_table_find c in
- let args = Array.of_list (create_args al a m.profil c1 c2) in
- if is_r
- then tclTHENS (apply (mkApp (m.lem, args)))
- ((create_tac_list 0 a al c1 c2 hyp m.arg_types m.profil)@[tclIDTAC])
- else (match m.lem2 with
- | None ->
- tclTHENS (apply (mkApp (m.lem, args))) (create_tac_list 0 a al c1 c2 hyp m.arg_types m.profil)
- | Some xom ->
- tclTHENS (apply (mkApp (xom, args))) (create_tac_list 0 a al c1 c2 hyp m.arg_types m.profil))
- with Not_found -> errorlabstrm "Setoid_replace"
- [< 'sTR "The term "; prterm c; 'sTR " has not been declared as a morphism">])
- | ((IsProd (_,hh, cc)),(Mimp (hhm, ccm))) ->
- let al = [|hh; cc|] in
- let a = [|hhm; ccm|] in
- let fleche_constr = (Lazy.force coq_fleche) in
- let fleche_cp = (match (kind_of_term fleche_constr) with
- | (IsConst (cp,_)) -> cp
- | _ -> assert false) in
- let new_concl = (mkApp (fleche_constr, al)) in
- if is_r
- then
- let m = morphism_table_find fleche_constr in
- let args = Array.of_list (create_args al a m.profil c1 c2) in
- tclTHEN (change_in_concl new_concl)
- (tclTHENS (apply (mkApp (m.lem, args)))
- ((create_tac_list 0 a al c1 c2 hyp m.arg_types m.profil)@[unfold_constr (ConstRef fleche_cp)]))
-(* ((create_tac_list 0 a al c1 c2 hyp m.arg_types m.profil)@[tclIDTAC])) *)
- else (zapply is_r new_concl (MApp a) c1 c2 hyp)
-(* let args = Array.of_list (create_args [|hh; cc|] [|hhm; ccm|] [true;true] c1 c2) in
- if is_r
- then tclTHENS (apply (mkApp ((Lazy.force coq_fleche_ext), args)))
- ((create_tac_list 0 [|hhm; ccm|] [|hh; cc|] c1 c2 hyp [mkProp; mkProp] [true;true])@[tclIDTAC])
- else tclTHENS (apply (mkApp ((Lazy.force coq_fleche_ext2), args)))
- ((create_tac_list 0 [|hhm; ccm|] [|hh; cc|] c1 c2 hyp [mkProp; mkProp] [true;true])@[tclIDTAC])
-*)
- | (_, Toreplace) -> (res_tac gl (pf_type_of glll gl) hyp) (* tclORELSE Auto.full_trivial tclIDTAC *)
- | (_, Tokeep) -> error "Don't know what to do with this goal"
- | _ -> anomaly ("Bug in Setoid_replace")) glll
-
-let setoid_replace c1 c2 gl hyp =
- let but = (pf_concl gl) in
- (zapply true but (mark_occur c1 but) c1 c2 hyp) gl
-
-let general_s_rewrite lft2rgt c gl =
- let ctype = pf_type_of gl c in
- let (equiv, args) = decomp_app ctype in
- let rec get_last_two = function
- | [c1;c2] -> (c1, c2)
- | x::y::z -> get_last_two (y::z)
- | _ -> error "The term provided is not an equivalence" in
- let (c1,c2) = get_last_two args in
- if lft2rgt
- then setoid_replace c1 c2 gl (Some c)
- else setoid_replace c2 c1 gl (Some c)
-
-let setoid_rewriteLR = general_s_rewrite true
-
-let setoid_rewriteRL = general_s_rewrite false
-
-let dyn_setoid_replace = function
- | [(Constr c1);(Constr c2)] -> (fun gl -> setoid_replace c1 c2 gl None)
- | _ -> invalid_arg "Setoid_replace : Bad arguments"
-
-let h_setoid_replace = hide_tactic "Setoid_replace" dyn_setoid_replace
-
-let dyn_setoid_rewriteLR = function
- | [(Constr c)] -> setoid_rewriteLR c
- | _ -> invalid_arg "Setoid_rewrite : Bad arguments"
-
-let h_setoid_rewriteLR = hide_tactic "Setoid_rewriteLR" dyn_setoid_rewriteLR
-
-let dyn_setoid_rewriteRL = function
- | [(Constr c)] -> setoid_rewriteRL c
- | _ -> invalid_arg "Setoid_rewrite : Bad arguments"
-
-let h_setoid_rewriteRL = hide_tactic "Setoid_rewriteRL" dyn_setoid_rewriteRL