(* main functions ***********************************************************)
type status = {
+ dn: string -> string; (* name discharge map *)
du: UM.uri -> UM.uri; (* uri discharge map *)
c : C.context; (* var context of this object *)
ls: (UM.uri, UM.uri list) Hashtbl.t; (* var lists of subobjects *)
let s = List.map (mk_arg s) args in
C.Appl (C.MutConstruct (st.du u, m, n, []) :: discharge_nsubst st s)
| C.Var (u, s) ->
+(* FG: We do not discharge the nsubst here ?? *)
let args = get_args st u in
if args = [] then C.Rel (discharge st u) else
let s = List.map (mk_arg s) args in
- C.Appl (C.Rel (discharge st u) :: discharge_nsubst st s)
+ (* C.Appl ( *) C.Rel (discharge st u) (* :: discharge_nsubst st s) *)
| C.Meta (i, s) ->
let s' = list_map_sh (discharge_usubst st) s in
if s' == s then t else C.Meta (i, s')
let discharge_con st con =
let b, v = con in
let v' = discharge_term st v in
- if v' == v && st.rl = [] then con else b, close true st (sh v v')
+ if v' == v && st.rl = [] then con else st.dn b, close true st (sh v v')
let discharge_type st ind_type =
let b, ind, w, cons = ind_type in
let w', cons' = discharge_term st w, list_map_sh (discharge_con st) cons in
if w' == w && cons' == cons && st.rl = [] then ind_type else
let w'' = close true st (sh w w') in
- b, ind, w'', sh cons cons'
+ st.dn b, ind, w'', sh cons cons'
-let rec discharge_object du obj =
+let rec discharge_object dn du obj =
let ls = Hashtbl.create hashtbl_size in match obj with
| C.Variable (b, None, w, vars, attrs) ->
- let st = init_status du ls vars in
+ let st = init_status dn du ls vars in
let w' = discharge_term st w in
if w' = w && vars = [] then obj else
- let w'' = close true st (sh w w') in
- C.Variable (b, None, w'', [], attrs)
+ let w'' = sh w w' in
+ C.Variable (dn b, None, w'', [], attrs)
| C.Variable (b, Some v, w, vars, attrs) ->
- let st = init_status du ls vars in
+ let st = init_status dn du ls vars in
let w', v' = discharge_term st w, discharge_term st v in
if w' = w && v' = v && vars = [] then obj else
- let w'', v'' = close true st (sh w w'), close false st (sh v v') in
- C.Variable (b, Some v'', w'', [], attrs)
+ let w'', v'' = sh w w', sh v v' in
+ C.Variable (dn b, Some v'', w'', [], attrs)
| C.Constant (b, None, w, vars, attrs) ->
- let st = init_status du ls vars in
+ let st = init_status dn du ls vars in
let w' = discharge_term st w in
if w' = w && vars = [] then obj else
let w'' = close true st (sh w w') in
- C.Constant (b, None, w'', [], attrs)
+ C.Constant (dn b, None, w'', [], attrs)
| C.Constant (b, Some v, w, vars, attrs) ->
- let st = init_status du ls vars in
+ let st = init_status dn du ls vars in
let w', v' = discharge_term st w, discharge_term st v in
if w' = w && v' = v && vars = [] then obj else
let w'', v'' = close true st (sh w w'), close false st (sh v v') in
- C.Constant (b, Some v'', w'', [], attrs)
+ C.Constant (dn b, Some v'', w'', [], attrs)
| C.InductiveDefinition (types, vars, lpsno, attrs) ->
- let st = init_status du ls vars in
+ let st = init_status dn du ls vars in
let types' = list_map_sh (discharge_type st) types in
if types' == types && vars = [] then obj else
let lpsno' = lpsno + List.length vars in
| C.CurrentProof _ ->
HLog.warn not_implemented; obj
-and discharge_uri du uri =
+and discharge_uri dn du uri =
let obj, _ = E.get_obj Un.default_ugraph uri in
- let obj' = discharge_object du obj in
+ prerr_endline ("Plain : " ^ CicPp.ppobj obj);
+ let obj' = discharge_object dn du obj in
+ prerr_endline ("Discharged: " ^ CicPp.ppobj obj');
obj', obj' == obj
-and discharge_vars du vars =
+and discharge_vars dn du vars =
+(* We should check that the dependences are ordered telesopically *)
let map u =
- match discharge_uri du u with
+ match discharge_uri dn du u with
| C.Variable (b, None, w, _, _), _ -> Some (C.Name b, C.Decl w)
| C.Variable (b, Some v, w, _, _), _ -> Some (C.Name b, C.Def (v, w))
| _ -> None
in
List.rev_map map vars
-and init_status du ls vars =
- let c, rl = discharge_vars du vars, List.rev vars in
- {du = du; c = c; ls = ls; rl = rl; h = 1}
+and init_status dn du ls vars =
+ let c, rl = discharge_vars dn du vars, List.rev vars in
+ {dn = dn; du = du; c = c; ls = ls; rl = rl; h = 1}
let _, s = List.fold_left replacement (false, s) replacements in
UM.uri_of_string s
+let discharge_name s = s ^ "_discharged"
+
let txt_of_inline_uri ~map_unicode_to_tex style ?flavour prefix suri =
let print_exc = function
| ProofEngineHelpers.Bad_pattern s as e ->
in
let dbd = LibraryDb.instance () in
let sorted_uris = MetadataDeps.sorted_uris_of_baseuri ~dbd suri in
+ let error uri e =
+ let msg =
+ Printf.sprintf
+ "ERROR IN THE GENERATION OF %s\nEXCEPTION: %s"
+ (UM.string_of_uri uri) e
+ in
+ Printf.eprintf "%s\n" msg;
+ GrafiteTypes.command_error msg
+ in
let map uri =
try
(* FG: for now the explicit variables must be discharged *)
let do_it obj = txt_of_cic_object ~map_unicode_to_tex 78 style ?flavour prefix obj in
- let obj, real = Ds.discharge_uri (discharge_uri style) uri in
+ let obj, real =
+ Ds.discharge_uri discharge_name (discharge_uri style) uri
+ in
if real then do_it obj else
let newuri = discharge_uri style uri in
let _lemmas = LS.add_obj GE.refinement_toolkit newuri obj in
do_it obj
with
- | e ->
- let msg =
- Printf.sprintf
- "ERROR IN THE GENERATION OF %s\nEXCEPTION: %s"
- (UM.string_of_uri uri) (print_exc e)
- in
- Printf.eprintf "%s\n" msg;
- GrafiteTypes.command_error msg
+ | TC.TypeCheckerFailure s ->
+ error uri ("failure : " ^ Lazy.force s)
+ | TC.AssertFailure s ->
+ error uri ("assert : " ^ Lazy.force s)
+ | E.Object_not_found u ->
+ error uri ("not found: " ^ UM.string_of_uri u)
+ | e -> error uri (print_exc e)
in
String.concat "" (List.map map sorted_uris)