]> matita.cs.unibo.it Git - helm.git/commitdiff
moved coercions away (work in progress)
authorClaudio Sacerdoti Coen <claudio.sacerdoticoen@unibo.it>
Wed, 30 Nov 2005 14:43:32 +0000 (14:43 +0000)
committerClaudio Sacerdoti Coen <claudio.sacerdoticoen@unibo.it>
Wed, 30 Nov 2005 14:43:32 +0000 (14:43 +0000)
helm/matita/matitaEngine.ml
helm/matita/matitaSync.ml
helm/matita/matitaSync.mli

index 8f417485abcc6782748f85a54ef6fbab2224e843..fc8e19621dc51ecdc4a4fba00b66af87485fdd8b 100644 (file)
@@ -571,67 +571,10 @@ let eval_tactical status tac =
   in
   status
 
-let eval_coercion status coercion = 
-  let coer_uri,coer_ty =
-    match coercion with 
-    | Cic.Const (uri,_)
-    | Cic.Var (uri,_) ->
-        let o,_ = CicEnvironment.get_obj CicUniv.empty_ugraph uri in
-        (match o with
-        | Cic.Constant (_,_,ty,_,_)
-        | Cic.Variable (_,_,ty,_,_) ->
-            uri,ty
-        | _ -> assert false)
-    | Cic.MutConstruct (uri,t,c,_) ->
-        let o,_ = CicEnvironment.get_obj CicUniv.empty_ugraph uri in
-        (match o with
-        | Cic.InductiveDefinition (l,_,_,_) ->
-            let (_,_,_,cl) = List.nth l t in
-            let (_,cty) = List.nth cl c in
-              uri,cty
-        | _ -> assert false)
-    | _ -> assert false 
-  in
-  (* we have to get the source and the tgt type uri 
-   * in Coq syntax we have already their names, but 
-   * since we don't support Funclass and similar I think
-   * all the coercion should be of the form
-   * (A:?)(B:?)T1->T2
-   * So we should be able to extract them from the coercion type
-   *)
-  let extract_last_two_p ty =
-    let rec aux = function
-      | Cic.Prod( _, src, Cic.Prod (n,t1,t2)) -> aux (Cic.Prod(n,t1,t2))   
-      | Cic.Prod( _, src, tgt) -> src, tgt
-      | _ -> assert false
-    in  
-    aux ty
-  in
-  let ty_src,ty_tgt = extract_last_two_p coer_ty in
-  let context = [] in 
-  let src_uri = CoercDb.coerc_carr_of_term (CicReduction.whd context ty_src) in
-  let tgt_uri = CoercDb.coerc_carr_of_term (CicReduction.whd context ty_tgt) in
-  let new_coercions =
-    CoercGraph.close_coercion_graph src_uri tgt_uri coer_uri in
-  let status =
-   List.fold_left (fun s (uri,o,_) -> 
-      let status = MatitaSync.add_obj uri o status in
-      {status with coercions = uri :: status.coercions})
-    status new_coercions in
-  let status = {status with coercions = coer_uri :: status.coercions} in
-  let statement_of name =
-    GrafiteAst.Coercion (DisambiguateTypes.dummy_floc, 
-      (CicNotationPt.Ident (name, None)))
-  in
-  let moo_content = 
-    statement_of (UriManager.name_of_uri coer_uri) ::
-    (List.map 
-      (fun (uri, _, _) -> 
-        statement_of (UriManager.name_of_uri uri))
-    new_coercions)
-  in
-  let status = add_moo_content moo_content status in
-  { status with proof_status = No_proof }
+let eval_coercion status ~add_composites coercion =
+ let uri = CicUtil.uri_of_term coercion in
+ let status = MatitaSync.add_coercion status ~add_composites uri in
+  {status with proof_status = No_proof}
 
 (* to avoid a long list of recursive functions *)
 let eval_from_moo_ref = ref (fun _ _ _ -> assert false);;
@@ -674,10 +617,10 @@ let disambiguate_command status =
   | GrafiteAst.Render _
   | GrafiteAst.Set _ as cmd ->
       status,cmd
-  | GrafiteAst.Coercion (loc, term) ->
+  | GrafiteAst.Coercion (loc, term, add_composites) ->
       let status_ref = ref status in
       let term = disambiguate_term ~context:[] status_ref ~-1 term in
-      !status_ref, GrafiteAst.Coercion (loc,term)
+      !status_ref, GrafiteAst.Coercion (loc,term,add_composites)
   | GrafiteAst.Obj (loc,obj) ->
       let status,obj = disambiguate_obj status obj in
       status, GrafiteAst.Obj (loc,obj)
@@ -757,7 +700,8 @@ let eval_command opts status cmd =
       let name = UriManager.name_of_uri uri in
       let obj = Cic.Constant (name,Some bo,ty,[],[]) in
       MatitaSync.add_obj uri obj {status with proof_status = No_proof}
-  | GrafiteAst.Coercion (loc, coercion) -> eval_coercion status coercion
+  | GrafiteAst.Coercion (loc, coercion, add_composites) ->
+     eval_coercion status ~add_composites coercion
   | GrafiteAst.Alias (loc, spec) -> 
      let diff =
       (*CSC: Warning: this code should be factorized with the corresponding
index 66e3528bf9da3351cfe1f7cd81c80e5c8085d391..b06aedf30d7d5d4624af1a8a48c74169bd9bd94a 100644 (file)
@@ -124,7 +124,18 @@ let add_obj uri obj status =
 let add_obj =
  let profiler = HExtlib.profile "add_obj" in
   fun uri obj status -> profiler.HExtlib.profile (add_obj uri obj) status
-   
+
+let add_coercion status ~add_composites uri =
+ let basedir = Helm_registry.get "matita.basedir" in
+ let lemmas = CoercGraph.add_coercion ~basedir ~add_composites uri in
+ let status = {status with coercions = uri :: status.coercions} in
+ let statement_of name =
+   GrafiteAst.Coercion (DisambiguateTypes.dummy_floc,
+     (CicNotationPt.Ident (name, None)), false) in
+ let moo_content = [statement_of (UriManager.name_of_uri uri)] in
+ let status = MatitaTypes.add_moo_content moo_content status in
+  List.fold_left add_alias_for_constant status lemmas
 module OrderedUri =
 struct
   type t = UriManager.uri * string
index 1a2d8445ce60253dca69eb04d5d75189607aea9e..13023a8543937bea6b3756a28c09a8006c6482e9 100644 (file)
@@ -27,6 +27,10 @@ val add_obj:
   UriManager.uri -> Cic.obj -> 
     MatitaTypes.status -> MatitaTypes.status
 
+val add_coercion:
+ MatitaTypes.status -> add_composites:bool -> UriManager.uri ->
+  MatitaTypes.status
+
 val time_travel: 
   present:MatitaTypes.status -> past:MatitaTypes.status -> unit