let expand_and_validate_file ?(options = default_options) (path : string) : unit =
let exp_items : t_itm list = ITM_main.expand_file path in
let map (item : t_itm) : string =
match item with
|Prf prf -> (
match validate_prf ~options:options prf with
|Some valid_prf ->
let premises : t_fml list = premises_of_prf [] valid_prf in
let conclusion : t_fml = conclusion_of_prf valid_prf in
let premises_string : string = string_of_premises premises in
let conclusion_string : string = string_of_fml conclusion in
let proves_string : string = String.concat " " [premises_string; turnstile_of_options options; conclusion_string] in
let report_string : string = String.concat "" [
"\n"; "# Proof is VALID";qualification_of_options options;"."; "\n";
"# PROVES "; proves_string; ".\n";
]
in
String.concat "\n" [ITM_main.string_of_item (Prf valid_prf);report_string]
|None ->
let premises : t_fml list = premises_of_prf [] prf in
let conclusion : t_fml = conclusion_of_prf prf in
let premises_string : string = string_of_premises premises in
let conclusion_string : string = string_of_fml conclusion in
let proves_string : string = String.concat " " [premises_string; turnstile_of_options options; conclusion_string] in
let report_string : string = String.concat "" [
"\n"; "# Proof is NOT valid";qualification_of_options options;".";"\n";
"# Does NOT prove "; proves_string; ".\n";
]
in
String.concat "\n" [ITM_main.string_of_item (Prf prf);report_string]
)
|Def_prf (p, prf) -> (
match validate_prf ~options:options prf with
|Some valid_prf ->
let premises : t_fml list = premises_of_prf [] valid_prf in
let conclusion : t_fml = conclusion_of_prf valid_prf in
let premises_string : string = string_of_premises premises in
let conclusion_string : string = string_of_fml conclusion in
let proves_string : string = String.concat " " [premises_string; turnstile_of_options options; conclusion_string] in
let report_string : string = String.concat "" [
"\n"; "# ";string_of_prf p;" is VALID";qualification_of_options options;"."; "\n";
"# PROVES "; proves_string; ".\n";
]
in
String.concat "\n" [ITM_main.string_of_item (Def_prf (p,valid_prf));report_string]
|None ->
let premises : t_fml list = premises_of_prf [] prf in
let conclusion : t_fml = conclusion_of_prf prf in
let premises_string : string = string_of_premises premises in
let conclusion_string : string = string_of_fml conclusion in
let proves_string : string = String.concat " " [premises_string; turnstile_of_options options; conclusion_string] in
let report_string : string = String.concat "" [
"\n"; "# ";string_of_prf p;" is NOT valid";qualification_of_options options;".";"\n";
"# Does NOT prove "; proves_string; ".\n";
]
in
String.concat "\n" [ITM_main.string_of_item (Def_prf (p, prf));report_string]
)
|Def_fml _ | Comment _ -> ITM_main.string_of_item item
in IO.print_to_stdout (String.concat "\n\n" (List.map map exp_items))