]> matita.cs.unibo.it Git - helm.git/blob - helm/gTopLevel/gTopLevel.ml
Conjectures and Hypotheses inside every conjecture and in the sequents now
[helm.git] / helm / gTopLevel / gTopLevel.ml
1 (* Copyright (C) 2000, HELM Team.
2  * 
3  * This file is part of HELM, an Hypertextual, Electronic
4  * Library of Mathematics, developed at the Computer Science
5  * Department, University of Bologna, Italy.
6  * 
7  * HELM is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  * 
12  * HELM is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with HELM; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
20  * MA  02111-1307, USA.
21  * 
22  * For details, see the HELM World-Wide-Web page,
23  * http://cs.unibo.it/helm/.
24  *)
25
26 (******************************************************************************)
27 (*                                                                            *)
28 (*                               PROJECT HELM                                 *)
29 (*                                                                            *)
30 (*                Claudio Sacerdoti Coen <sacerdot@cs.unibo.it>               *)
31 (*                                 06/01/2002                                 *)
32 (*                                                                            *)
33 (*                                                                            *)
34 (******************************************************************************)
35
36 (* GLOBAL CONSTANTS *)
37
38 let helmns = Gdome.domString "http://www.cs.unibo.it/helm";;
39
40 let htmlheader =
41  "<html>" ^
42  " <body bgColor=\"white\">"
43 ;;
44
45 let htmlfooter =
46  " </body>" ^
47  "</html>"
48 ;;
49
50 (* GLOBAL REFERENCES (USED BY CALLBACKS) *)
51
52 let htmlheader_and_content = ref htmlheader;;
53
54 let current_cic_infos = ref None;;
55 let current_goal_infos = ref None;;
56 let current_scratch_infos = ref None;;
57
58
59 (* MISC FUNCTIONS *)
60
61 let domImpl = Gdome.domImplementation ();;
62
63 let parseStyle name =
64  let style =
65   domImpl#createDocumentFromURI
66 (*
67    ~uri:("http://phd.cs.unibo.it:8081/getxslt?uri=" ^ name) ?mode:None
68 *)
69    ~uri:("styles/" ^ name) ()
70  in
71   Gdome_xslt.processStylesheet style
72 ;;
73
74 let d_c = parseStyle "drop_coercions.xsl";;
75 let tc1 = parseStyle "objtheorycontent.xsl";;
76 let hc2 = parseStyle "content_to_html.xsl";;
77 let l   = parseStyle "link.xsl";;
78
79 let c1 = parseStyle "rootcontent.xsl";;
80 let g  = parseStyle "genmmlid.xsl";;
81 let c2 = parseStyle "annotatedpres.xsl";;
82
83
84 let getterURL = Configuration.getter_url;;
85 let processorURL = Configuration.processor_url;;
86
87 let mml_styles = [d_c ; c1 ; g ; c2 ; l];;
88 let mml_args =
89  ["processorURL", "'" ^ processorURL ^ "'" ;
90   "getterURL", "'" ^ getterURL ^ "'" ;
91   "draw_graphURL", "'http%3A//phd.cs.unibo.it%3A8083/'" ;
92   "uri_set_queueURL", "'http%3A//phd.cs.unibo.it%3A8084/'" ;
93   "UNICODEvsSYMBOL", "'symbol'" ;
94   "doctype-public", "'-//W3C//DTD%20XHTML%201.0%20Transitional//EN'" ;
95   "encoding", "'iso-8859-1'" ;
96   "media-type", "'text/html'" ;
97   "keys", "'d_c%2CC1%2CG%2CC2%2CL'" ;
98   "interfaceURL", "'http%3A//phd.cs.unibo.it/helm/html/cic/index.html'" ;
99   "naturalLanguage", "'yes'" ;
100   "annotations", "'no'" ;
101   "explodeall", "'true()'" ;
102   "topurl", "'http://phd.cs.unibo.it/helm'" ;
103   "CICURI", "'cic:/Coq/Init/Datatypes/bool_ind.con'" ]
104 ;;
105
106 let sequent_styles = [d_c ; c1 ; g ; c2 ; l];;
107 let sequent_args =
108  ["processorURL", "'" ^ processorURL ^ "'" ;
109   "getterURL", "'" ^ getterURL ^ "'" ;
110   "draw_graphURL", "'http%3A//phd.cs.unibo.it%3A8083/'" ;
111   "uri_set_queueURL", "'http%3A//phd.cs.unibo.it%3A8084/'" ;
112   "UNICODEvsSYMBOL", "'symbol'" ;
113   "doctype-public", "'-//W3C//DTD%20XHTML%201.0%20Transitional//EN'" ;
114   "encoding", "'iso-8859-1'" ;
115   "media-type", "'text/html'" ;
116   "keys", "'d_c%2CC1%2CG%2CC2%2CL'" ;
117   "interfaceURL", "'http%3A//phd.cs.unibo.it/helm/html/cic/index.html'" ;
118   "naturalLanguage", "'no'" ;
119   "annotations", "'no'" ;
120   "explodeall", "'true()'" ;
121   "topurl", "'http://phd.cs.unibo.it/helm'" ;
122   "CICURI", "'cic:/Coq/Init/Datatypes/bool_ind.con'" ]
123 ;;
124
125 let parse_file filename =
126  let inch = open_in filename in
127   let rec read_lines () =
128    try
129     let line = input_line inch in
130      line ^ read_lines ()
131    with
132     End_of_file -> ""
133   in
134    read_lines ()
135 ;;
136
137 let applyStylesheets input styles args =
138  List.fold_left (fun i style -> Gdome_xslt.applyStylesheet i style args)
139   input styles
140 ;;
141
142 let mml_of_cic_object uri annobj ids_to_inner_sorts ids_to_inner_types =
143  let xml =
144   Cic2Xml.print_object uri ids_to_inner_sorts annobj 
145  in
146  let xmlinnertypes =
147   Cic2Xml.print_inner_types uri ids_to_inner_sorts
148    ids_to_inner_types
149  in
150   let input = Xml2Gdome.document_of_xml domImpl xml in
151 (*CSC: We save the innertypes to disk so that we can retrieve them in the  *)
152 (*CSC: stylesheet. This DOES NOT work when UWOBO and/or the getter are not *)
153 (*CSC: local.                                                              *)
154    Xml.pp xmlinnertypes (Some "/public/sacerdot/innertypes") ;
155    let output = applyStylesheets input mml_styles mml_args in
156     output
157 ;;
158
159
160 (* CALLBACKS *)
161
162 exception RefreshSequentException of exn;;
163 exception RefreshProofException of exn;;
164
165 let refresh_proof (output : GMathView.math_view) =
166  try
167   let uri,currentproof =
168    match !ProofEngine.proof with
169       None -> assert false
170     | Some (uri,metasenv,bo,ty) ->
171        uri,(Cic.CurrentProof (UriManager.name_of_uri uri, metasenv, bo, ty))
172   in
173    let
174     (acic,ids_to_terms,ids_to_father_ids,ids_to_inner_sorts,
175      ids_to_inner_types,ids_to_conjectures,ids_to_hypotheses)
176    =
177     Cic2acic.acic_object_of_cic_object currentproof
178    in
179     let mml =
180      mml_of_cic_object uri acic ids_to_inner_sorts ids_to_inner_types
181     in
182      output#load_tree mml ;
183      current_cic_infos :=
184       Some (ids_to_terms,ids_to_father_ids,ids_to_conjectures,ids_to_hypotheses)
185  with
186   e ->
187  match !ProofEngine.proof with
188     None -> assert false
189   | Some (uri,metasenv,bo,ty) ->
190 prerr_endline ("Offending proof: " ^ CicPp.ppobj (Cic.CurrentProof ("questa",metasenv,bo,ty))) ; flush stderr ;
191    raise (RefreshProofException e)
192 ;;
193
194 let refresh_sequent (proofw : GMathView.math_view) =
195  try
196   match !ProofEngine.goal with
197      None -> proofw#unload
198    | Some metano ->
199       let metasenv =
200        match !ProofEngine.proof with
201           None -> assert false
202         | Some (_,metasenv,_,_) -> metasenv
203       in
204       let currentsequent = List.find (function (m,_,_) -> m=metano) metasenv in
205        let sequent_gdome,ids_to_terms,ids_to_father_ids,ids_to_hypotheses =
206         SequentPp.XmlPp.print_sequent metasenv currentsequent
207        in
208         let sequent_doc =
209          Xml2Gdome.document_of_xml domImpl sequent_gdome
210         in
211          let sequent_mml =
212           applyStylesheets sequent_doc sequent_styles sequent_args
213          in
214           proofw#load_tree ~dom:sequent_mml ;
215           current_goal_infos :=
216            Some (ids_to_terms,ids_to_father_ids,ids_to_hypotheses)
217  with
218   e ->
219 let metano =
220   match !ProofEngine.goal with
221      None -> assert false
222    | Some m -> m
223 in
224 let metasenv =
225  match !ProofEngine.proof with
226     None -> assert false
227   | Some (_,metasenv,_,_) -> metasenv
228 in
229 let currentsequent = List.find (function (m,_,_) -> m=metano) metasenv in
230 prerr_endline ("Offending sequent: " ^ SequentPp.TextualPp.print_sequent currentsequent) ; flush stderr ;
231    raise (RefreshSequentException e)
232 ;;
233
234 (*
235 ignore(domImpl#saveDocumentToFile ~doc:sequent_doc
236  ~name:"/public/sacerdot/guruguru1" ~indent:true ()) ;
237 *)
238
239 let mml_of_cic_term metano term =
240  let metasenv =
241   match !ProofEngine.proof with
242      None -> []
243    | Some (_,metasenv,_,_) -> metasenv
244  in
245  let context =
246   match !ProofEngine.goal with
247      None -> []
248    | Some metano ->
249       let (_,canonical_context,_) =
250        List.find (function (m,_,_) -> m=metano) metasenv
251       in
252        canonical_context
253  in
254    let sequent_gdome,ids_to_terms,ids_to_father_ids,ids_to_hypotheses =
255     SequentPp.XmlPp.print_sequent metasenv (metano,context,term)
256    in
257     let sequent_doc =
258      Xml2Gdome.document_of_xml domImpl sequent_gdome
259     in
260      let res =
261       applyStylesheets sequent_doc sequent_styles sequent_args ;
262      in
263       current_scratch_infos :=
264        Some (term,ids_to_terms,ids_to_father_ids,ids_to_hypotheses) ;
265       res
266 ;;
267
268 let output_html outputhtml msg =
269  htmlheader_and_content := !htmlheader_and_content ^ msg ;
270  outputhtml#source (!htmlheader_and_content ^ htmlfooter) ;
271  outputhtml#set_topline (-1)
272 ;;
273
274 (***********************)
275 (*       TACTICS       *)
276 (***********************)
277
278 let call_tactic tactic rendering_window () =
279  let proofw = (rendering_window#proofw : GMathView.math_view) in
280  let output = (rendering_window#output : GMathView.math_view) in
281  let outputhtml = (rendering_window#outputhtml : GHtml.xmhtml) in
282  let savedproof = !ProofEngine.proof in
283  let savedgoal  = !ProofEngine.goal in
284   begin
285    try
286     tactic () ;
287     refresh_sequent proofw ;
288     refresh_proof output
289    with
290       RefreshSequentException e ->
291        output_html outputhtml
292         ("<h1 color=\"red\">Exception raised during the refresh of the " ^
293          "sequent: " ^ Printexc.to_string e ^ "</h1>") ;
294        ProofEngine.proof := savedproof ;
295        ProofEngine.goal := savedgoal ;
296        refresh_sequent proofw
297     | RefreshProofException e ->
298        output_html outputhtml
299         ("<h1 color=\"red\">Exception raised during the refresh of the " ^
300          "proof: " ^ Printexc.to_string e ^ "</h1>") ;
301        ProofEngine.proof := savedproof ;
302        ProofEngine.goal := savedgoal ;
303        refresh_sequent proofw ;
304        refresh_proof output
305     | e ->
306        output_html outputhtml
307         ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>") ;
308        ProofEngine.proof := savedproof ;
309        ProofEngine.goal := savedgoal ;
310   end
311 ;;
312
313 let call_tactic_with_input tactic rendering_window () =
314  let proofw = (rendering_window#proofw : GMathView.math_view) in
315  let output = (rendering_window#output : GMathView.math_view) in
316  let outputhtml = (rendering_window#outputhtml : GHtml.xmhtml) in
317  let inputt = (rendering_window#inputt : GEdit.text) in
318  let savedproof = !ProofEngine.proof in
319  let savedgoal  = !ProofEngine.goal in
320 (*CSC: Gran cut&paste da sotto... *)
321   let inputlen = inputt#length in
322   let input = inputt#get_chars 0 inputlen ^ "\n" in
323    let lexbuf = Lexing.from_string input in
324    let curi =
325     match !ProofEngine.proof with
326        None -> assert false
327      | Some (curi,_,_,_) -> curi
328    in
329    let metasenv =
330     match !ProofEngine.proof with
331        None -> assert false
332      | Some (_,metasenv,_,_) -> metasenv
333    in
334    let context =
335     List.map
336      (function
337          Some (n,_) -> Some n
338        | None -> None)
339      (match !ProofEngine.goal with
340          None -> assert false
341        | Some metano ->
342           let (_,canonical_context,_) =
343            List.find (function (m,_,_) -> m=metano) metasenv
344           in
345            canonical_context
346      )
347    in
348     try
349      while true do
350       match
351        CicTextualParserContext.main curi context CicTextualLexer.token lexbuf
352       with
353          None -> ()
354        | Some expr ->
355           tactic expr ;
356           refresh_sequent proofw ;
357           refresh_proof output
358      done
359     with
360        CicTextualParser0.Eof ->
361         inputt#delete_text 0 inputlen
362      | RefreshSequentException e ->
363         output_html outputhtml
364          ("<h1 color=\"red\">Exception raised during the refresh of the " ^
365           "sequent: " ^ Printexc.to_string e ^ "</h1>") ;
366         ProofEngine.proof := savedproof ;
367         ProofEngine.goal := savedgoal ;
368         refresh_sequent proofw
369      | RefreshProofException e ->
370         output_html outputhtml
371          ("<h1 color=\"red\">Exception raised during the refresh of the " ^
372           "proof: " ^ Printexc.to_string e ^ "</h1>") ;
373         ProofEngine.proof := savedproof ;
374         ProofEngine.goal := savedgoal ;
375         refresh_sequent proofw ;
376         refresh_proof output
377      | e ->
378         output_html outputhtml
379          ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>") ;
380         ProofEngine.proof := savedproof ;
381         ProofEngine.goal := savedgoal ;
382 ;;
383
384 let call_tactic_with_goal_input tactic rendering_window () =
385  let module L = LogicalOperations in
386  let module G = Gdome in
387   let proofw = (rendering_window#proofw : GMathView.math_view) in
388   let output = (rendering_window#output : GMathView.math_view) in
389   let outputhtml = (rendering_window#outputhtml : GHtml.xmhtml) in
390   let savedproof = !ProofEngine.proof in
391   let savedgoal  = !ProofEngine.goal in
392    match proofw#get_selection with
393      Some node ->
394       let xpath =
395        ((node : Gdome.element)#getAttributeNS
396          ~namespaceURI:helmns
397          ~localName:(G.domString "xref"))#to_string
398       in
399        if xpath = "" then assert false (* "ERROR: No xref found!!!" *)
400        else
401         begin
402          try
403           match !current_goal_infos with
404              Some (ids_to_terms, ids_to_father_ids,_) ->
405               let id = xpath in
406                tactic (Hashtbl.find ids_to_terms id) ;
407                refresh_sequent rendering_window#proofw ;
408                refresh_proof rendering_window#output
409            | None -> assert false (* "ERROR: No current term!!!" *)
410          with
411             RefreshSequentException e ->
412              output_html outputhtml
413               ("<h1 color=\"red\">Exception raised during the refresh of the " ^
414                "sequent: " ^ Printexc.to_string e ^ "</h1>") ;
415              ProofEngine.proof := savedproof ;
416              ProofEngine.goal := savedgoal ;
417              refresh_sequent proofw
418           | RefreshProofException e ->
419              output_html outputhtml
420               ("<h1 color=\"red\">Exception raised during the refresh of the " ^
421                "proof: " ^ Printexc.to_string e ^ "</h1>") ;
422              ProofEngine.proof := savedproof ;
423              ProofEngine.goal := savedgoal ;
424              refresh_sequent proofw ;
425              refresh_proof output
426           | e ->
427              output_html outputhtml
428               ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>") ;
429              ProofEngine.proof := savedproof ;
430              ProofEngine.goal := savedgoal ;
431         end
432    | None ->
433       output_html outputhtml
434        ("<h1 color=\"red\">No term selected</h1>")
435 ;;
436
437 let call_tactic_with_input_and_goal_input tactic rendering_window () =
438  let module L = LogicalOperations in
439  let module G = Gdome in
440   let proofw = (rendering_window#proofw : GMathView.math_view) in
441   let output = (rendering_window#output : GMathView.math_view) in
442   let outputhtml = (rendering_window#outputhtml : GHtml.xmhtml) in
443   let inputt = (rendering_window#inputt : GEdit.text) in
444   let savedproof = !ProofEngine.proof in
445   let savedgoal  = !ProofEngine.goal in
446    match proofw#get_selection with
447      Some node ->
448       let xpath =
449        ((node : Gdome.element)#getAttributeNS
450          ~namespaceURI:helmns
451          ~localName:(G.domString "xref"))#to_string
452       in
453        if xpath = "" then assert false (* "ERROR: No xref found!!!" *)
454        else
455         begin
456          try
457           match !current_goal_infos with
458              Some (ids_to_terms, ids_to_father_ids,_) ->
459               let id = xpath in
460                (* Let's parse the input *)
461                let inputlen = inputt#length in
462                let input = inputt#get_chars 0 inputlen ^ "\n" in
463                 let lexbuf = Lexing.from_string input in
464                 let curi =
465                  match !ProofEngine.proof with
466                     None -> assert false
467                   | Some (curi,_,_,_) -> curi
468                 in
469                 let metasenv =
470                  match !ProofEngine.proof with
471                     None -> assert false
472                   | Some (_,metasenv,_,_) -> metasenv
473                 in
474                 let context =
475                  List.map
476                   (function
477                       Some (n,_) -> Some n
478                     | None -> None)
479                   (match !ProofEngine.goal with
480                       None -> assert false
481                     | Some metano ->
482                        let (_,canonical_context,_) =
483                         List.find (function (m,_,_) -> m=metano) metasenv
484                        in
485                         canonical_context
486                   )
487                 in
488                  begin
489                   try
490                    while true do
491                     match
492                      CicTextualParserContext.main curi context
493                       CicTextualLexer.token lexbuf
494                     with
495                        None -> ()
496                      | Some expr ->
497                         tactic ~goal_input:(Hashtbl.find ids_to_terms id)
498                          ~input:expr ;
499                         refresh_sequent proofw ;
500                         refresh_proof output
501                    done
502                   with
503                      CicTextualParser0.Eof ->
504                       inputt#delete_text 0 inputlen
505                  end
506            | None -> assert false (* "ERROR: No current term!!!" *)
507          with
508             RefreshSequentException e ->
509              output_html outputhtml
510               ("<h1 color=\"red\">Exception raised during the refresh of the " ^
511                "sequent: " ^ Printexc.to_string e ^ "</h1>") ;
512              ProofEngine.proof := savedproof ;
513              ProofEngine.goal := savedgoal ;
514              refresh_sequent proofw
515           | RefreshProofException e ->
516              output_html outputhtml
517               ("<h1 color=\"red\">Exception raised during the refresh of the " ^
518                "proof: " ^ Printexc.to_string e ^ "</h1>") ;
519              ProofEngine.proof := savedproof ;
520              ProofEngine.goal := savedgoal ;
521              refresh_sequent proofw ;
522              refresh_proof output
523           | e ->
524              output_html outputhtml
525               ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>") ;
526              ProofEngine.proof := savedproof ;
527              ProofEngine.goal := savedgoal ;
528         end
529    | None ->
530       output_html outputhtml
531        ("<h1 color=\"red\">No term selected</h1>")
532 ;;
533
534 let call_tactic_with_goal_input_in_scratch tactic scratch_window () =
535  let module L = LogicalOperations in
536  let module G = Gdome in
537   let mmlwidget = (scratch_window#mmlwidget : GMathView.math_view) in
538   let outputhtml = (scratch_window#outputhtml : GHtml.xmhtml) in
539   let savedproof = !ProofEngine.proof in
540   let savedgoal  = !ProofEngine.goal in
541    match mmlwidget#get_selection with
542      Some node ->
543       let xpath =
544        ((node : Gdome.element)#getAttributeNS
545          ~namespaceURI:helmns
546          ~localName:(G.domString "xref"))#to_string
547       in
548        if xpath = "" then assert false (* "ERROR: No xref found!!!" *)
549        else
550         begin
551          try
552           match !current_scratch_infos with
553              (* term is the whole goal in the scratch_area *)
554              Some (term,ids_to_terms, ids_to_father_ids,_) ->
555               let id = xpath in
556                let expr = tactic term (Hashtbl.find ids_to_terms id) in
557                 let mml = mml_of_cic_term 111 expr in
558                  scratch_window#show () ;
559                  scratch_window#mmlwidget#load_tree ~dom:mml
560            | None -> assert false (* "ERROR: No current term!!!" *)
561          with
562           e ->
563            output_html outputhtml
564             ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>")
565         end
566    | None ->
567       output_html outputhtml
568        ("<h1 color=\"red\">No term selected</h1>")
569 ;;
570
571 let intros rendering_window = call_tactic ProofEngine.intros rendering_window;;
572 let exact rendering_window =
573  call_tactic_with_input ProofEngine.exact rendering_window
574 ;;
575 let apply rendering_window =
576  call_tactic_with_input ProofEngine.apply rendering_window
577 ;;
578 let elimintrossimpl rendering_window =
579  call_tactic_with_input ProofEngine.elim_intros_simpl rendering_window
580 ;;
581 let whd rendering_window =
582  call_tactic_with_goal_input ProofEngine.whd rendering_window
583 ;;
584 let reduce rendering_window =
585  call_tactic_with_goal_input ProofEngine.reduce rendering_window
586 ;;
587 let simpl rendering_window =
588  call_tactic_with_goal_input ProofEngine.simpl rendering_window
589 ;;
590 let fold rendering_window =
591  call_tactic_with_input ProofEngine.fold rendering_window
592 ;;
593 let cut rendering_window =
594  call_tactic_with_input ProofEngine.cut rendering_window
595 ;;
596 let change rendering_window =
597  call_tactic_with_input_and_goal_input ProofEngine.change rendering_window
598 ;;
599 let letin rendering_window =
600  call_tactic_with_input ProofEngine.letin rendering_window
601 ;;
602
603
604 let whd_in_scratch scratch_window =
605  call_tactic_with_goal_input_in_scratch ProofEngine.whd_in_scratch
606   scratch_window
607 ;;
608 let reduce_in_scratch scratch_window =
609  call_tactic_with_goal_input_in_scratch ProofEngine.reduce_in_scratch
610   scratch_window
611 ;;
612 let simpl_in_scratch scratch_window =
613  call_tactic_with_goal_input_in_scratch ProofEngine.simpl_in_scratch
614   scratch_window
615 ;;
616
617
618
619 (**********************)
620 (*   END OF TACTICS   *)
621 (**********************)
622
623 exception OpenConjecturesStillThere;;
624 exception WrongProof;;
625
626 let qed rendering_window () =
627  match !ProofEngine.proof with
628     None -> assert false
629   | Some (uri,[],bo,ty) ->
630      if
631       CicReduction.are_convertible []
632        (CicTypeChecker.type_of_aux' [] [] bo) ty
633      then
634       begin
635        (*CSC: Wrong: [] is just plainly wrong *)
636        let proof = Cic.Definition (UriManager.name_of_uri uri,bo,ty,[]) in
637         let
638          (acic,ids_to_terms,ids_to_father_ids,ids_to_inner_sorts,
639           ids_to_inner_types,ids_to_conjectures,ids_to_hypotheses)
640         =
641          Cic2acic.acic_object_of_cic_object proof
642         in
643          let mml =
644           mml_of_cic_object uri acic ids_to_inner_sorts ids_to_inner_types
645          in
646           (rendering_window#output : GMathView.math_view)#load_tree mml ;
647           current_cic_infos :=
648            Some
649             (ids_to_terms,ids_to_father_ids,ids_to_conjectures,
650              ids_to_hypotheses)
651       end
652      else
653       raise WrongProof
654   | _ -> raise OpenConjecturesStillThere
655 ;;
656
657 (*????
658 let dtdname = "http://www.cs.unibo.it/helm/dtd/cic.dtd";;
659 *)
660 let dtdname = "/projects/helm/V7/dtd/cic.dtd";;
661
662 let save rendering_window () =
663  let outputhtml = (rendering_window#outputhtml : GHtml.xmhtml) in
664   match !ProofEngine.proof with
665      None -> assert false
666    | Some (uri, metasenv, bo, ty) ->
667       let currentproof =
668        Cic.CurrentProof (UriManager.name_of_uri uri,metasenv,bo,ty)
669       in
670        let (acurrentproof,_,_,ids_to_inner_sorts,_,_,_) =
671         Cic2acic.acic_object_of_cic_object currentproof
672        in
673         let xml = Cic2Xml.print_object uri ids_to_inner_sorts acurrentproof in
674          let xml' =
675           [< Xml.xml_cdata "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n" ;
676              Xml.xml_cdata
677               ("<!DOCTYPE CurrentProof SYSTEM \"" ^ dtdname ^ "\">\n\n") ;
678              xml
679           >]
680          in
681           Xml.pp ~quiet:true xml' (Some "/public/sacerdot/currentproof") ;
682           output_html outputhtml
683            ("<h1 color=\"Green\">Current proof saved to " ^
684              "/public/sacerdot/currentproof</h1>")
685 ;;
686
687 let load rendering_window () =
688  let outputhtml = (rendering_window#outputhtml : GHtml.xmhtml) in
689  let output = (rendering_window#output : GMathView.math_view) in
690  let proofw = (rendering_window#proofw : GMathView.math_view) in
691   try
692    let uri = UriManager.uri_of_string "cic:/dummy.con" in
693     match CicParser.obj_of_xml "/public/sacerdot/currentproof" uri with
694        Cic.CurrentProof (_,metasenv,bo,ty) ->
695         ProofEngine.proof :=
696          Some (uri, metasenv, bo, ty) ;
697         ProofEngine.goal :=
698          (match metasenv with
699              [] -> None
700            | (metano,_,_)::_ -> Some metano
701          ) ;
702         refresh_proof output ;
703         refresh_sequent proofw ;
704          output_html outputhtml
705           ("<h1 color=\"Green\">Current proof loaded from " ^
706             "/public/sacerdot/currentproof</h1>")
707      | _ -> assert false
708   with
709      RefreshSequentException e ->
710       output_html outputhtml
711        ("<h1 color=\"red\">Exception raised during the refresh of the " ^
712         "sequent: " ^ Printexc.to_string e ^ "</h1>")
713    | RefreshProofException e ->
714       output_html outputhtml
715        ("<h1 color=\"red\">Exception raised during the refresh of the " ^
716         "proof: " ^ Printexc.to_string e ^ "</h1>")
717    | e ->
718       output_html outputhtml
719        ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>") ;
720 ;;
721
722 let proveit rendering_window () =
723  let module L = LogicalOperations in
724  let module G = Gdome in
725  let outputhtml = (rendering_window#outputhtml : GHtml.xmhtml) in
726   match rendering_window#output#get_selection with
727     Some node ->
728      let xpath =
729       ((node : Gdome.element)#getAttributeNS
730       (*CSC: OCAML DIVERGE
731       ((element : G.element)#getAttributeNS
732       *)
733         ~namespaceURI:helmns
734         ~localName:(G.domString "xref"))#to_string
735      in
736       if xpath = "" then assert false (* "ERROR: No xref found!!!" *)
737       else
738        begin
739         try
740          match !current_cic_infos with
741             Some (ids_to_terms, ids_to_father_ids, _, _) ->
742              let id = xpath in
743               L.to_sequent id ids_to_terms ids_to_father_ids ;
744               refresh_proof rendering_window#output ;
745               refresh_sequent rendering_window#proofw
746           | None -> assert false (* "ERROR: No current term!!!" *)
747         with
748            RefreshSequentException e ->
749             output_html outputhtml
750              ("<h1 color=\"red\">Exception raised during the refresh of the " ^
751               "sequent: " ^ Printexc.to_string e ^ "</h1>")
752          | RefreshProofException e ->
753             output_html outputhtml
754              ("<h1 color=\"red\">Exception raised during the refresh of the " ^
755               "proof: " ^ Printexc.to_string e ^ "</h1>")
756          | e ->
757             output_html outputhtml
758              ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>")
759        end
760   | None -> assert false (* "ERROR: No selection!!!" *)
761 ;;
762
763 let focus rendering_window () =
764  let module L = LogicalOperations in
765  let module G = Gdome in
766  let outputhtml = (rendering_window#outputhtml : GHtml.xmhtml) in
767   match rendering_window#output#get_selection with
768     Some node ->
769      let xpath =
770       ((node : Gdome.element)#getAttributeNS
771       (*CSC: OCAML DIVERGE
772       ((element : G.element)#getAttributeNS
773       *)
774         ~namespaceURI:helmns
775         ~localName:(G.domString "xref"))#to_string
776      in
777       if xpath = "" then assert false (* "ERROR: No xref found!!!" *)
778       else
779        begin
780         try
781          match !current_cic_infos with
782             Some (ids_to_terms, ids_to_father_ids, _, _) ->
783              let id = xpath in
784               L.focus id ids_to_terms ids_to_father_ids ;
785               refresh_sequent rendering_window#proofw
786           | None -> assert false (* "ERROR: No current term!!!" *)
787         with
788            RefreshSequentException e ->
789             output_html outputhtml
790              ("<h1 color=\"red\">Exception raised during the refresh of the " ^
791               "sequent: " ^ Printexc.to_string e ^ "</h1>")
792          | RefreshProofException e ->
793             output_html outputhtml
794              ("<h1 color=\"red\">Exception raised during the refresh of the " ^
795               "proof: " ^ Printexc.to_string e ^ "</h1>")
796          | e ->
797             output_html outputhtml
798              ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>")
799        end
800   | None -> assert false (* "ERROR: No selection!!!" *)
801 ;;
802
803 exception NoPrevGoal;;
804 exception NoNextGoal;;
805
806 let prevgoal metasenv metano =
807  let rec aux =
808   function
809      [] -> assert false
810    | [(m,_,_)] -> raise NoPrevGoal
811    | (n,_,_)::(m,_,_)::_ when m=metano -> n
812    | _::tl -> aux tl
813  in
814   aux metasenv
815 ;;
816
817 let nextgoal metasenv metano =
818  let rec aux =
819   function
820      [] -> assert false
821    | [(m,_,_)] when m = metano -> raise NoNextGoal
822    | (m,_,_)::(n,_,_)::_ when m=metano -> n
823    | _::tl -> aux tl
824  in
825   aux metasenv
826 ;;
827
828 let prev_or_next_goal select_goal rendering_window () =
829  let module L = LogicalOperations in
830  let module G = Gdome in
831  let outputhtml = (rendering_window#outputhtml : GHtml.xmhtml) in
832   let metasenv =
833    match !ProofEngine.proof with
834       None -> assert false
835     | Some (_,metasenv,_,_) -> metasenv
836   in
837   let metano =
838    match !ProofEngine.goal with
839       None -> assert false
840     | Some m -> m
841   in
842    try
843     ProofEngine.goal := Some (select_goal metasenv metano) ;
844     refresh_sequent rendering_window#proofw
845    with
846       RefreshSequentException e ->
847        output_html outputhtml
848         ("<h1 color=\"red\">Exception raised during the refresh of the " ^
849          "sequent: " ^ Printexc.to_string e ^ "</h1>")
850     | e ->
851        output_html outputhtml
852         ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>")
853 ;;
854
855 exception NotADefinition;;
856
857 let open_ rendering_window () =
858  let inputt = (rendering_window#inputt : GEdit.text) in
859  let oldinputt = (rendering_window#oldinputt : GEdit.text) in
860  let outputhtml = (rendering_window#outputhtml : GHtml.xmhtml) in
861  let output = (rendering_window#output : GMathView.math_view) in
862  let proofw = (rendering_window#proofw : GMathView.math_view) in
863   let inputlen = inputt#length in
864   let input = inputt#get_chars 0 inputlen ^ "\n" in
865    try
866     let uri = UriManager.uri_of_string ("cic:" ^ input) in
867      CicTypeChecker.typecheck uri ;
868      let metasenv,bo,ty =
869       match CicEnvironment.get_cooked_obj uri 0 with
870          Cic.Definition (_,bo,ty,_) -> [],bo,ty
871        | Cic.CurrentProof (_,metasenv,bo,ty) -> metasenv,bo,ty
872        | Cic.Axiom _
873        | Cic.Variable _
874        | Cic.InductiveDefinition _ -> raise NotADefinition
875      in
876       ProofEngine.proof :=
877        Some (uri, metasenv, bo, ty) ;
878       ProofEngine.goal := None ;
879       refresh_sequent proofw ;
880       refresh_proof output ;
881       inputt#delete_text 0 inputlen ;
882       ignore(oldinputt#insert_text input oldinputt#length)
883    with
884       RefreshSequentException e ->
885        output_html outputhtml
886         ("<h1 color=\"red\">Exception raised during the refresh of the " ^
887          "sequent: " ^ Printexc.to_string e ^ "</h1>")
888     | RefreshProofException e ->
889        output_html outputhtml
890         ("<h1 color=\"red\">Exception raised during the refresh of the " ^
891          "proof: " ^ Printexc.to_string e ^ "</h1>")
892     | e ->
893        output_html outputhtml
894         ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>") ;
895 ;;
896
897 let state rendering_window () =
898  let inputt = (rendering_window#inputt : GEdit.text) in
899  let oldinputt = (rendering_window#oldinputt : GEdit.text) in
900  let outputhtml = (rendering_window#outputhtml : GHtml.xmhtml) in
901  let output = (rendering_window#output : GMathView.math_view) in
902  let proofw = (rendering_window#proofw : GMathView.math_view) in
903   let inputlen = inputt#length in
904   let input = inputt#get_chars 0 inputlen ^ "\n" in
905    (* Do something interesting *)
906    let lexbuf = Lexing.from_string input in
907     try
908      while true do
909       (* Execute the actions *)
910       match CicTextualParser.main CicTextualLexer.token lexbuf with
911          None -> ()
912        | Some expr ->
913           let _  = CicTypeChecker.type_of_aux' [] [] expr in
914            ProofEngine.proof :=
915             Some (UriManager.uri_of_string "cic:/dummy.con",
916                    [1,[],expr], Cic.Meta (1,[]), expr) ;
917            ProofEngine.goal := Some 1 ;
918            refresh_sequent proofw ;
919            refresh_proof output ;
920      done
921     with
922        CicTextualParser0.Eof ->
923         inputt#delete_text 0 inputlen ;
924         ignore(oldinputt#insert_text input oldinputt#length)
925      | RefreshSequentException e ->
926         output_html outputhtml
927          ("<h1 color=\"red\">Exception raised during the refresh of the " ^
928           "sequent: " ^ Printexc.to_string e ^ "</h1>")
929      | RefreshProofException e ->
930         output_html outputhtml
931          ("<h1 color=\"red\">Exception raised during the refresh of the " ^
932           "proof: " ^ Printexc.to_string e ^ "</h1>")
933      | e ->
934         output_html outputhtml
935          ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>") ;
936 ;;
937
938 let check rendering_window scratch_window () =
939  let inputt = (rendering_window#inputt : GEdit.text) in
940  let outputhtml = (rendering_window#outputhtml : GHtml.xmhtml) in
941  let output = (rendering_window#output : GMathView.math_view) in
942  let proofw = (rendering_window#proofw : GMathView.math_view) in
943   let inputlen = inputt#length in
944   let input = inputt#get_chars 0 inputlen ^ "\n" in
945   let curi,metasenv =
946    match !ProofEngine.proof with
947       None -> UriManager.uri_of_string "cic:/dummy.con", []
948     | Some (curi,metasenv,_,_) -> curi,metasenv
949   in
950   let context,names_context =
951    let context =
952     match !ProofEngine.goal with
953        None -> []
954      | Some metano ->
955         let (_,canonical_context,_) =
956          List.find (function (m,_,_) -> m=metano) metasenv
957         in
958          canonical_context
959    in
960     context,
961     List.map
962      (function
963          Some (n,_) -> Some n
964        | None -> None
965      ) context
966   in
967    (* Do something interesting *)
968    let lexbuf = Lexing.from_string input in
969     try
970      while true do
971       (* Execute the actions *)
972       match
973        CicTextualParserContext.main curi names_context CicTextualLexer.token
974         lexbuf
975       with
976          None -> ()
977        | Some expr ->
978           try
979            let ty  = CicTypeChecker.type_of_aux' metasenv context expr in
980             let mml = mml_of_cic_term 111 (Cic.Cast (expr,ty)) in
981              scratch_window#show () ;
982              scratch_window#mmlwidget#load_tree ~dom:mml
983           with
984            e ->
985             print_endline ("? " ^ CicPp.ppterm expr) ;
986             raise e
987      done
988     with
989        CicTextualParser0.Eof -> ()
990      | e ->
991        output_html outputhtml
992         ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>") ;
993 ;;
994
995 let locate rendering_window () =
996  let inputt = (rendering_window#inputt : GEdit.text) in
997  let outputhtml = (rendering_window#outputhtml : GHtml.xmhtml) in
998   let inputlen = inputt#length in
999   let input = inputt#get_chars 0 inputlen in
1000   output_html outputhtml (
1001      try
1002         match Str.split (Str.regexp "[ \t]+") input with
1003            | [] -> ""
1004            | head :: tail ->
1005                inputt#delete_text 0 inputlen;
1006                Mquery.locate head 
1007      with
1008         e -> "<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>"
1009   )
1010 ;;
1011
1012 let backward rendering_window () =
1013    let outputhtml = (rendering_window#outputhtml : GHtml.xmhtml) in
1014    let inputt = (rendering_window#inputt : GEdit.text) in
1015     let inputlen = inputt#length in
1016     let input = inputt#get_chars 0 inputlen in
1017     let level = int_of_string input in
1018     let metasenv =
1019      match !ProofEngine.proof with
1020         None -> assert false
1021       | Some (_,metasenv,_,_) -> metasenv
1022     in
1023     let result =
1024        match !ProofEngine.goal with
1025           | None -> ""
1026           | Some metano ->
1027              let (_,_,ty) =
1028               List.find (function (m,_,_) -> m=metano) metasenv
1029              in
1030               Mquery.backward ty level
1031        in 
1032    output_html outputhtml result
1033       
1034 let choose_selection
1035      (mmlwidget : GMathView.math_view) (element : Gdome.element option)
1036 =
1037  let module G = Gdome in
1038   let rec aux element =
1039    if element#hasAttributeNS
1040        ~namespaceURI:helmns
1041        ~localName:(G.domString "xref")
1042    then
1043      mmlwidget#set_selection (Some element)
1044    else
1045       match element#get_parentNode with
1046          None -> assert false
1047        (*CSC: OCAML DIVERGES!
1048        | Some p -> aux (new G.element_of_node p)
1049        *)
1050        | Some p -> aux (new Gdome.element_of_node p)
1051   in
1052    match element with
1053      Some x -> aux x
1054    | None   -> mmlwidget#set_selection None
1055 ;;
1056
1057 (* STUFF TO BUILD THE GTK INTERFACE *)
1058
1059 (* Stuff for the widget settings *)
1060
1061 let export_to_postscript (output : GMathView.math_view) () =
1062  output#export_to_postscript ~filename:"output.ps" ();
1063 ;;
1064
1065 let activate_t1 (output : GMathView.math_view) button_set_anti_aliasing
1066  button_set_kerning button_set_transparency button_export_to_postscript
1067  button_t1 ()
1068 =
1069  let is_set = button_t1#active in
1070   output#set_font_manager_type
1071    (if is_set then `font_manager_t1 else `font_manager_gtk) ;
1072   if is_set then
1073    begin
1074     button_set_anti_aliasing#misc#set_sensitive true ;
1075     button_set_kerning#misc#set_sensitive true ;
1076     button_set_transparency#misc#set_sensitive true ;
1077     button_export_to_postscript#misc#set_sensitive true ;
1078    end
1079   else
1080    begin
1081     button_set_anti_aliasing#misc#set_sensitive false ;
1082     button_set_kerning#misc#set_sensitive false ;
1083     button_set_transparency#misc#set_sensitive false ;
1084     button_export_to_postscript#misc#set_sensitive false ;
1085    end
1086 ;;
1087
1088 let set_anti_aliasing output button_set_anti_aliasing () =
1089  output#set_anti_aliasing button_set_anti_aliasing#active
1090 ;;
1091
1092 let set_kerning output button_set_kerning () =
1093  output#set_kerning button_set_kerning#active
1094 ;;
1095
1096 let set_transparency output button_set_transparency () =
1097  output#set_transparency button_set_transparency#active
1098 ;;
1099
1100 let changefont output font_size_spinb () =
1101  output#set_font_size font_size_spinb#value_as_int
1102 ;;
1103
1104 let set_log_verbosity output log_verbosity_spinb () =
1105  output#set_log_verbosity log_verbosity_spinb#value_as_int
1106 ;;
1107
1108 class settings_window (output : GMathView.math_view) sw
1109  button_export_to_postscript selection_changed_callback
1110 =
1111  let settings_window = GWindow.window ~title:"GtkMathView settings" () in
1112  let vbox =
1113   GPack.vbox ~packing:settings_window#add () in
1114  let table =
1115   GPack.table
1116    ~rows:1 ~columns:3 ~homogeneous:false ~row_spacings:5 ~col_spacings:5
1117    ~border_width:5 ~packing:vbox#add () in
1118  let button_t1 =
1119   GButton.toggle_button ~label:"activate t1 fonts"
1120    ~packing:(table#attach ~left:0 ~top:0) () in
1121  let button_set_anti_aliasing =
1122   GButton.toggle_button ~label:"set_anti_aliasing"
1123    ~packing:(table#attach ~left:0 ~top:1) () in
1124  let button_set_kerning =
1125   GButton.toggle_button ~label:"set_kerning"
1126    ~packing:(table#attach ~left:1 ~top:1) () in
1127  let button_set_transparency =
1128   GButton.toggle_button ~label:"set_transparency"
1129    ~packing:(table#attach ~left:2 ~top:1) () in
1130  let table =
1131   GPack.table
1132    ~rows:2 ~columns:2 ~homogeneous:false ~row_spacings:5 ~col_spacings:5
1133    ~border_width:5 ~packing:vbox#add () in
1134  let font_size_label =
1135   GMisc.label ~text:"font size:"
1136    ~packing:(table#attach ~left:0 ~top:0 ~expand:`NONE) () in
1137  let font_size_spinb =
1138   let sadj =
1139    GData.adjustment ~value:14.0 ~lower:5.0 ~upper:50.0 ~step_incr:1.0 ()
1140   in
1141    GEdit.spin_button 
1142     ~adjustment:sadj ~packing:(table#attach ~left:1 ~top:0 ~fill:`NONE) () in
1143  let log_verbosity_label =
1144   GMisc.label ~text:"log verbosity:"
1145    ~packing:(table#attach ~left:0 ~top:1) () in
1146  let log_verbosity_spinb =
1147   let sadj =
1148    GData.adjustment ~value:0.0 ~lower:0.0 ~upper:3.0 ~step_incr:1.0 ()
1149   in
1150    GEdit.spin_button 
1151     ~adjustment:sadj ~packing:(table#attach ~left:1 ~top:1) () in
1152  let hbox =
1153   GPack.hbox ~packing:(vbox#pack ~expand:false ~fill:false ~padding:5) () in
1154  let closeb =
1155   GButton.button ~label:"Close"
1156    ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
1157 object(self)
1158  method show = settings_window#show
1159  initializer
1160   button_set_anti_aliasing#misc#set_sensitive false ;
1161   button_set_kerning#misc#set_sensitive false ;
1162   button_set_transparency#misc#set_sensitive false ;
1163   (* Signals connection *)
1164   ignore(button_t1#connect#clicked
1165    (activate_t1 output button_set_anti_aliasing button_set_kerning
1166     button_set_transparency button_export_to_postscript button_t1)) ;
1167   ignore(font_size_spinb#connect#changed (changefont output font_size_spinb)) ;
1168   ignore(button_set_anti_aliasing#connect#toggled
1169    (set_anti_aliasing output button_set_anti_aliasing));
1170   ignore(button_set_kerning#connect#toggled
1171    (set_kerning output button_set_kerning)) ;
1172   ignore(button_set_transparency#connect#toggled
1173    (set_transparency output button_set_transparency)) ;
1174   ignore(log_verbosity_spinb#connect#changed
1175    (set_log_verbosity output log_verbosity_spinb)) ;
1176   ignore(closeb#connect#clicked settings_window#misc#hide)
1177 end;;
1178
1179 (* Scratch window *)
1180
1181 class scratch_window outputhtml =
1182  let window =
1183   GWindow.window ~title:"MathML viewer" ~border_width:2 () in
1184  let vbox =
1185   GPack.vbox ~packing:window#add () in
1186  let hbox =
1187   GPack.hbox ~packing:(vbox#pack ~expand:false ~fill:false ~padding:5) () in
1188  let whdb =
1189   GButton.button ~label:"Whd"
1190    ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
1191  let reduceb =
1192   GButton.button ~label:"Reduce"
1193    ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
1194  let simplb =
1195   GButton.button ~label:"Simpl"
1196    ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
1197  let scrolled_window =
1198   GBin.scrolled_window ~border_width:10
1199    ~packing:(vbox#pack ~expand:true ~padding:5) () in
1200  let mmlwidget =
1201   GMathView.math_view
1202    ~packing:(scrolled_window#add) ~width:400 ~height:280 () in
1203 object(self)
1204  method outputhtml = outputhtml
1205  method mmlwidget = mmlwidget
1206  method show () = window#misc#hide () ; window#show ()
1207  initializer
1208   ignore(mmlwidget#connect#selection_changed (choose_selection mmlwidget)) ;
1209   ignore(window#event#connect#delete (fun _ -> window#misc#hide () ; true )) ;
1210   ignore(whdb#connect#clicked (whd_in_scratch self)) ;
1211   ignore(reduceb#connect#clicked (reduce_in_scratch self)) ;
1212   ignore(simplb#connect#clicked (simpl_in_scratch self))
1213 end;;
1214
1215 (* Main window *)
1216
1217 class rendering_window output proofw (label : GMisc.label) =
1218  let window =
1219   GWindow.window ~title:"MathML viewer" ~border_width:2 () in
1220  let hbox0 =
1221   GPack.hbox ~packing:window#add () in
1222  let vbox =
1223   GPack.vbox ~packing:(hbox0#pack ~expand:false ~fill:false ~padding:5) () in
1224  let _ = vbox#pack ~expand:false ~fill:false ~padding:5 label#coerce in
1225  let scrolled_window0 =
1226   GBin.scrolled_window ~border_width:10
1227    ~packing:(vbox#pack ~expand:true ~padding:5) () in
1228  let _ = scrolled_window0#add output#coerce in
1229  let hbox1 =
1230   GPack.hbox ~packing:(vbox#pack ~expand:false ~fill:false ~padding:5) () in
1231  let settingsb =
1232   GButton.button ~label:"Settings"
1233    ~packing:(hbox1#pack ~expand:false ~fill:false ~padding:5) () in
1234  let button_export_to_postscript =
1235   GButton.button ~label:"export_to_postscript"
1236   ~packing:(hbox1#pack ~expand:false ~fill:false ~padding:5) () in
1237  let qedb =
1238   GButton.button ~label:"Qed"
1239    ~packing:(hbox1#pack ~expand:false ~fill:false ~padding:5) () in
1240  let saveb =
1241   GButton.button ~label:"Save"
1242    ~packing:(hbox1#pack ~expand:false ~fill:false ~padding:5) () in
1243  let loadb =
1244   GButton.button ~label:"Load"
1245    ~packing:(hbox1#pack ~expand:false ~fill:false ~padding:5) () in
1246  let closeb =
1247   GButton.button ~label:"Close"
1248    ~packing:(hbox1#pack ~expand:false ~fill:false ~padding:5) () in
1249  let hbox2 =
1250   GPack.hbox ~packing:(vbox#pack ~expand:false ~fill:false ~padding:5) () in
1251  let proveitb =
1252   GButton.button ~label:"Prove It"
1253    ~packing:(hbox2#pack ~expand:false ~fill:false ~padding:5) () in
1254  let focusb =
1255   GButton.button ~label:"Focus"
1256    ~packing:(hbox2#pack ~expand:false ~fill:false ~padding:5) () in
1257  let prevgoalb =
1258   GButton.button ~label:"<"
1259    ~packing:(hbox2#pack ~expand:false ~fill:false ~padding:5) () in
1260  let nextgoalb =
1261   GButton.button ~label:">"
1262    ~packing:(hbox2#pack ~expand:false ~fill:false ~padding:5) () in
1263  let oldinputt = GEdit.text ~editable:false ~width:400 ~height:180
1264    ~packing:(vbox#pack ~padding:5) () in
1265  let hbox4 =
1266   GPack.hbox ~packing:(vbox#pack ~expand:false ~fill:false ~padding:5) () in
1267  let stateb =
1268   GButton.button ~label:"State"
1269    ~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
1270  let openb =
1271   GButton.button ~label:"Open"
1272    ~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
1273  let checkb =
1274   GButton.button ~label:"Check"
1275    ~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
1276  let locateb =
1277   GButton.button ~label:"Locate"
1278    ~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
1279  let backwardb =
1280   GButton.button ~label:"Backward"
1281    ~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
1282  let inputt = GEdit.text ~editable:true ~width:400 ~height: 100
1283    ~packing:(vbox#pack ~padding:5) () in
1284  let vbox1 =
1285   GPack.vbox ~packing:(hbox0#pack ~expand:false ~fill:false ~padding:5) () in
1286  let scrolled_window1 =
1287   GBin.scrolled_window ~border_width:10
1288    ~packing:(vbox1#pack ~expand:true ~padding:5) () in
1289  let _ = scrolled_window1#add proofw#coerce in
1290  let hbox3 =
1291   GPack.hbox ~packing:(vbox1#pack ~expand:false ~fill:false ~padding:5) () in
1292  let exactb =
1293   GButton.button ~label:"Exact"
1294    ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
1295  let introsb =
1296   GButton.button ~label:"Intros"
1297    ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
1298  let applyb =
1299   GButton.button ~label:"Apply"
1300    ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
1301  let elimintrossimplb =
1302   GButton.button ~label:"ElimIntrosSimpl"
1303    ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
1304  let whdb =
1305   GButton.button ~label:"Whd"
1306    ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
1307  let reduceb =
1308   GButton.button ~label:"Reduce"
1309    ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
1310  let simplb =
1311   GButton.button ~label:"Simpl"
1312    ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
1313  let foldb =
1314   GButton.button ~label:"Fold"
1315    ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
1316  let cutb =
1317   GButton.button ~label:"Cut"
1318    ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
1319  let changeb =
1320   GButton.button ~label:"Change"
1321    ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
1322  let letinb =
1323   GButton.button ~label:"Let ... In"
1324    ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
1325  let outputhtml =
1326   GHtml.xmhtml
1327    ~source:"<html><body bgColor=\"white\"></body></html>"
1328    ~width:400 ~height: 200
1329    ~packing:(vbox1#pack ~expand:false ~fill:false ~padding:5)
1330    ~show:true () in
1331  let scratch_window = new scratch_window outputhtml in
1332 object(self)
1333  method outputhtml = outputhtml
1334  method oldinputt = oldinputt
1335  method inputt = inputt
1336  method output = (output : GMathView.math_view)
1337  method proofw = (proofw : GMathView.math_view)
1338  method show = window#show
1339  initializer
1340   button_export_to_postscript#misc#set_sensitive false ;
1341
1342   (* signal handlers here *)
1343   ignore(output#connect#selection_changed
1344    (function elem -> proofw#unload ; choose_selection output elem)) ;
1345   ignore(proofw#connect#selection_changed (choose_selection proofw)) ;
1346   ignore(closeb#connect#clicked (fun _ -> GMain.Main.quit ())) ;
1347   let settings_window = new settings_window output scrolled_window0
1348    button_export_to_postscript (choose_selection output) in
1349   ignore(settingsb#connect#clicked settings_window#show) ;
1350   ignore(button_export_to_postscript#connect#clicked (export_to_postscript output)) ;
1351   ignore(qedb#connect#clicked (qed self)) ;
1352   ignore(saveb#connect#clicked (save self)) ;
1353   ignore(loadb#connect#clicked (load self)) ;
1354   ignore(proveitb#connect#clicked (proveit self)) ;
1355   ignore(focusb#connect#clicked (focus self)) ;
1356   ignore(prevgoalb#connect#clicked (prev_or_next_goal prevgoal self)) ;
1357   ignore(nextgoalb#connect#clicked (prev_or_next_goal nextgoal self)) ;
1358   ignore(window#event#connect#delete (fun _ -> GMain.Main.quit () ; true )) ;
1359   ignore(stateb#connect#clicked (state self)) ;
1360   ignore(openb#connect#clicked (open_ self)) ;
1361   ignore(checkb#connect#clicked (check self scratch_window)) ;
1362   ignore(locateb#connect#clicked (locate self)) ;
1363   ignore(backwardb#connect#clicked (backward self)) ;
1364   ignore(exactb#connect#clicked (exact self)) ;
1365   ignore(applyb#connect#clicked (apply self)) ;
1366   ignore(elimintrossimplb#connect#clicked (elimintrossimpl self)) ;
1367   ignore(whdb#connect#clicked (whd self)) ;
1368   ignore(reduceb#connect#clicked (reduce self)) ;
1369   ignore(simplb#connect#clicked (simpl self)) ;
1370   ignore(foldb#connect#clicked (fold self)) ;
1371   ignore(cutb#connect#clicked (cut self)) ;
1372   ignore(changeb#connect#clicked (change self)) ;
1373   ignore(letinb#connect#clicked (letin self)) ;
1374   ignore(introsb#connect#clicked (intros self)) ;
1375   Logger.log_callback :=
1376    (Logger.log_to_html ~print_and_flush:(output_html outputhtml))
1377 end;;
1378
1379 (* MAIN *)
1380
1381 let initialize_everything () =
1382  let module U = Unix in
1383   let output = GMathView.math_view ~width:400 ~height:280 ()
1384   and proofw = GMathView.math_view ~width:400 ~height:275 ()
1385   and label = GMisc.label ~text:"gTopLevel" () in
1386     let rendering_window =
1387      new rendering_window output proofw label
1388     in
1389      rendering_window#show () ;
1390      GMain.Main.main ()
1391 ;;
1392
1393 let _ =
1394  CicCooking.init () ;
1395  Mquery.init () ;
1396  ignore (GtkMain.Main.init ()) ;
1397  initialize_everything () ;
1398  Mquery.close ()
1399 ;;