]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/components/content_pres/termContentPres.ml
parameter sintax added to axiom statement
[helm.git] / helm / software / components / content_pres / termContentPres.ml
index 6b3dcc297689783fbe1a99459cc287764c5d0511..68cc4ccbb391e913a21b5fac7ca99419ae781c2d 100644 (file)
@@ -42,18 +42,9 @@ let resolve_binder = function
   | `Forall -> "\\forall"
   | `Exists -> "\\exists"
 
-let add_level_info prec assoc t = Ast.AttributedTerm (`Level (prec, assoc), t)
-let add_pos_info pos t = Ast.AttributedTerm (`ChildPos pos, t)
-let left_pos = add_pos_info `Left
-let right_pos = add_pos_info `Right
-let inner_pos = add_pos_info `Inner
-
-let rec top_pos t = add_level_info ~-1 Gramext.NonA (inner_pos t)
-(*   function
-  | Ast.AttributedTerm (`Level _, t) ->
-      add_level_info ~-1 Gramext.NonA (inner_pos t)
-  | Ast.AttributedTerm (attr, t) -> Ast.AttributedTerm (attr, top_pos t)
-  | t -> add_level_info ~-1 Gramext.NonA (inner_pos t) *)
+let add_level_info prec t = Ast.AttributedTerm (`Level prec, t)
+
+let rec top_pos t = add_level_info ~-1 t
 
 let rec remove_level_info =
   function
@@ -97,33 +88,47 @@ let binder_symbol s =
   add_xml_attrs (RenderingAttrs.builtin_symbol_attributes `MathML)
     (builtin_symbol s)
 
-let string_of_sort_kind = function
-  | `Prop -> "Prop"
-  | `Set -> "Set"
-  | `CProp -> "CProp"
-  | `Type _ -> "Type"
+let xml_of_sort x = 
+  let to_string x = Ast.Ident (x, None) in
+  let identify x = 
+    add_xml_attrs (RenderingAttrs.keyword_attributes `MathML) (to_string x)
+  in
+  let lvl t = Ast.AttributedTerm (`Level 90,t) in
+  match x with
+  | `Prop -> identify "Prop"
+  | `Set -> identify "Set"
+  | `CProp _ -> identify "CProp"
+  | `Type _ -> identify "Type"
+  | `NType s -> lvl(Ast.Layout (Ast.Sub (identify "Type",to_string s)))
+  | `NCProp s -> lvl(Ast.Layout (Ast.Sub (identify "CProp",to_string s)))
+;;
+
+
+let map_space f l =
+ HExtlib.list_concat
+  ~sep:[space] (List.map (fun x -> [f x]) l)
+;;
 
 let pp_ast0 t k =
   let rec aux =
     function
     | Ast.Appl ts ->
-        let rec aux_args pos =
+        let rec aux_args level =
           function
           | [] -> []
           | [ last ] ->
-              let last = k last in
-              if pos = `Left then [ left_pos last ] else [ right_pos last ]
+              [ Ast.AttributedTerm (`Level level,k last) ]
           | hd :: tl ->
-              (add_pos_info pos (k hd)) :: aux_args `Inner tl
+              (Ast.AttributedTerm (`Level level, k hd)) :: aux_args 71 tl
         in
