X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fcomponents%2Fcontent_pres%2FtermContentPres.ml;h=68cc4ccbb391e913a21b5fac7ca99419ae781c2d;hb=f9abd21eb0d26cf9b632af4df819225be4d091e3;hp=a8bfe114746f5c9d79968d7c96141de6d8f27646;hpb=407ff2f7c09ddd90eae6f390006ffe801b683164;p=helm.git diff --git a/helm/software/components/content_pres/termContentPres.ml b/helm/software/components/content_pres/termContentPres.ml index a8bfe1147..68cc4ccbb 100644 --- a/helm/software/components/content_pres/termContentPres.ml +++ b/helm/software/components/content_pres/termContentPres.ml @@ -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"; + keyword "let"; space; hvbox false true [ - aux_var var; builtin_symbol "\\def"; break; top_pos (k s) ]; - break; 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 [] + +