+ get_name_context_context_and_subst :=
+ (function () ->
+ let i = ref 0 in
+ List.fold_left2
+ (fun (namecontext,context,subst) name (ty,_) ->
+ let res =
+ (Some (Cic.Name name))::namecontext,
+ (Some (Cic.Name name, Cic.Decl ty))::context,
+ (Cic.MutInd (uri,!i,[]))::subst
+ in
+ incr i ; res
+ ) ([],[],[]) names types_and_cons) ;
+ let types_and_cons' =
+ List.map2
+ (fun name (ty,cons) -> (name, !inductive, ty, phase3 name cons))
+ names types_and_cons
+ in
+ get_types_and_cons := (function () -> types_and_cons') ;
+ chosen := true ;
+ window#destroy ()
+ with
+ e ->
+ output_html outputhtml
+ ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>") ;
+ ))
+ (* Third phase *)
+ and phase3 name cons =
+ let get_cons_types = ref (function () -> assert false) in
+ let window2 =
+ GWindow.window
+ ~width:600 ~modal:true ~position:`CENTER
+ ~title:(name ^ " Constructors")
+ ~border_width:2 () in
+ let vbox = GPack.vbox ~packing:window2#add () in
+ let cons_type_widgets =
+ List.map
+ (function consname ->
+ let hbox =
+ GPack.hbox ~border_width:0
+ ~packing:(vbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let _ =
+ GMisc.label ~text:("Enter the type of " ^ consname ^ ":")
+ ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let scrolled_window =
+ GBin.scrolled_window ~border_width:5
+ ~packing:(vbox#pack ~expand:true ~padding:0) () in
+ let newinputt =
+ new term_editor ~width:400 ~height:20 ~packing:scrolled_window#add ()
+ ~isnotempty_callback:
+ (function b ->
+ (* (*non_empty_type := b ;*)
+ okb#misc#set_sensitive true) (*(b && uri_entry#text <> ""))*) *)())
+ in
+ newinputt
+ ) cons in
+ let hboxn =
+ GPack.hbox ~border_width:0
+ ~packing:(vbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let okb =
+ GButton.button ~label:"> Next"
+ ~packing:(hboxn#pack ~expand:false ~fill:false ~padding:5) () in
+ let _ = okb#misc#set_sensitive true in
+ let cancelb =
+ GButton.button ~label:"Abort"
+ ~packing:(hboxn#pack ~expand:false ~fill:false ~padding:5) () in
+ ignore (window2#connect#destroy GMain.Main.quit) ;
+ ignore (cancelb#connect#clicked window2#destroy) ;
+ ignore
+ (okb#connect#clicked
+ (function () ->
+ try
+ chosen := true ;
+ let namecontext,context,subst= !get_name_context_context_and_subst () in
+ let cons_types =
+ List.map2
+ (fun name inputt ->
+ let dom,mk_metasenv_and_expr =
+ inputt#get_term ~context:namecontext ~metasenv:[]
+ in
+ let metasenv,expr =
+ disambiguate_input context [] dom mk_metasenv_and_expr
+ in
+ match metasenv with
+ [] ->
+ let undebrujined_expr =
+ List.fold_left
+ (fun expr t -> CicSubstitution.subst t expr) expr subst
+ in
+ name, undebrujined_expr
+ | _ -> raise AmbiguousInput
+ ) cons cons_type_widgets
+ in
+ get_cons_types := (function () -> cons_types) ;
+ window2#destroy ()
+ with
+ e ->
+ output_html outputhtml
+ ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>") ;
+ )) ;
+ window2#show () ;
+ GMain.Main.main () ;
+ let okb_pressed = !chosen in
+ chosen := false ;
+ if (not okb_pressed) then
+ begin
+ window#destroy () ;
+ assert false (* The control never reaches this point *)
+ end
+ else
+ (!get_cons_types ())
+ in
+ phase1 () ;
+ (* No more phases left or Abort pressed *)
+ window#show () ;
+ GMain.Main.main () ;
+ window#destroy () ;
+ if !chosen then
+ try
+ let uri = !get_uri () in
+(*CSC: Da finire *)
+ let params = [] in
+ let tys = !get_types_and_cons () in
+ let obj = Cic.InductiveDefinition tys params !paramsno in
+ begin
+ try
+ prerr_endline (CicPp.ppobj obj) ;
+ CicTypeChecker.typecheck_mutual_inductive_defs uri
+ (tys,params,!paramsno) ;
+ with
+ e ->
+ prerr_endline "Offending mutual (co)inductive type declaration:" ;
+ prerr_endline (CicPp.ppobj obj) ;
+ end ;
+ (* We already know that obj is well-typed. We need to add it to the *)
+ (* environment in order to compute the inner-types without having to *)
+ (* debrujin it or having to modify lots of other functions to avoid *)
+ (* asking the environment for the MUTINDs we are defining now. *)
+ CicEnvironment.put_inductive_definition uri obj ;
+ save_obj uri obj ;
+ show_in_show_window_obj uri obj
+ with
+ e ->
+ output_html outputhtml
+ ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>") ;
+;;
+
+let new_proof () =
+ let inputt = ((rendering_window ())#inputt : term_editor) in
+ let outputhtml = ((rendering_window ())#outputhtml : GHtml.xmhtml) in
+ let output = ((rendering_window ())#output : GMathView.math_view) in
+ let notebook = (rendering_window ())#notebook in
+
+ let chosen = ref false in
+ let get_parsed = ref (function _ -> assert false) in
+ let get_uri = ref (function _ -> assert false) in
+ let non_empty_type = ref false in
+ let window =
+ GWindow.window
+ ~width:600 ~modal:true ~title:"New Proof or Definition"
+ ~border_width:2 () in
+ let vbox = GPack.vbox ~packing:window#add () in
+ let hbox =
+ GPack.hbox ~border_width:0
+ ~packing:(vbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let _ =
+ GMisc.label ~text:"Enter the URI for the new theorem or definition:"
+ ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let uri_entry =
+ GEdit.entry ~editable:true
+ ~packing:(hbox#pack ~expand:true ~fill:true ~padding:5) () in
+ let hbox1 =
+ GPack.hbox ~border_width:0
+ ~packing:(vbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let _ =
+ GMisc.label ~text:"Enter the theorem or definition type:"
+ ~packing:(hbox1#pack ~expand:false ~fill:false ~padding:5) () in
+ let scrolled_window =
+ GBin.scrolled_window ~border_width:5
+ ~packing:(vbox#pack ~expand:true ~padding:0) () in
+ (* the content of the scrolled_window is moved below (see comment) *)
+ let hbox =
+ GPack.hbox ~border_width:0
+ ~packing:(vbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let okb =
+ GButton.button ~label:"Ok"
+ ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
+ let _ = okb#misc#set_sensitive false in
+ let cancelb =
+ GButton.button ~label:"Cancel"
+ ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
+ (* moved here to have visibility of the ok button *)
+ let newinputt =
+ new term_editor ~width:400 ~height:100 ~packing:scrolled_window#add ()
+ ~isnotempty_callback:
+ (function b ->
+ non_empty_type := b ;
+ okb#misc#set_sensitive (b && uri_entry#text <> ""))
+ in
+ let _ =
+ newinputt#set_term inputt#get_as_string ;
+ inputt#reset in
+ let _ =
+ uri_entry#connect#changed
+ (function () ->
+ okb#misc#set_sensitive (!non_empty_type && uri_entry#text <> ""))
+ in
+ ignore (window#connect#destroy GMain.Main.quit) ;
+ ignore (cancelb#connect#clicked window#destroy) ;
+ ignore
+ (okb#connect#clicked
+ (function () ->
+ chosen := true ;
+ try
+ let parsed = newinputt#get_term [] [] in
+ let uristr = "cic:" ^ uri_entry#text in
+ let uri = UriManager.uri_of_string uristr in
+ if String.sub uristr (String.length uristr - 4) 4 <> ".con" then
+ raise NotAUriToAConstant
+ else
+ begin
+ try
+ ignore (Getter.resolve uri) ;
+ raise UriAlreadyInUse
+ with
+ Getter.Unresolved ->
+ get_parsed := (function () -> parsed) ;
+ get_uri := (function () -> uri) ;
+ window#destroy ()
+ end
+ with
+ e ->