]> matita.cs.unibo.it Git - helm.git/blob - helm/gTopLevel/gTopLevel.ml
* Clear and ClearBody implemented, but they are bugged because they do not
[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 call_tactic_with_hypothesis_input tactic rendering_window () =
572  let module L = LogicalOperations in
573  let module G = Gdome in
574   let proofw = (rendering_window#proofw : GMathView.math_view) in
575   let output = (rendering_window#output : GMathView.math_view) in
576   let outputhtml = (rendering_window#outputhtml : GHtml.xmhtml) in
577   let savedproof = !ProofEngine.proof in
578   let savedgoal  = !ProofEngine.goal in
579    match proofw#get_selection with
580      Some node ->
581       let xpath =
582        ((node : Gdome.element)#getAttributeNS
583          ~namespaceURI:helmns
584          ~localName:(G.domString "xref"))#to_string
585       in
586        if xpath = "" then assert false (* "ERROR: No xref found!!!" *)
587        else
588         begin
589          try
590           match !current_goal_infos with
591              Some (_,_,ids_to_hypotheses) ->
592               let id = xpath in
593                tactic (Hashtbl.find ids_to_hypotheses id) ;
594                refresh_sequent rendering_window#proofw ;
595                refresh_proof rendering_window#output
596            | None -> assert false (* "ERROR: No current term!!!" *)
597          with
598             RefreshSequentException e ->
599              output_html outputhtml
600               ("<h1 color=\"red\">Exception raised during the refresh of the " ^
601                "sequent: " ^ Printexc.to_string e ^ "</h1>") ;
602              ProofEngine.proof := savedproof ;
603              ProofEngine.goal := savedgoal ;
604              refresh_sequent proofw
605           | RefreshProofException e ->
606              output_html outputhtml
607               ("<h1 color=\"red\">Exception raised during the refresh of the " ^
608                "proof: " ^ Printexc.to_string e ^ "</h1>") ;
609              ProofEngine.proof := savedproof ;
610              ProofEngine.goal := savedgoal ;
611              refresh_sequent proofw ;
612              refresh_proof output
613           | e ->
614              output_html outputhtml
615               ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>") ;
616              ProofEngine.proof := savedproof ;
617              ProofEngine.goal := savedgoal ;
618         end
619    | None ->
620       output_html outputhtml
621        ("<h1 color=\"red\">No term selected</h1>")
622 ;;
623
624
625 let intros rendering_window = call_tactic ProofEngine.intros rendering_window;;
626 let exact rendering_window =
627  call_tactic_with_input ProofEngine.exact rendering_window
628 ;;
629 let apply rendering_window =
630  call_tactic_with_input ProofEngine.apply rendering_window
631 ;;
632 let elimintrossimpl rendering_window =
633  call_tactic_with_input ProofEngine.elim_intros_simpl rendering_window
634 ;;
635 let whd rendering_window =
636  call_tactic_with_goal_input ProofEngine.whd rendering_window
637 ;;
638 let reduce rendering_window =
639  call_tactic_with_goal_input ProofEngine.reduce rendering_window
640 ;;
641 let simpl rendering_window =
642  call_tactic_with_goal_input ProofEngine.simpl rendering_window
643 ;;
644 let fold rendering_window =
645  call_tactic_with_input ProofEngine.fold rendering_window
646 ;;
647 let cut rendering_window =
648  call_tactic_with_input ProofEngine.cut rendering_window
649 ;;
650 let change rendering_window =
651  call_tactic_with_input_and_goal_input ProofEngine.change rendering_window
652 ;;
653 let letin rendering_window =
654  call_tactic_with_input ProofEngine.letin rendering_window
655 ;;
656 let clearbody rendering_window =
657  call_tactic_with_hypothesis_input ProofEngine.clearbody rendering_window
658 ;;
659 let clear rendering_window =
660  call_tactic_with_hypothesis_input ProofEngine.clear rendering_window
661 ;;
662
663
664 let whd_in_scratch scratch_window =
665  call_tactic_with_goal_input_in_scratch ProofEngine.whd_in_scratch
666   scratch_window
667 ;;
668 let reduce_in_scratch scratch_window =
669  call_tactic_with_goal_input_in_scratch ProofEngine.reduce_in_scratch
670   scratch_window
671 ;;
672 let simpl_in_scratch scratch_window =
673  call_tactic_with_goal_input_in_scratch ProofEngine.simpl_in_scratch
674   scratch_window
675 ;;
676
677
678
679 (**********************)
680 (*   END OF TACTICS   *)
681 (**********************)
682
683 exception OpenConjecturesStillThere;;
684 exception WrongProof;;
685
686 let qed rendering_window () =
687  match !ProofEngine.proof with
688     None -> assert false
689   | Some (uri,[],bo,ty) ->
690      if
691       CicReduction.are_convertible []
692        (CicTypeChecker.type_of_aux' [] [] bo) ty
693      then
694       begin
695        (*CSC: Wrong: [] is just plainly wrong *)
696        let proof = Cic.Definition (UriManager.name_of_uri uri,bo,ty,[]) in
697         let
698          (acic,ids_to_terms,ids_to_father_ids,ids_to_inner_sorts,
699           ids_to_inner_types,ids_to_conjectures,ids_to_hypotheses)
700         =
701          Cic2acic.acic_object_of_cic_object proof
702         in
703          let mml =
704           mml_of_cic_object uri acic ids_to_inner_sorts ids_to_inner_types
705          in
706           (rendering_window#output : GMathView.math_view)#load_tree mml ;
707           current_cic_infos :=
708            Some
709             (ids_to_terms,ids_to_father_ids,ids_to_conjectures,
710              ids_to_hypotheses)
711       end
712      else
713       raise WrongProof
714   | _ -> raise OpenConjecturesStillThere
715 ;;
716
717 (*????
718 let dtdname = "http://www.cs.unibo.it/helm/dtd/cic.dtd";;
719 *)
720 let dtdname = "/projects/helm/V7/dtd/cic.dtd";;
721
722 let save rendering_window () =
723  let outputhtml = (rendering_window#outputhtml : GHtml.xmhtml) in
724   match !ProofEngine.proof with
725      None -> assert false
726    | Some (uri, metasenv, bo, ty) ->
727       let currentproof =
728        Cic.CurrentProof (UriManager.name_of_uri uri,metasenv,bo,ty)
729       in
730        let (acurrentproof,_,_,ids_to_inner_sorts,_,_,_) =
731         Cic2acic.acic_object_of_cic_object currentproof
732        in
733         let xml = Cic2Xml.print_object uri ids_to_inner_sorts acurrentproof in
734          let xml' =
735           [< Xml.xml_cdata "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n" ;
736              Xml.xml_cdata
737               ("<!DOCTYPE CurrentProof SYSTEM \"" ^ dtdname ^ "\">\n\n") ;
738              xml
739           >]
740          in
741           Xml.pp ~quiet:true xml' (Some "/public/sacerdot/currentproof") ;
742           output_html outputhtml
743            ("<h1 color=\"Green\">Current proof saved to " ^
744              "/public/sacerdot/currentproof</h1>")
745 ;;
746
747 let load rendering_window () =
748  let outputhtml = (rendering_window#outputhtml : GHtml.xmhtml) in
749  let output = (rendering_window#output : GMathView.math_view) in
750  let proofw = (rendering_window#proofw : GMathView.math_view) in
751   try
752    let uri = UriManager.uri_of_string "cic:/dummy.con" in
753     match CicParser.obj_of_xml "/public/sacerdot/currentproof" uri with
754        Cic.CurrentProof (_,metasenv,bo,ty) ->
755         ProofEngine.proof :=
756          Some (uri, metasenv, bo, ty) ;
757         ProofEngine.goal :=
758          (match metasenv with
759              [] -> None
760            | (metano,_,_)::_ -> Some metano
761          ) ;
762         refresh_proof output ;
763         refresh_sequent proofw ;
764          output_html outputhtml
765           ("<h1 color=\"Green\">Current proof loaded from " ^
766             "/public/sacerdot/currentproof</h1>")
767      | _ -> assert false
768   with
769      RefreshSequentException e ->
770       output_html outputhtml
771        ("<h1 color=\"red\">Exception raised during the refresh of the " ^
772         "sequent: " ^ Printexc.to_string e ^ "</h1>")
773    | RefreshProofException e ->
774       output_html outputhtml
775        ("<h1 color=\"red\">Exception raised during the refresh of the " ^
776         "proof: " ^ Printexc.to_string e ^ "</h1>")
777    | e ->
778       output_html outputhtml
779        ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>") ;
780 ;;
781
782 let proveit rendering_window () =
783  let module L = LogicalOperations in
784  let module G = Gdome in
785  let outputhtml = (rendering_window#outputhtml : GHtml.xmhtml) in
786   match rendering_window#output#get_selection with
787     Some node ->
788      let xpath =
789       ((node : Gdome.element)#getAttributeNS
790       (*CSC: OCAML DIVERGE
791       ((element : G.element)#getAttributeNS
792       *)
793         ~namespaceURI:helmns
794         ~localName:(G.domString "xref"))#to_string
795      in
796       if xpath = "" then assert false (* "ERROR: No xref found!!!" *)
797       else
798        begin
799         try
800          match !current_cic_infos with
801             Some (ids_to_terms, ids_to_father_ids, _, _) ->
802              let id = xpath in
803               L.to_sequent id ids_to_terms ids_to_father_ids ;
804               refresh_proof rendering_window#output ;
805               refresh_sequent rendering_window#proofw
806           | None -> assert false (* "ERROR: No current term!!!" *)
807         with
808            RefreshSequentException e ->
809             output_html outputhtml
810              ("<h1 color=\"red\">Exception raised during the refresh of the " ^
811               "sequent: " ^ Printexc.to_string e ^ "</h1>")
812          | RefreshProofException e ->
813             output_html outputhtml
814              ("<h1 color=\"red\">Exception raised during the refresh of the " ^
815               "proof: " ^ Printexc.to_string e ^ "</h1>")
816          | e ->
817             output_html outputhtml
818              ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>")
819        end
820   | None -> assert false (* "ERROR: No selection!!!" *)
821 ;;
822
823 let focus rendering_window () =
824  let module L = LogicalOperations in
825  let module G = Gdome in
826  let outputhtml = (rendering_window#outputhtml : GHtml.xmhtml) in
827   match rendering_window#output#get_selection with
828     Some node ->
829      let xpath =
830       ((node : Gdome.element)#getAttributeNS
831       (*CSC: OCAML DIVERGE
832       ((element : G.element)#getAttributeNS
833       *)
834         ~namespaceURI:helmns
835         ~localName:(G.domString "xref"))#to_string
836      in
837       if xpath = "" then assert false (* "ERROR: No xref found!!!" *)
838       else
839        begin
840         try
841          match !current_cic_infos with
842             Some (ids_to_terms, ids_to_father_ids, _, _) ->
843              let id = xpath in
844               L.focus id ids_to_terms ids_to_father_ids ;
845               refresh_sequent rendering_window#proofw
846           | None -> assert false (* "ERROR: No current term!!!" *)
847         with
848            RefreshSequentException e ->
849             output_html outputhtml
850              ("<h1 color=\"red\">Exception raised during the refresh of the " ^
851               "sequent: " ^ Printexc.to_string e ^ "</h1>")
852          | RefreshProofException e ->
853             output_html outputhtml
854              ("<h1 color=\"red\">Exception raised during the refresh of the " ^
855               "proof: " ^ Printexc.to_string e ^ "</h1>")
856          | e ->
857             output_html outputhtml
858              ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>")
859        end
860   | None -> assert false (* "ERROR: No selection!!!" *)
861 ;;
862
863 exception NoPrevGoal;;
864 exception NoNextGoal;;
865
866 let prevgoal metasenv metano =
867  let rec aux =
868   function
869      [] -> assert false
870    | [(m,_,_)] -> raise NoPrevGoal
871    | (n,_,_)::(m,_,_)::_ when m=metano -> n
872    | _::tl -> aux tl
873  in
874   aux metasenv
875 ;;
876
877 let nextgoal metasenv metano =
878  let rec aux =
879   function
880      [] -> assert false
881    | [(m,_,_)] when m = metano -> raise NoNextGoal
882    | (m,_,_)::(n,_,_)::_ when m=metano -> n
883    | _::tl -> aux tl
884  in
885   aux metasenv
886 ;;
887
888 let prev_or_next_goal select_goal rendering_window () =
889  let module L = LogicalOperations in
890  let module G = Gdome in
891  let outputhtml = (rendering_window#outputhtml : GHtml.xmhtml) in
892   let metasenv =
893    match !ProofEngine.proof with
894       None -> assert false
895     | Some (_,metasenv,_,_) -> metasenv
896   in
897   let metano =
898    match !ProofEngine.goal with
899       None -> assert false
900     | Some m -> m
901   in
902    try
903     ProofEngine.goal := Some (select_goal metasenv metano) ;
904     refresh_sequent rendering_window#proofw
905    with
906       RefreshSequentException e ->
907        output_html outputhtml
908         ("<h1 color=\"red\">Exception raised during the refresh of the " ^
909          "sequent: " ^ Printexc.to_string e ^ "</h1>")
910     | e ->
911        output_html outputhtml
912         ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>")
913 ;;
914
915 exception NotADefinition;;
916
917 let open_ rendering_window () =
918  let inputt = (rendering_window#inputt : GEdit.text) in
919  let oldinputt = (rendering_window#oldinputt : GEdit.text) in
920  let outputhtml = (rendering_window#outputhtml : GHtml.xmhtml) in
921  let output = (rendering_window#output : GMathView.math_view) in
922  let proofw = (rendering_window#proofw : GMathView.math_view) in
923   let inputlen = inputt#length in
924   let input = inputt#get_chars 0 inputlen ^ "\n" in
925    try
926     let uri = UriManager.uri_of_string ("cic:" ^ input) in
927      CicTypeChecker.typecheck uri ;
928      let metasenv,bo,ty =
929       match CicEnvironment.get_cooked_obj uri 0 with
930          Cic.Definition (_,bo,ty,_) -> [],bo,ty
931        | Cic.CurrentProof (_,metasenv,bo,ty) -> metasenv,bo,ty
932        | Cic.Axiom _
933        | Cic.Variable _
934        | Cic.InductiveDefinition _ -> raise NotADefinition
935      in
936       ProofEngine.proof :=
937        Some (uri, metasenv, bo, ty) ;
938       ProofEngine.goal := None ;
939       refresh_sequent proofw ;
940       refresh_proof output ;
941       inputt#delete_text 0 inputlen ;
942       ignore(oldinputt#insert_text input oldinputt#length)
943    with
944       RefreshSequentException e ->
945        output_html outputhtml
946         ("<h1 color=\"red\">Exception raised during the refresh of the " ^
947          "sequent: " ^ Printexc.to_string e ^ "</h1>")
948     | RefreshProofException e ->
949        output_html outputhtml
950         ("<h1 color=\"red\">Exception raised during the refresh of the " ^
951          "proof: " ^ Printexc.to_string e ^ "</h1>")
952     | e ->
953        output_html outputhtml
954         ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>") ;
955 ;;
956
957 let state rendering_window () =
958  let inputt = (rendering_window#inputt : GEdit.text) in
959  let oldinputt = (rendering_window#oldinputt : GEdit.text) in
960  let outputhtml = (rendering_window#outputhtml : GHtml.xmhtml) in
961  let output = (rendering_window#output : GMathView.math_view) in
962  let proofw = (rendering_window#proofw : GMathView.math_view) in
963   let inputlen = inputt#length in
964   let input = inputt#get_chars 0 inputlen ^ "\n" in
965    (* Do something interesting *)
966    let lexbuf = Lexing.from_string input in
967     try
968      while true do
969       (* Execute the actions *)
970       match CicTextualParser.main CicTextualLexer.token lexbuf with
971          None -> ()
972        | Some expr ->
973           let _  = CicTypeChecker.type_of_aux' [] [] expr in
974            ProofEngine.proof :=
975             Some (UriManager.uri_of_string "cic:/dummy.con",
976                    [1,[],expr], Cic.Meta (1,[]), expr) ;
977            ProofEngine.goal := Some 1 ;
978            refresh_sequent proofw ;
979            refresh_proof output ;
980      done
981     with
982        CicTextualParser0.Eof ->
983         inputt#delete_text 0 inputlen ;
984         ignore(oldinputt#insert_text input oldinputt#length)
985      | RefreshSequentException e ->
986         output_html outputhtml
987          ("<h1 color=\"red\">Exception raised during the refresh of the " ^
988           "sequent: " ^ Printexc.to_string e ^ "</h1>")
989      | RefreshProofException e ->
990         output_html outputhtml
991          ("<h1 color=\"red\">Exception raised during the refresh of the " ^
992           "proof: " ^ Printexc.to_string e ^ "</h1>")
993      | e ->
994         output_html outputhtml
995          ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>") ;
996 ;;
997
998 let check rendering_window scratch_window () =
999  let inputt = (rendering_window#inputt : GEdit.text) in
1000  let outputhtml = (rendering_window#outputhtml : GHtml.xmhtml) in
1001  let output = (rendering_window#output : GMathView.math_view) in
1002  let proofw = (rendering_window#proofw : GMathView.math_view) in
1003   let inputlen = inputt#length in
1004   let input = inputt#get_chars 0 inputlen ^ "\n" in
1005   let curi,metasenv =
1006    match !ProofEngine.proof with
1007       None -> UriManager.uri_of_string "cic:/dummy.con", []
1008     | Some (curi,metasenv,_,_) -> curi,metasenv
1009   in
1010   let context,names_context =
1011    let context =
1012     match !ProofEngine.goal with
1013        None -> []
1014      | Some metano ->
1015         let (_,canonical_context,_) =
1016          List.find (function (m,_,_) -> m=metano) metasenv
1017         in
1018          canonical_context
1019    in
1020     context,
1021     List.map
1022      (function
1023          Some (n,_) -> Some n
1024        | None -> None
1025      ) context
1026   in
1027    (* Do something interesting *)
1028    let lexbuf = Lexing.from_string input in
1029     try
1030      while true do
1031       (* Execute the actions *)
1032       match
1033        CicTextualParserContext.main curi names_context CicTextualLexer.token
1034         lexbuf
1035       with
1036          None -> ()
1037        | Some expr ->
1038           try
1039            let ty  = CicTypeChecker.type_of_aux' metasenv context expr in
1040             let mml = mml_of_cic_term 111 (Cic.Cast (expr,ty)) in
1041              scratch_window#show () ;
1042              scratch_window#mmlwidget#load_tree ~dom:mml
1043           with
1044            e ->
1045             print_endline ("? " ^ CicPp.ppterm expr) ;
1046             raise e
1047      done
1048     with
1049        CicTextualParser0.Eof -> ()
1050      | e ->
1051        output_html outputhtml
1052         ("<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>") ;
1053 ;;
1054
1055 let locate rendering_window () =
1056  let inputt = (rendering_window#inputt : GEdit.text) in
1057  let outputhtml = (rendering_window#outputhtml : GHtml.xmhtml) in
1058   let inputlen = inputt#length in
1059   let input = inputt#get_chars 0 inputlen in
1060   output_html outputhtml (
1061      try
1062         match Str.split (Str.regexp "[ \t]+") input with
1063            | [] -> ""
1064            | head :: tail ->
1065                inputt#delete_text 0 inputlen;
1066                Mquery.locate head 
1067      with
1068         e -> "<h1 color=\"red\">" ^ Printexc.to_string e ^ "</h1>"
1069   )
1070 ;;
1071
1072 let backward rendering_window () =
1073    let outputhtml = (rendering_window#outputhtml : GHtml.xmhtml) in
1074    let inputt = (rendering_window#inputt : GEdit.text) in
1075     let inputlen = inputt#length in
1076     let input = inputt#get_chars 0 inputlen in
1077     let level = int_of_string input in
1078     let metasenv =
1079      match !ProofEngine.proof with
1080         None -> assert false
1081       | Some (_,metasenv,_,_) -> metasenv
1082     in
1083     let result =
1084        match !ProofEngine.goal with
1085           | None -> ""
1086           | Some metano ->
1087              let (_,_,ty) =
1088               List.find (function (m,_,_) -> m=metano) metasenv
1089              in
1090               Mquery.backward ty level
1091        in 
1092    output_html outputhtml result
1093       
1094 let choose_selection
1095      (mmlwidget : GMathView.math_view) (element : Gdome.element option)
1096 =
1097  let module G = Gdome in
1098   let rec aux element =
1099    if element#hasAttributeNS
1100        ~namespaceURI:helmns
1101        ~localName:(G.domString "xref")
1102    then
1103      mmlwidget#set_selection (Some element)
1104    else
1105       match element#get_parentNode with
1106          None -> assert false
1107        (*CSC: OCAML DIVERGES!
1108        | Some p -> aux (new G.element_of_node p)
1109        *)
1110        | Some p -> aux (new Gdome.element_of_node p)
1111   in
1112    match element with
1113      Some x -> aux x
1114    | None   -> mmlwidget#set_selection None
1115 ;;
1116
1117 (* STUFF TO BUILD THE GTK INTERFACE *)
1118
1119 (* Stuff for the widget settings *)
1120
1121 let export_to_postscript (output : GMathView.math_view) () =
1122  output#export_to_postscript ~filename:"output.ps" ();
1123 ;;
1124
1125 let activate_t1 (output : GMathView.math_view) button_set_anti_aliasing
1126  button_set_kerning button_set_transparency button_export_to_postscript
1127  button_t1 ()
1128 =
1129  let is_set = button_t1#active in
1130   output#set_font_manager_type
1131    (if is_set then `font_manager_t1 else `font_manager_gtk) ;
1132   if is_set then
1133    begin
1134     button_set_anti_aliasing#misc#set_sensitive true ;
1135     button_set_kerning#misc#set_sensitive true ;
1136     button_set_transparency#misc#set_sensitive true ;
1137     button_export_to_postscript#misc#set_sensitive true ;
1138    end
1139   else
1140    begin
1141     button_set_anti_aliasing#misc#set_sensitive false ;
1142     button_set_kerning#misc#set_sensitive false ;
1143     button_set_transparency#misc#set_sensitive false ;
1144     button_export_to_postscript#misc#set_sensitive false ;
1145    end
1146 ;;
1147
1148 let set_anti_aliasing output button_set_anti_aliasing () =
1149  output#set_anti_aliasing button_set_anti_aliasing#active
1150 ;;
1151
1152 let set_kerning output button_set_kerning () =
1153  output#set_kerning button_set_kerning#active
1154 ;;
1155
1156 let set_transparency output button_set_transparency () =
1157  output#set_transparency button_set_transparency#active
1158 ;;
1159
1160 let changefont output font_size_spinb () =
1161  output#set_font_size font_size_spinb#value_as_int
1162 ;;
1163
1164 let set_log_verbosity output log_verbosity_spinb () =
1165  output#set_log_verbosity log_verbosity_spinb#value_as_int
1166 ;;
1167
1168 class settings_window (output : GMathView.math_view) sw
1169  button_export_to_postscript selection_changed_callback
1170 =
1171  let settings_window = GWindow.window ~title:"GtkMathView settings" () in
1172  let vbox =
1173   GPack.vbox ~packing:settings_window#add () in
1174  let table =
1175   GPack.table
1176    ~rows:1 ~columns:3 ~homogeneous:false ~row_spacings:5 ~col_spacings:5
1177    ~border_width:5 ~packing:vbox#add () in
1178  let button_t1 =
1179   GButton.toggle_button ~label:"activate t1 fonts"
1180    ~packing:(table#attach ~left:0 ~top:0) () in
1181  let button_set_anti_aliasing =
1182   GButton.toggle_button ~label:"set_anti_aliasing"
1183    ~packing:(table#attach ~left:0 ~top:1) () in
1184  let button_set_kerning =
1185   GButton.toggle_button ~label:"set_kerning"
1186    ~packing:(table#attach ~left:1 ~top:1) () in
1187  let button_set_transparency =
1188   GButton.toggle_button ~label:"set_transparency"
1189    ~packing:(table#attach ~left:2 ~top:1) () in
1190  let table =
1191   GPack.table
1192    ~rows:2 ~columns:2 ~homogeneous:false ~row_spacings:5 ~col_spacings:5
1193    ~border_width:5 ~packing:vbox#add () in
1194  let font_size_label =
1195   GMisc.label ~text:"font size:"
1196    ~packing:(table#attach ~left:0 ~top:0 ~expand:`NONE) () in
1197  let font_size_spinb =
1198   let sadj =
1199    GData.adjustment ~value:14.0 ~lower:5.0 ~upper:50.0 ~step_incr:1.0 ()
1200   in
1201    GEdit.spin_button 
1202     ~adjustment:sadj ~packing:(table#attach ~left:1 ~top:0 ~fill:`NONE) () in
1203  let log_verbosity_label =
1204   GMisc.label ~text:"log verbosity:"
1205    ~packing:(table#attach ~left:0 ~top:1) () in
1206  let log_verbosity_spinb =
1207   let sadj =
1208    GData.adjustment ~value:0.0 ~lower:0.0 ~upper:3.0 ~step_incr:1.0 ()
1209   in
1210    GEdit.spin_button 
1211     ~adjustment:sadj ~packing:(table#attach ~left:1 ~top:1) () in
1212  let hbox =
1213   GPack.hbox ~packing:(vbox#pack ~expand:false ~fill:false ~padding:5) () in
1214  let closeb =
1215   GButton.button ~label:"Close"
1216    ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
1217 object(self)
1218  method show = settings_window#show
1219  initializer
1220   button_set_anti_aliasing#misc#set_sensitive false ;
1221   button_set_kerning#misc#set_sensitive false ;
1222   button_set_transparency#misc#set_sensitive false ;
1223   (* Signals connection *)
1224   ignore(button_t1#connect#clicked
1225    (activate_t1 output button_set_anti_aliasing button_set_kerning
1226     button_set_transparency button_export_to_postscript button_t1)) ;
1227   ignore(font_size_spinb#connect#changed (changefont output font_size_spinb)) ;
1228   ignore(button_set_anti_aliasing#connect#toggled
1229    (set_anti_aliasing output button_set_anti_aliasing));
1230   ignore(button_set_kerning#connect#toggled
1231    (set_kerning output button_set_kerning)) ;
1232   ignore(button_set_transparency#connect#toggled
1233    (set_transparency output button_set_transparency)) ;
1234   ignore(log_verbosity_spinb#connect#changed
1235    (set_log_verbosity output log_verbosity_spinb)) ;
1236   ignore(closeb#connect#clicked settings_window#misc#hide)
1237 end;;
1238
1239 (* Scratch window *)
1240
1241 class scratch_window outputhtml =
1242  let window =
1243   GWindow.window ~title:"MathML viewer" ~border_width:2 () in
1244  let vbox =
1245   GPack.vbox ~packing:window#add () in
1246  let hbox =
1247   GPack.hbox ~packing:(vbox#pack ~expand:false ~fill:false ~padding:5) () in
1248  let whdb =
1249   GButton.button ~label:"Whd"
1250    ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
1251  let reduceb =
1252   GButton.button ~label:"Reduce"
1253    ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
1254  let simplb =
1255   GButton.button ~label:"Simpl"
1256    ~packing:(hbox#pack ~expand:false ~fill:false ~padding:5) () in
1257  let scrolled_window =
1258   GBin.scrolled_window ~border_width:10
1259    ~packing:(vbox#pack ~expand:true ~padding:5) () in
1260  let mmlwidget =
1261   GMathView.math_view
1262    ~packing:(scrolled_window#add) ~width:400 ~height:280 () in
1263 object(self)
1264  method outputhtml = outputhtml
1265  method mmlwidget = mmlwidget
1266  method show () = window#misc#hide () ; window#show ()
1267  initializer
1268   ignore(mmlwidget#connect#selection_changed (choose_selection mmlwidget)) ;
1269   ignore(window#event#connect#delete (fun _ -> window#misc#hide () ; true )) ;
1270   ignore(whdb#connect#clicked (whd_in_scratch self)) ;
1271   ignore(reduceb#connect#clicked (reduce_in_scratch self)) ;
1272   ignore(simplb#connect#clicked (simpl_in_scratch self))
1273 end;;
1274
1275 (* Main window *)
1276
1277 class rendering_window output proofw (label : GMisc.label) =
1278  let window =
1279   GWindow.window ~title:"MathML viewer" ~border_width:2 () in
1280  let hbox0 =
1281   GPack.hbox ~packing:window#add () in
1282  let vbox =
1283   GPack.vbox ~packing:(hbox0#pack ~expand:false ~fill:false ~padding:5) () in
1284  let _ = vbox#pack ~expand:false ~fill:false ~padding:5 label#coerce in
1285  let scrolled_window0 =
1286   GBin.scrolled_window ~border_width:10
1287    ~packing:(vbox#pack ~expand:true ~padding:5) () in
1288  let _ = scrolled_window0#add output#coerce in
1289  let hbox1 =
1290   GPack.hbox ~packing:(vbox#pack ~expand:false ~fill:false ~padding:5) () in
1291  let settingsb =
1292   GButton.button ~label:"Settings"
1293    ~packing:(hbox1#pack ~expand:false ~fill:false ~padding:5) () in
1294  let button_export_to_postscript =
1295   GButton.button ~label:"export_to_postscript"
1296   ~packing:(hbox1#pack ~expand:false ~fill:false ~padding:5) () in
1297  let qedb =
1298   GButton.button ~label:"Qed"
1299    ~packing:(hbox1#pack ~expand:false ~fill:false ~padding:5) () in
1300  let saveb =
1301   GButton.button ~label:"Save"
1302    ~packing:(hbox1#pack ~expand:false ~fill:false ~padding:5) () in
1303  let loadb =
1304   GButton.button ~label:"Load"
1305    ~packing:(hbox1#pack ~expand:false ~fill:false ~padding:5) () in
1306  let closeb =
1307   GButton.button ~label:"Close"
1308    ~packing:(hbox1#pack ~expand:false ~fill:false ~padding:5) () in
1309  let hbox2 =
1310   GPack.hbox ~packing:(vbox#pack ~expand:false ~fill:false ~padding:5) () in
1311  let proveitb =
1312   GButton.button ~label:"Prove It"
1313    ~packing:(hbox2#pack ~expand:false ~fill:false ~padding:5) () in
1314  let focusb =
1315   GButton.button ~label:"Focus"
1316    ~packing:(hbox2#pack ~expand:false ~fill:false ~padding:5) () in
1317  let prevgoalb =
1318   GButton.button ~label:"<"
1319    ~packing:(hbox2#pack ~expand:false ~fill:false ~padding:5) () in
1320  let nextgoalb =
1321   GButton.button ~label:">"
1322    ~packing:(hbox2#pack ~expand:false ~fill:false ~padding:5) () in
1323  let oldinputt = GEdit.text ~editable:false ~width:400 ~height:180
1324    ~packing:(vbox#pack ~padding:5) () in
1325  let hbox4 =
1326   GPack.hbox ~packing:(vbox#pack ~expand:false ~fill:false ~padding:5) () in
1327  let stateb =
1328   GButton.button ~label:"State"
1329    ~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
1330  let openb =
1331   GButton.button ~label:"Open"
1332    ~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
1333  let checkb =
1334   GButton.button ~label:"Check"
1335    ~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
1336  let locateb =
1337   GButton.button ~label:"Locate"
1338    ~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
1339  let backwardb =
1340   GButton.button ~label:"Backward"
1341    ~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
1342  let inputt = GEdit.text ~editable:true ~width:400 ~height: 100
1343    ~packing:(vbox#pack ~padding:5) () in
1344  let vbox1 =
1345   GPack.vbox ~packing:(hbox0#pack ~expand:false ~fill:false ~padding:5) () in
1346  let scrolled_window1 =
1347   GBin.scrolled_window ~border_width:10
1348    ~packing:(vbox1#pack ~expand:true ~padding:5) () in
1349  let _ = scrolled_window1#add proofw#coerce in
1350  let hbox3 =
1351   GPack.hbox ~packing:(vbox1#pack ~expand:false ~fill:false ~padding:5) () in
1352  let exactb =
1353   GButton.button ~label:"Exact"
1354    ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
1355  let introsb =
1356   GButton.button ~label:"Intros"
1357    ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
1358  let applyb =
1359   GButton.button ~label:"Apply"
1360    ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
1361  let elimintrossimplb =
1362   GButton.button ~label:"ElimIntrosSimpl"
1363    ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
1364  let whdb =
1365   GButton.button ~label:"Whd"
1366    ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
1367  let reduceb =
1368   GButton.button ~label:"Reduce"
1369    ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
1370  let simplb =
1371   GButton.button ~label:"Simpl"
1372    ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
1373  let foldb =
1374   GButton.button ~label:"Fold"
1375    ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
1376  let cutb =
1377   GButton.button ~label:"Cut"
1378    ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
1379  let changeb =
1380   GButton.button ~label:"Change"
1381    ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
1382  let letinb =
1383   GButton.button ~label:"Let ... In"
1384    ~packing:(hbox3#pack ~expand:false ~fill:false ~padding:5) () in
1385  let hbox4 =
1386   GPack.hbox ~packing:(vbox1#pack ~expand:false ~fill:false ~padding:5) () in
1387  let clearbodyb =
1388   GButton.button ~label:"ClearBody"
1389    ~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
1390  let clearb =
1391   GButton.button ~label:"Clear"
1392    ~packing:(hbox4#pack ~expand:false ~fill:false ~padding:5) () in
1393  let outputhtml =
1394   GHtml.xmhtml
1395    ~source:"<html><body bgColor=\"white\"></body></html>"
1396    ~width:400 ~height: 200
1397    ~packing:(vbox1#pack ~expand:false ~fill:false ~padding:5)
1398    ~show:true () in
1399  let scratch_window = new scratch_window outputhtml in
1400 object(self)
1401  method outputhtml = outputhtml
1402  method oldinputt = oldinputt
1403  method inputt = inputt
1404  method output = (output : GMathView.math_view)
1405  method proofw = (proofw : GMathView.math_view)
1406  method show = window#show
1407  initializer
1408   button_export_to_postscript#misc#set_sensitive false ;
1409
1410   (* signal handlers here *)
1411   ignore(output#connect#selection_changed
1412    (function elem -> proofw#unload ; choose_selection output elem)) ;
1413   ignore(proofw#connect#selection_changed (choose_selection proofw)) ;
1414   ignore(closeb#connect#clicked (fun _ -> GMain.Main.quit ())) ;
1415   let settings_window = new settings_window output scrolled_window0
1416    button_export_to_postscript (choose_selection output) in
1417   ignore(settingsb#connect#clicked settings_window#show) ;
1418   ignore(button_export_to_postscript#connect#clicked (export_to_postscript output)) ;
1419   ignore(qedb#connect#clicked (qed self)) ;
1420   ignore(saveb#connect#clicked (save self)) ;
1421   ignore(loadb#connect#clicked (load self)) ;
1422   ignore(proveitb#connect#clicked (proveit self)) ;
1423   ignore(focusb#connect#clicked (focus self)) ;
1424   ignore(prevgoalb#connect#clicked (prev_or_next_goal prevgoal self)) ;
1425   ignore(nextgoalb#connect#clicked (prev_or_next_goal nextgoal self)) ;
1426   ignore(window#event#connect#delete (fun _ -> GMain.Main.quit () ; true )) ;
1427   ignore(stateb#connect#clicked (state self)) ;
1428   ignore(openb#connect#clicked (open_ self)) ;
1429   ignore(checkb#connect#clicked (check self scratch_window)) ;
1430   ignore(locateb#connect#clicked (locate self)) ;
1431   ignore(backwardb#connect#clicked (backward self)) ;
1432   ignore(exactb#connect#clicked (exact self)) ;
1433   ignore(applyb#connect#clicked (apply self)) ;
1434   ignore(elimintrossimplb#connect#clicked (elimintrossimpl self)) ;
1435   ignore(whdb#connect#clicked (whd self)) ;
1436   ignore(reduceb#connect#clicked (reduce self)) ;
1437   ignore(simplb#connect#clicked (simpl self)) ;
1438   ignore(foldb#connect#clicked (fold self)) ;
1439   ignore(cutb#connect#clicked (cut self)) ;
1440   ignore(changeb#connect#clicked (change self)) ;
1441   ignore(letinb#connect#clicked (letin self)) ;
1442   ignore(clearbodyb#connect#clicked (clearbody self)) ;
1443   ignore(clearb#connect#clicked (clear self)) ;
1444   ignore(introsb#connect#clicked (intros self)) ;
1445   Logger.log_callback :=
1446    (Logger.log_to_html ~print_and_flush:(output_html outputhtml))
1447 end;;
1448
1449 (* MAIN *)
1450
1451 let initialize_everything () =
1452  let module U = Unix in
1453   let output = GMathView.math_view ~width:400 ~height:280 ()
1454   and proofw = GMathView.math_view ~width:400 ~height:275 ()
1455   and label = GMisc.label ~text:"gTopLevel" () in
1456     let rendering_window =
1457      new rendering_window output proofw label
1458     in
1459      rendering_window#show () ;
1460      GMain.Main.main ()
1461 ;;
1462
1463 let _ =
1464  CicCooking.init () ;
1465  Mquery.init () ;
1466  ignore (GtkMain.Main.init ()) ;
1467  initialize_everything () ;
1468  Mquery.close ()
1469 ;;