let mk_exists ooch noch c v =
let description = "multiple existental quantifier" in
let prec = "non associative with precedence 20\n" in
- let name s =
+ let name s =
if v = 1 then P.sprintf "%s%u" s c else P.sprintf "%s%u_%u" s c v
in
let o_name = name "ex" in
if v = 1 then "'Ex" else P.sprintf "'Ex%u" v
in
let set n = P.sprintf "A%u" (v - n) in
- let set_list = string_iter "," set v in
+ let set_list = string_iter "," set v in
let set_type = string_iter "→" set v in
-
+
let ele n = P.sprintf "x%u" (v - n) in
let ele_list = string_iter "," ele v in
let ele_seq = string_iter " " ele v in
-
- let pre n = P.sprintf "P%u" (c - n) in
+
+ let pre n = P.sprintf "P%u" (c - n) in
let pre_list = string_iter "," pre c in
- let pre_seq = string_iter " " pre c in
- let pre_appl n = P.sprintf "%s %s" (pre n) ele_seq in
+ let pre_seq = string_iter " " pre c in
+ let pre_appl n = P.sprintf "%s %s" (pre n) ele_seq in
let pre_type = string_iter " → " pre_appl c in
let qm n = "?" in
- let qm_set = string_iter " " qm v in
- let qm_pre = string_iter " " qm c in
+ let qm_set = string_iter " " qm v in
+ let qm_pre = string_iter " " qm c in
let id n = P.sprintf "ident x%u" (v - n) in
- let id_list = string_iter " , " id v in
+ let id_list = string_iter " , " id v in
let term n = P.sprintf "term 19 P%u" (c - n) in
- let term_conj = string_iter " break & " term c in
+ let term_conj = string_iter " break & " term c in
let abst b n = let xty = if b then P.sprintf ":$T%u" (v - n) else "" in
P.sprintf "λ${ident x%u}%s" (v - n) xty in
- let abst_clo b = string_iter "." (abst b) v in
+ let abst_clo b = string_iter "." (abst b) v in
- let full b n = P.sprintf "(%s.$P%u)" (abst_clo b) (c - n) in
+ let full b n = P.sprintf "(%s.$P%u)" (abst_clo b) (c - n) in
let full_seq b = string_iter " " (full b) c in
P.fprintf ooch "(* %s (%u, %u) *)\n\n" description c v;
- P.fprintf ooch "inductive %s (%s:Type[0]) (%s:%s→Prop) : Prop ≝\n"
+ P.fprintf ooch "inductive %s (%s:Type[0]) (%s:%s→Prop) : Prop ≝\n"
o_name set_list pre_list set_type;
P.fprintf ooch " | %s_intro: ∀%s. %s → %s %s %s\n.\n\n"
o_name ele_list pre_type o_name qm_set qm_pre;
let o_name = name "or" in
let i_name = "'Or" in
- let pre n = P.sprintf "P%u" (c - n) in
+ let pre n = P.sprintf "P%u" (c - n) in
let pre_list = string_iter "," pre c in
- let pre_seq = string_iter " " pre c in
+ let pre_seq = string_iter " " pre c in
let qm n = "?" in
- let qm_pre = string_iter " " qm c in
+ let qm_pre = string_iter " " qm c in
let term n = P.sprintf "term 29 P%u" (c - n) in
- let term_disj = string_iter " break | " term c in
+ let term_disj = string_iter " break | " term c in
- let par n = P.sprintf "$P%u" (c - n) in
+ let par n = P.sprintf "$P%u" (c - n) in
let par_seq = string_iter " " par c in
let mk_con n = P.fprintf ooch " | %s_intro%u: %s → %s %s\n"
P.fprintf ooch "(* %s (%u) *)\n\n" description c;
- P.fprintf ooch "inductive %s (%s:Prop) : Prop ≝\n"
+ P.fprintf ooch "inductive %s (%s:Prop) : Prop ≝\n"
o_name pre_list;
void_iter mk_con c;
P.fprintf ooch ".\n\n";
let o_name = name "and" in
let i_name = "'And" in
- let pre n = P.sprintf "P%u" (c - n) in
+ let pre n = P.sprintf "P%u" (c - n) in
let pre_list = string_iter "," pre c in
- let pre_type = string_iter " → " pre c in
- let pre_seq = string_iter " " pre c in
+ let pre_type = string_iter " → " pre c in
+ let pre_seq = string_iter " " pre c in
let qm n = "?" in
- let qm_pre = string_iter " " qm c in
+ let qm_pre = string_iter " " qm c in
let term n = P.sprintf "term 34 P%u" (c - n) in
- let term_conj = string_iter " break & " term c in
+ let term_conj = string_iter " break & " term c in
- let par n = P.sprintf "$P%u" (c - n) in
+ let par n = P.sprintf "$P%u" (c - n) in
let par_seq = string_iter " " par c in
P.fprintf ooch "(* %s (%u) *)\n\n" description c;
- P.fprintf ooch "inductive %s (%s:Prop) : Prop ≝\n"
+ P.fprintf ooch "inductive %s (%s:Prop) : Prop ≝\n"
o_name pre_list;
P.fprintf ooch " | %s_intro: %s → %s %s\n.\n\n"
o_name pre_type o_name qm_pre;
\ / This software is distributed as is, NO WARRANTY.
V_______________________________________________________________ *)
-module F = Filename
+module F = Filename
+module K = Sys
-module R = Helm_registry
+module R = Helm_registry
let template = "matita.ma.templ"
let stars = String.make (30 - String.length myself) '*' in
Printf.fprintf och "(* This file was generated by %s: do not edit %s*)\n\n" myself stars
+let exists_out name =
+ let path = [
+ R.get_string "xoa.output_dir";
+ name
+ ] in
+ let name = List.fold_left F.concat "" path in
+ K.file_exists (name ^ ".ma")
+
let open_out preamble name =
let path = [
- R.get_string "xoa.output_dir";
+ R.get_string "xoa.output_dir";
name
] in
- let name = List.fold_left F.concat "" path in
+ let name = List.fold_left F.concat "" path in
let och = open_out (name ^ ".ma") in
copy_preamble preamble och; print_comment och;
och
module A = Ast
module E = Engine
+let incremental = ref true
let separate = ref false
let clear () =
+ incremental := true;
separate := false;
R.clear ()
| A.Exists (c, v) as d ->
let oname = Printf.sprintf "%s/ex_%u_%u" o c v in
let nname = Printf.sprintf "%s/ex_%u_%u" n c v in
- let ooch = L.open_out p oname in
- let noch = L.open_out p nname in
- List.iter (L.out_include ooch) (R.get_list R.string "xoa.include");
- L.out_include ooch (nname ^ ".ma");
- E.generate ooch noch d;
- close_out noch; close_out ooch
+ if !incremental && L.exists_out oname && L.exists_out nname then () else
+ begin
+ let ooch = L.open_out p oname in
+ let noch = L.open_out p nname in
+ List.iter (L.out_include ooch) (R.get_list R.string "xoa.include");
+ L.out_include ooch (nname ^ ".ma");
+ E.generate ooch noch d;
+ close_out noch; close_out ooch
+ end
| A.Or c -> ()
| A.And c -> ()
let help = "Usage: xoa [ -Xs | <configuration file> ]*\n" in
let help_X = " Clear configuration" in
let help_s = " Generate separate objects" in
+ let help_u = " Update existing separate files" in
Arg.parse [
"-X", Arg.Unit clear, help_X;
"-s", Arg.Set separate, help_s;
+ "-u", Arg.Clear incremental, help_u;
] process help