-        add_level_info Ast.apply_prec Ast.apply_assoc
-          (hovbox true true (CicNotationUtil.dress break (aux_args `Left ts)))
+        add_level_info Ast.apply_prec 
+          (hovbox true true (CicNotationUtil.dress break (aux_args 70 ts)))
     | Ast.Binder (binder_kind, (id, ty), body) ->
-        add_level_info Ast.binder_prec Ast.binder_assoc
+        add_level_info Ast.binder_prec
           (hvbox false true
             [ binder_symbol (resolve_binder binder_kind);
               k id; builtin_symbol ":"; aux_ty ty; break;
-              builtin_symbol "."; right_pos (k body) ])
+              builtin_symbol "."; k body ])
     | Ast.Case (what, indty_opt, outty_opt, patterns) ->
         let outty_box =
           match outty_opt with
@@ -151,16 +156,19 @@ let pp_ast0 t k =
            space
          ]
         in
-        let mk_case_pattern (head, href, vars) =
-          hbox true false (ident_w_href href head :: List.map aux_var vars)
+        let mk_case_pattern =
+         function
+            Ast.Pattern (head, href, vars) ->
+             hvbox true true (ident_w_href href head :: 
+               List.flatten (List.map (fun x -> [break;x]) (map_space aux_var vars)))
+          | Ast.Wildcard -> builtin_symbol "_"
         in
         let patterns' =
           List.map
             (fun (lhs, rhs) ->
               remove_level_info
-                (hvbox false true [
-                  hbox false true [
-                    mk_case_pattern lhs; builtin_symbol "\\Rightarrow" ];
+                (hovbox false true [ 
+                  mk_case_pattern lhs; break; builtin_symbol "\\Rightarrow"; 
                   break; top_pos (k rhs) ]))
             patterns
         in
@@ -186,44 +194,49 @@ let pp_ast0 t k =
               hbox false false [ builtin_symbol "["; hd ]
               :: aux_patterns tl
         in
-        add_level_info Ast.simple_prec Ast.simple_assoc
+        add_level_info Ast.simple_prec
           (hvbox false false [
             hvbox false false ([match_box]); break;
             hbox false false [ hvbox false false patterns'' ] ])
     | Ast.Cast (bo, ty) ->
-        add_level_info Ast.simple_prec Ast.simple_assoc
+        add_level_info Ast.simple_prec
           (hvbox false true [
             builtin_symbol "("; top_pos (k bo); break; builtin_symbol ":";
             top_pos (k ty); builtin_symbol ")"])
     | Ast.LetIn (var, s, t) ->
-        add_level_info Ast.let_in_prec Ast.let_in_assoc
+        add_level_info Ast.let_in_prec 
           (hvbox false true [
             hvbox false true [
               keyword "let"; space;
               hvbox false true [
-                aux_var var; space; builtin_symbol "\\def"; break; top_pos (k s) ];
-              break; space; keyword "in" ];
+                aux_var var; space;
+                builtin_symbol "\\def"; break; top_pos (k s) ];
+              break; space; keyword "in"; space ];
             break;
             k t ])
     | Ast.LetRec (rec_kind, funs, where) ->
         let rec_op =
           match rec_kind with `Inductive -> "rec" | `CoInductive -> "corec"
         in
-        let mk_fun (args, (name,ty), body, _) =
-         List.map aux_var args ,k name, HExtlib.map_option k ty, k body in
+        let mk_fun (args, (name,ty), body, rec_param) =
+         List.flatten (List.map (fun x -> [aux_var x; space]) args),
+          k name, HExtlib.map_option k ty, k body, fst (List.nth args rec_param)
+        in
         let mk_funs = List.map mk_fun in
         let fst_fun, tl_funs =
           match mk_funs funs with hd :: tl -> hd, tl | [] -> assert false
         in
         let fst_row =
-          let (params, name, ty, body) = fst_fun in
+          let (params, name, ty, body, rec_param) = fst_fun in
           hvbox false true ([
             keyword "let";
             space;
             keyword rec_op;
             space;
-            name] @
+            name;
+            space] @
             params @
+            [keyword "on" ; space ; rec_param ;space ] @
             (match ty with None -> [] | Some ty -> [builtin_symbol ":"; ty]) @
             [ builtin_symbol "\\def";
             break;
@@ -231,23 +244,25 @@ let pp_ast0 t k =
         in
         let tl_rows =
           List.map
-            (fun (params, name, ty, body) ->
+            (fun (params, name, ty, body, rec_param) ->
               [ break;
                 hvbox false true ([
-                  keyword "and";
+                  keyword "and"; space;
                   name] @
                   params @
+                  [space; keyword "on" ; space; rec_param ;space ] @
                   (match ty with
                       None -> []
                     | Some ty -> [builtin_symbol ":"; ty]) @
                   [ builtin_symbol "\\def"; break; body ])])
             tl_funs
         in
-        add_level_info Ast.let_in_prec Ast.let_in_assoc
+        add_level_info Ast.let_in_prec
           ((hvbox false false
             (fst_row :: List.flatten tl_rows
              @ [ break; keyword "in"; break; k where ])))
-    | Ast.Implicit -> builtin_symbol "?"
+    | Ast.Implicit `JustOne -> builtin_symbol "?"
+    | Ast.Implicit `Vector -> builtin_symbol "…"
     | Ast.Meta (n, l) ->
         let local_context l =
             List.map (function None -> None | Some t -> Some (k t)) l
@@ -261,9 +276,7 @@ let pp_ast0 t k =
     | Ast.Literal _
     | Ast.UserInput as leaf -> leaf
     | t -> CicNotationUtil.visit_ast ~special_k k t
-  and aux_sort sort_kind =
-    add_xml_attrs (RenderingAttrs.keyword_attributes `MathML)
-      (Ast.Ident (string_of_sort_kind sort_kind, None))
+  and aux_sort sort_kind = xml_of_sort sort_kind
   and aux_ty = function
     | None -> builtin_symbol "?"
     | Some ty -> k ty
@@ -283,11 +296,32 @@ let pp_ast0 t k =
 
   (* persistent state *)
 
-let level1_patterns21 = Hashtbl.create 211
-
+let initial_level1_patterns21 () = Hashtbl.create 211
+let level1_patterns21 = ref (initial_level1_patterns21 ())
 let compiled21 = ref None
-
 let pattern21_matrix = ref []
+let counter = ref ~-1 
+
+let stack = ref [];;
+
+let push () =
+  stack := (!counter,!level1_patterns21,!compiled21,!pattern21_matrix)::!stack;
+  counter := ~-1;
+  level1_patterns21 := initial_level1_patterns21 ();
+  compiled21 := None;
+  pattern21_matrix := []
+;;
+
+let pop () =
+ match !stack with
+    [] -> assert false
+  | (ocounter,olevel1_patterns21,ocompiled21,opatterns21_matrix)::old ->
+     stack := old;
+     counter := ocounter;
+     level1_patterns21 := olevel1_patterns21;
+     compiled21 := ocompiled21;
+     pattern21_matrix := opatterns21_matrix
+;;
 
 let get_compiled21 () =
   match !compiled21 with
@@ -321,8 +355,18 @@ let instantiate21 idrefs env l1 =
         assert (CicNotationEnv.well_typed ty value); (* INVARIANT *)
         (* following assertion should be a conditional that makes this
          * instantiation fail *)
-        assert (CicNotationEnv.well_typed expected_ty value);
-        [ add_pos_info pos (CicNotationEnv.term_of_value value) ]
+        if not (CicNotationEnv.well_typed expected_ty value) then
+         begin
+          prerr_endline ("The variable " ^ name ^ " is used with the wrong type in the notation declaration");
+          assert false
+         end;
+        let value = CicNotationEnv.term_of_value value in
+        let value = 
+          match expected_ty with
+          | Env.TermType l -> Ast.AttributedTerm (`Level l,value) 
+          | _ -> value
+        in
+        [ value ]
     | Ast.Magic m -> subst_magic pos env m
     | Ast.Literal l as t ->
         let t = add_idrefs idrefs t in
@@ -342,7 +386,7 @@ let instantiate21 idrefs env l1 =
         let sep =
           match sep_opt with
             | None -> []
-            | Some l -> [ Ast.Literal l ]
+            | Some l -> [ Ast.Literal l; break; space ]
        in
         let rec instantiate_list acc = function
           | [] -> List.rev acc
@@ -355,7 +399,8 @@ let instantiate21 idrefs env l1 =
               let terms = subst pos env p in
               instantiate_list (CicNotationUtil.group (terms @ sep) :: acc) tl
         in
-        instantiate_list [] values
+        if values = [] then []
+        else [hovbox false false (instantiate_list [] values)]
     | Ast.Opt p ->
         let opt_decls = CicNotationEnv.declarations_of_term p in
         let env =
@@ -432,7 +477,7 @@ let rec pp_ast1 term =
           in
           let l1 =
             try
-              Hashtbl.find level1_patterns21 pid
+              Hashtbl.find !level1_patterns21 pid
             with Not_found -> assert false
           in
           instantiate21 idrefs (ast_env_of_env env) l1)
@@ -462,23 +507,22 @@ let fill_pos_info l1_pattern = l1_pattern
   aux true l1_pattern *)
 
 let fresh_id =
-  let counter = ref ~-1 in
   fun () ->
     incr counter;
     !counter
 
-let add_pretty_printer ~precedence ~associativity l2 l1 =
+let add_pretty_printer l2 (CicNotationParser.CL1P (l1,precedence)) =
   let id = fresh_id () in
-  let l1' = add_level_info precedence associativity (fill_pos_info l1) in
+  let l1' = add_level_info precedence (fill_pos_info l1) in
   let l2' = CicNotationUtil.strip_attributes l2 in
-  Hashtbl.add level1_patterns21 id l1';
+  Hashtbl.add !level1_patterns21 id l1';
   pattern21_matrix := (l2', id) :: !pattern21_matrix;
   load_patterns21 !pattern21_matrix;
   id
 
 let remove_pretty_printer id =
   (try
-    Hashtbl.remove level1_patterns21 id;
+    Hashtbl.remove !level1_patterns21 id;
   with Not_found -> raise Pretty_printer_not_found);
   pattern21_matrix := List.filter (fun (_, id') -> id <> id') !pattern21_matrix;
   load_patterns21 !pattern21_matrix
@@ -503,6 +547,10 @@ let head_names names env =
         (match ty, v with
         | Env.ListType ty, Env.ListValue (v :: _) ->
             aux ((name, (ty, v)) :: acc) tl
+        | Env.TermType _, Env.TermValue _  ->
+            aux ((name, (ty, v)) :: acc) tl
+        | Env.OptType _, Env.OptValue _ ->
+            aux ((name, (ty, v)) :: acc) tl
         | _ -> assert false)
     | _ :: tl -> aux acc tl
       (* base pattern may contain only meta names, thus we trash all others *)
@@ -516,6 +564,10 @@ let tail_names names env =
         (match ty, v with
         | Env.ListType ty, Env.ListValue (_ :: vtl) ->
             aux ((name, (Env.ListType ty, Env.ListValue vtl)) :: acc) tl
+        | Env.TermType _, Env.TermValue _  ->
+            aux ((name, (ty, v)) :: acc) tl
+        | Env.OptType _, Env.OptValue _ ->
+            aux ((name, (ty, v)) :: acc) tl
         | _ -> assert false)
     | binding :: tl -> aux (binding :: acc) tl
     | [] -> acc
@@ -523,6 +575,7 @@ let tail_names names env =
   aux [] env
 
 let instantiate_level2 env term =
+(*   prerr_endline ("istanzio: " ^ CicNotationPp.pp_term term); *)
   let fresh_env = ref [] in
   let lookup_fresh_name n =
     try
@@ -533,17 +586,17 @@ let instantiate_level2 env term =
       new_name
   in
   let rec aux env term =
-(*     prerr_endline ("ENV " ^ CicNotationPp.pp_env env); *)
+(*    prerr_endline ("ENV " ^ CicNotationPp.pp_env env); *)
     match term with
-    | Ast.AttributedTerm (_, term) -> aux env term
+    | Ast.AttributedTerm (a, term) -> (*Ast.AttributedTerm (a, *)aux env term
     | Ast.Appl terms -> Ast.Appl (List.map (aux env) terms)
     | Ast.Binder (binder, var, body) ->
         Ast.Binder (binder, aux_capture_var env var, aux env body)
     | Ast.Case (term, indty, outty_opt, patterns) ->
         Ast.Case (aux env term, indty, aux_opt env outty_opt,
           List.map (aux_branch env) patterns)
-    | Ast.LetIn (var, t1, t2) ->
-        Ast.LetIn (aux_capture_var env var, aux env t1, aux env t2)
+    | Ast.LetIn (var, t1, t3) ->
+        Ast.LetIn (aux_capture_var env var, aux env t1, aux env t3)
     | Ast.LetRec (kind, definitions, body) ->
         Ast.LetRec (kind, List.map (aux_definition env) definitions,
           aux env body)
@@ -554,7 +607,7 @@ let instantiate_level2 env term =
         Ast.Ident (name, Some (aux_substs env substs))
     | Ast.Meta (index, substs) -> Ast.Meta (index, aux_meta_substs env substs)
 
-    | Ast.Implicit
+    | Ast.Implicit _
     | Ast.Ident _
     | Ast.Num _
     | Ast.Sort _
@@ -564,6 +617,8 @@ let instantiate_level2 env term =
     | Ast.Magic magic -> aux_magic env magic
     | Ast.Variable var -> aux_variable env var
 
+    | Ast.Cast (t, ty) -> Ast.Cast (aux env t, aux env ty)
+
     | _ -> assert false
   and aux_opt env = function
     | Some term -> Some (aux env term)
@@ -571,8 +626,11 @@ let instantiate_level2 env term =
   and aux_capture_var env (name, ty_opt) = (aux env name, aux_opt env ty_opt)
   and aux_branch env (pattern, term) =
     (aux_pattern env pattern, aux env term)
-  and aux_pattern env (head, hrefs, vars) =
-    (head, hrefs, List.map (aux_capture_var env) vars)
+  and aux_pattern env =
+   function
+      Ast.Pattern (head, hrefs, vars) ->
+       Ast.Pattern (head, hrefs, List.map (aux_capture_var env) vars)
+    | Ast.Wildcard -> Ast.Wildcard
   and aux_definition env (params, var, term, i) =
     (List.map (aux_capture_var env) params, aux_capture_var env var, aux env term, i)
   and aux_substs env substs =
@@ -581,7 +639,8 @@ let instantiate_level2 env term =
   and aux_variable env = function
     | Ast.NumVar name -> Ast.Num (Env.lookup_num env name, 0)
     | Ast.IdentVar name -> Ast.Ident (Env.lookup_string env name, None)
-    | Ast.TermVar name -> Env.lookup_term env name
+    | Ast.TermVar (name,(Ast.Level l|Ast.Self l)) -> 
+        Ast.AttributedTerm (`Level l,Env.lookup_term env name)
     | Ast.FreshVar name -> Ast.Ident (lookup_fresh_name name, None)
     | Ast.Ascription (term, name) -> assert false
   and aux_magic env = function
@@ -622,7 +681,7 @@ let instantiate_level2 env term =
               | Env.ListValue (_ :: _) ->
                   instantiate_fold_left 
                     (let acc_binding =
-                      acc_name, (Env.TermType, Env.TermValue acc)
+                      acc_name, (Env.TermType 0, Env.TermValue acc)
                      in
                      aux (acc_binding :: head_names names env') rec_pattern)
                     (tail_names names env')
@@ -644,7 +703,7 @@ let instantiate_level2 env term =
               | Env.ListValue (_ :: _) ->
                   let acc = instantiate_fold_right (tail_names names env') in
                   let acc_binding =
-                    acc_name, (Env.TermType, Env.TermValue acc)
+                    acc_name, (Env.TermType 0, Env.TermValue acc)
                   in
                   aux (acc_binding :: head_names names env') rec_pattern
               | Env.ListValue [] -> aux env base_pattern
@@ -662,3 +721,5 @@ let instantiate_level2 env term =
 
 let _ = load_patterns21 []
 
+
+