From 8feb1cda5703daa4371c556593bab63514423a58 Mon Sep 17 00:00:00 2001 From: Stefano Zacchiroli Date: Thu, 2 Feb 2006 18:42:41 +0000 Subject: [PATCH] daemons tamed --- daemons/graphs/jsmenu/HM_Arrays.js | 250 + daemons/graphs/jsmenu/HM_Arrays_prova.js | 60 + daemons/graphs/jsmenu/HM_Loader.js | 89 + daemons/graphs/jsmenu/HM_Loader_prova.js | 89 + daemons/graphs/jsmenu/HM_More_black_left.gif | Bin 0 -> 53 bytes daemons/graphs/jsmenu/HM_More_black_right.gif | Bin 0 -> 53 bytes daemons/graphs/jsmenu/HM_More_blue_left.gif | Bin 0 -> 53 bytes daemons/graphs/jsmenu/HM_More_blue_right.gif | Bin 0 -> 53 bytes daemons/graphs/jsmenu/HM_More_cyan_left.gif | Bin 0 -> 53 bytes daemons/graphs/jsmenu/HM_More_cyan_right.gif | Bin 0 -> 53 bytes daemons/graphs/jsmenu/HM_More_green_left.gif | Bin 0 -> 53 bytes daemons/graphs/jsmenu/HM_More_green_right.gif | Bin 0 -> 53 bytes .../graphs/jsmenu/HM_More_magenta_left.gif | Bin 0 -> 53 bytes .../graphs/jsmenu/HM_More_magenta_right.gif | Bin 0 -> 53 bytes daemons/graphs/jsmenu/HM_More_red_left.gif | Bin 0 -> 53 bytes daemons/graphs/jsmenu/HM_More_red_right.gif | Bin 0 -> 53 bytes daemons/graphs/jsmenu/HM_More_white_left.gif | Bin 0 -> 53 bytes daemons/graphs/jsmenu/HM_More_white_right.gif | Bin 0 -> 53 bytes daemons/graphs/jsmenu/HM_More_yellow_left.gif | Bin 0 -> 53 bytes .../graphs/jsmenu/HM_More_yellow_right.gif | Bin 0 -> 53 bytes daemons/graphs/jsmenu/HM_ScriptDOM.js | 962 ++++ daemons/graphs/jsmenu/HM_ScriptIE4.js | 867 ++++ daemons/graphs/jsmenu/HM_ScriptNS4.js | 805 ++++ daemons/graphs/jsmenu/LoadMe.html | 99 + daemons/graphs/jsmenu/prova.gif | Bin 0 -> 11995 bytes daemons/graphs/jsmenu/prova.html | 87 + daemons/graphs/tools/.cvsignore | 7 + daemons/graphs/tools/Makefile | 60 + .../graphs/tools/drawGraph.conf.xml.sample | 7 + daemons/graphs/tools/drawGraph.ml | 101 + daemons/graphs/tools/mk_html.pl | 47 + daemons/graphs/tools/simplify_deps/.cvsignore | 5 + daemons/graphs/tools/simplify_deps/Makefile | 12 + .../tools/simplify_deps/simplify_deps.ml | 102 + .../graphs/tools/uriSetQueue.conf.xml.sample | 6 + daemons/graphs/tools/uriSetQueue.ml | 190 + daemons/http_getter/.cvsignore | 14 + daemons/http_getter/AUTHORS | 11 + daemons/http_getter/BUGS | 0 daemons/http_getter/COPYING | 340 ++ daemons/http_getter/ChangeLog | 6 + daemons/http_getter/Makefile | 31 + daemons/http_getter/Makefile.overrides | 2 + daemons/http_getter/NEWS | 13 + daemons/http_getter/README | 7 + daemons/http_getter/buildTimeOpts.ml.in | 3 + daemons/http_getter/configure.ac | 13 + .../http_getter/http_getter.conf.xml.sample | 11 + daemons/http_getter/main.ml | 352 ++ daemons/http_getter/panel/.cvsignore | 1 + daemons/http_getter/panel/Makefile | 12 + daemons/http_getter/panel/control.html | 129 + daemons/http_getter/panel/control.js | 35 + daemons/http_getter/panel/index.html | 8 + daemons/http_getter/panel/welcome.html | 6 + daemons/http_getter/tools/dump_db.ml | 6 + daemons/http_getter/tools/dump_db.pl | 19 + daemons/http_getter/tools/uri_escape.pl | 16 + daemons/http_getter/tools/uri_unescape.pl | 15 + daemons/proofChecker/.cvsignore | 1 + daemons/proofChecker/.depend | 0 daemons/proofChecker/Makefile | 47 + .../proofChecker/proofChecker.conf.xml.sample | 11 + daemons/proofChecker/proofChecker.ml | 133 + daemons/rdfly/.cvsignore | 1 + daemons/rdfly/Makefile | 39 + daemons/rdfly/rdfly.conf.xml.sample | 12 + daemons/rdfly/rdfly.ml | 192 + daemons/uwobo/.cvsignore | 7 + daemons/uwobo/.depend | 18 + daemons/uwobo/Makefile | 68 + daemons/uwobo/doc/uwobo.tex | 216 + daemons/uwobo/log/.cvsignore | 1 + daemons/uwobo/panel/.cvsignore | 1 + daemons/uwobo/panel/Makefile | 11 + daemons/uwobo/panel/control.html | 638 +++ daemons/uwobo/panel/control.js | 234 + daemons/uwobo/panel/index.html | 8 + daemons/uwobo/panel/welcome.html | 6 + daemons/uwobo/uwobo.conf.xml.sample | 14 + daemons/uwobo/uwobo.ml | 817 ++++ daemons/uwobo/uwobo_common.ml | 243 + daemons/uwobo/uwobo_common.mli | 75 + daemons/uwobo/uwobo_engine.ml | 263 ++ daemons/uwobo/uwobo_engine.mli | 55 + daemons/uwobo/uwobo_logger.ml | 107 + daemons/uwobo/uwobo_logger.mli | 69 + daemons/uwobo/uwobo_profiles.ml | 151 + daemons/uwobo/uwobo_profiles.mli | 56 + daemons/uwobo/uwobo_styles.ml | 208 + daemons/uwobo/uwobo_styles.mli | 84 + daemons/whelp/.cvsignore | 1 + daemons/whelp/.depend | 4 + daemons/whelp/Makefile | 45 + daemons/whelp/html/Makefile | 7 + daemons/whelp/html/includes.xsl | 15 + daemons/whelp/html/manual/alias.jpg | Bin 0 -> 29673 bytes daemons/whelp/html/manual/ex1.jpg | Bin 0 -> 23989 bytes daemons/whelp/html/manual/frames.jpg | Bin 0 -> 44022 bytes daemons/whelp/html/manual/index.html | 40 + daemons/whelp/html/moogle.html.src | 21 + daemons/whelp/html/moogle.png | Bin 0 -> 16808 bytes daemons/whelp/html/moogle_chat.html.src | 39 + daemons/whelp/html/moogle_form.html.src | 49 + daemons/whelp/html/moogle_header.html.src | 45 + daemons/whelp/html/moogle_help.html | 25 + daemons/whelp/html/moogle_init.html | 106 + daemons/whelp/html/moogle_querybar.html.src | 15 + daemons/whelp/html/moogle_small.png | Bin 0 -> 7599 bytes daemons/whelp/html/moogle_syntax.html | 98 + daemons/whelp/html/moogle_trailer.html.src | 9 + daemons/whelp/html/whelp.png | Bin 0 -> 12096 bytes daemons/whelp/html/whelp.svg | 164 + daemons/whelp/html/whelp_small.png | Bin 0 -> 3092 bytes daemons/whelp/mooglePp.ml | 83 + daemons/whelp/mooglePp.mli | 35 + daemons/whelp/preloaded_uris.txt | 4130 +++++++++++++++++ daemons/whelp/searchEngine.conf.xml.sample | 62 + daemons/whelp/searchEngine.ml | 505 ++ 119 files changed, 14179 insertions(+) create mode 100644 daemons/graphs/jsmenu/HM_Arrays.js create mode 100644 daemons/graphs/jsmenu/HM_Arrays_prova.js create mode 100644 daemons/graphs/jsmenu/HM_Loader.js create mode 100644 daemons/graphs/jsmenu/HM_Loader_prova.js create mode 100644 daemons/graphs/jsmenu/HM_More_black_left.gif create mode 100644 daemons/graphs/jsmenu/HM_More_black_right.gif create mode 100644 daemons/graphs/jsmenu/HM_More_blue_left.gif create mode 100644 daemons/graphs/jsmenu/HM_More_blue_right.gif create mode 100644 daemons/graphs/jsmenu/HM_More_cyan_left.gif create mode 100644 daemons/graphs/jsmenu/HM_More_cyan_right.gif create mode 100644 daemons/graphs/jsmenu/HM_More_green_left.gif create mode 100644 daemons/graphs/jsmenu/HM_More_green_right.gif create mode 100644 daemons/graphs/jsmenu/HM_More_magenta_left.gif create mode 100644 daemons/graphs/jsmenu/HM_More_magenta_right.gif create mode 100644 daemons/graphs/jsmenu/HM_More_red_left.gif create mode 100644 daemons/graphs/jsmenu/HM_More_red_right.gif create mode 100644 daemons/graphs/jsmenu/HM_More_white_left.gif create mode 100644 daemons/graphs/jsmenu/HM_More_white_right.gif create mode 100644 daemons/graphs/jsmenu/HM_More_yellow_left.gif create mode 100644 daemons/graphs/jsmenu/HM_More_yellow_right.gif create mode 100644 daemons/graphs/jsmenu/HM_ScriptDOM.js create mode 100644 daemons/graphs/jsmenu/HM_ScriptIE4.js create mode 100644 daemons/graphs/jsmenu/HM_ScriptNS4.js create mode 100644 daemons/graphs/jsmenu/LoadMe.html create mode 100644 daemons/graphs/jsmenu/prova.gif create mode 100644 daemons/graphs/jsmenu/prova.html create mode 100644 daemons/graphs/tools/.cvsignore create mode 100644 daemons/graphs/tools/Makefile create mode 100644 daemons/graphs/tools/drawGraph.conf.xml.sample create mode 100644 daemons/graphs/tools/drawGraph.ml create mode 100755 daemons/graphs/tools/mk_html.pl create mode 100644 daemons/graphs/tools/simplify_deps/.cvsignore create mode 100644 daemons/graphs/tools/simplify_deps/Makefile create mode 100644 daemons/graphs/tools/simplify_deps/simplify_deps.ml create mode 100644 daemons/graphs/tools/uriSetQueue.conf.xml.sample create mode 100644 daemons/graphs/tools/uriSetQueue.ml create mode 100644 daemons/http_getter/.cvsignore create mode 100644 daemons/http_getter/AUTHORS create mode 100644 daemons/http_getter/BUGS create mode 100644 daemons/http_getter/COPYING create mode 100644 daemons/http_getter/ChangeLog create mode 100644 daemons/http_getter/Makefile create mode 100644 daemons/http_getter/Makefile.overrides create mode 100644 daemons/http_getter/NEWS create mode 100644 daemons/http_getter/README create mode 100644 daemons/http_getter/buildTimeOpts.ml.in create mode 100644 daemons/http_getter/configure.ac create mode 100644 daemons/http_getter/http_getter.conf.xml.sample create mode 100644 daemons/http_getter/main.ml create mode 100644 daemons/http_getter/panel/.cvsignore create mode 100644 daemons/http_getter/panel/Makefile create mode 100644 daemons/http_getter/panel/control.html create mode 100644 daemons/http_getter/panel/control.js create mode 100644 daemons/http_getter/panel/index.html create mode 100644 daemons/http_getter/panel/welcome.html create mode 100755 daemons/http_getter/tools/dump_db.ml create mode 100755 daemons/http_getter/tools/dump_db.pl create mode 100755 daemons/http_getter/tools/uri_escape.pl create mode 100755 daemons/http_getter/tools/uri_unescape.pl create mode 100644 daemons/proofChecker/.cvsignore create mode 100644 daemons/proofChecker/.depend create mode 100644 daemons/proofChecker/Makefile create mode 100644 daemons/proofChecker/proofChecker.conf.xml.sample create mode 100644 daemons/proofChecker/proofChecker.ml create mode 100644 daemons/rdfly/.cvsignore create mode 100644 daemons/rdfly/Makefile create mode 100644 daemons/rdfly/rdfly.conf.xml.sample create mode 100644 daemons/rdfly/rdfly.ml create mode 100644 daemons/uwobo/.cvsignore create mode 100644 daemons/uwobo/.depend create mode 100644 daemons/uwobo/Makefile create mode 100644 daemons/uwobo/doc/uwobo.tex create mode 100644 daemons/uwobo/log/.cvsignore create mode 100644 daemons/uwobo/panel/.cvsignore create mode 100644 daemons/uwobo/panel/Makefile create mode 100644 daemons/uwobo/panel/control.html create mode 100644 daemons/uwobo/panel/control.js create mode 100644 daemons/uwobo/panel/index.html create mode 100644 daemons/uwobo/panel/welcome.html create mode 100644 daemons/uwobo/uwobo.conf.xml.sample create mode 100644 daemons/uwobo/uwobo.ml create mode 100644 daemons/uwobo/uwobo_common.ml create mode 100644 daemons/uwobo/uwobo_common.mli create mode 100644 daemons/uwobo/uwobo_engine.ml create mode 100644 daemons/uwobo/uwobo_engine.mli create mode 100644 daemons/uwobo/uwobo_logger.ml create mode 100644 daemons/uwobo/uwobo_logger.mli create mode 100644 daemons/uwobo/uwobo_profiles.ml create mode 100644 daemons/uwobo/uwobo_profiles.mli create mode 100644 daemons/uwobo/uwobo_styles.ml create mode 100644 daemons/uwobo/uwobo_styles.mli create mode 100644 daemons/whelp/.cvsignore create mode 100644 daemons/whelp/.depend create mode 100644 daemons/whelp/Makefile create mode 100644 daemons/whelp/html/Makefile create mode 100644 daemons/whelp/html/includes.xsl create mode 100644 daemons/whelp/html/manual/alias.jpg create mode 100644 daemons/whelp/html/manual/ex1.jpg create mode 100644 daemons/whelp/html/manual/frames.jpg create mode 100644 daemons/whelp/html/manual/index.html create mode 100644 daemons/whelp/html/moogle.html.src create mode 100644 daemons/whelp/html/moogle.png create mode 100644 daemons/whelp/html/moogle_chat.html.src create mode 100644 daemons/whelp/html/moogle_form.html.src create mode 100644 daemons/whelp/html/moogle_header.html.src create mode 100644 daemons/whelp/html/moogle_help.html create mode 100644 daemons/whelp/html/moogle_init.html create mode 100644 daemons/whelp/html/moogle_querybar.html.src create mode 100644 daemons/whelp/html/moogle_small.png create mode 100644 daemons/whelp/html/moogle_syntax.html create mode 100644 daemons/whelp/html/moogle_trailer.html.src create mode 100644 daemons/whelp/html/whelp.png create mode 100644 daemons/whelp/html/whelp.svg create mode 100644 daemons/whelp/html/whelp_small.png create mode 100644 daemons/whelp/mooglePp.ml create mode 100644 daemons/whelp/mooglePp.mli create mode 100644 daemons/whelp/preloaded_uris.txt create mode 100644 daemons/whelp/searchEngine.conf.xml.sample create mode 100644 daemons/whelp/searchEngine.ml diff --git a/daemons/graphs/jsmenu/HM_Arrays.js b/daemons/graphs/jsmenu/HM_Arrays.js new file mode 100644 index 000000000..467506c3d --- /dev/null +++ b/daemons/graphs/jsmenu/HM_Arrays.js @@ -0,0 +1,250 @@ + +HM_Array1 = [ +[150,,, +,,,,,,,,,,,,,,,, +1,true], +["Experts","http://www.webreference.com/experts/",1,0,1], +["Contents","http://www.webreference.com/index2.html",1,0,0], +["Services","http://www.webreference.com/index2.html",1,0,1], +["About","http://www.webreference.com/about.html",1,0,0], +["Hot Sites","http://www.webreference.com/hot/",1,0,1] +] + +HM_Array1_1 = [ +[], +["3-D Animation","http://www.webreference.com/3d/",1,0,0], +["Design","http://www.webreference.com/dlab/",1,0,0], +["HTML","http://www.webreference.com/html/",1,0,0], +["JavaScript","http://www.webreference.com/js/",1,0,0], +["Graphics","http://www.webreference.com/graphics/",1,0,0], +["DHTML","http://www.webreference.com/dhtml/",1,0,1], +["Perl","http://www.webreference.com/perl/",1,0,0], +["XML","http://www.webreference.com/xml/",1,0,0] +] + +HM_Array1_3 = [ +[], +["Features","http://www.webreference.com/articles.html",1,0,0], +["Forum","http://www.webreference.com/cgi-bin/Ultimate.cgi?action=intro",1,0,0], +["How-to","http://www.webreference.com/dev/",1,0,0], +["New","http://www.webreference.com/headlines/",1,0,0], +["Hot Sites","http://www.webreference.com/hot/",1,0,0] +] + +HM_Array1_5 = [ +[], +["3-D Animation","http://www.webreference.com/3d/",1,0,0], +["Design","http://www.webreference.com/dlab/",1,0,0], +["HTML","http://www.webreference.com/html/",1,0,0], +["JavaScript","http://www.webreference.com/js/",1,0,0], +["Graphics","http://www.webreference.com/graphics/",1,0,0], +["DHTML","http://www.webreference.com/dhtml/",1,0,1], +["Perl","http://www.webreference.com/perl/",1,0,0], +["XML","http://www.webreference.com/xml/",1,0,0] +] + +HM_Array1_1_6 = [ +[], +["Diner","http://www.webreference.com/dhtml/diner/",1,0,0], +["Dynomat","http://www.webreference.com/dhtml/dynomat/",1,0,0], +["Links","http://www.webreference.com/dhtml/links/",1,0,0] +] + +HM_Array2 = [ +[100, // menu width +"HM_f_CenterMenu('HM_Menu2')", // left_position +90, // top_position +"red", // font_color +"yellow", // mouseover_font_color +"yellow", // background_color +"black", // mouseover_background_color +"blue", // border_color +"green", // separator_color +1, // top_is_permanent +1, // top_is_horizontal +0, // tree_is_horizontal +1, // position_under +1, // top_more_images_visible +1, // tree_more_images_visible +"null", // evaluate_upon_tree_show +"null", // evaluate_upon_tree_hide +, // right_to_left +1], // display_on_click +["Experts","http://www.webreference.com/experts/",1,0,1], +["Contents","http://www.webreference.com/index2.html",1,0,0], +["Services","http://www.webreference.com/index2.html",1,0,1], +["About","http://www.webreference.com/about.html",1,0,1] +] + +HM_Array2_1 = [ +[], +["3-D Animation","http://www.webreference.com/3d/",1,0,0], +["Design","http://www.webreference.com/dlab/",1,0,0], +["HTML","http://www.webreference.com/html/",1,0,0], +["JavaScript","http://www.webreference.com/js/",1,0,0], +["Graphics","http://www.webreference.com/graphics/",1,0,0], +["DHTML","http://www.webreference.com/dhtml/",1,0,0], +["Perl","http://www.webreference.com/perl/",1,0,0], +["XML","http://www.webreference.com/xml/",1,0,0] +] + +HM_Array2_3 = [ +[], +["Features","http://www.webreference.com/articles.html",1,0,0], +["Forum","http://www.webreference.com/cgi-bin/Ultimate.cgi?action=intro",1,0,0], +["How-to","http://www.webreference.com/dev/",1,0,0], +["New","http://www.webreference.com/headlines/",1,0,0], +["Hot Sites","http://www.webreference.com/hot/",1,0,0] +] + +HM_Array2_4 = [ +[], +["Features","http://www.webreference.com/articles.html",1,0,0], +["Forum","http://www.webreference.com/cgi-bin/Ultimate.cgi?action=intro",1,0,0], +["How-to","http://www.webreference.com/dev/",1,0,0], +["New","http://www.webreference.com/headlines/",1,0,0], +["Hot Sites","http://www.webreference.com/hot/",1,0,0] +] + +HM_Array2_1_6 = [ +[], +["Diner","http://www.webreference.com/dhtml/diner/",1,0,0], +["Dynomat","http://www.webreference.com/dhtml/dynomat/",1,0,0], +["Links","http://www.webreference.com/dhtml/links/",1,0,0] +] + +HM_Array3 = [ +[120, // menu width +200, // left_position +300, // top_position +"black", // font_color +"white", // mouseover_font_color +"white", // background_color +"black", // mouseover_background_color +"black", // border_color +"gray", // separator_color +0, // top_is_permanent +0, // top_is_horizontal +0, // tree_is_horizontal +1, // position_under +1, // top_more_images_visible +1, // tree_more_images_visible +"null", // evaluate_upon_tree_show +"null", // evaluate_upon_tree_hide +, // right_to_left +], // display_on_click +["Experts","http://www.webreference.com/experts/",1,0,1], +["Contents","http://www.webreference.com/index2.html",1,0,0], +["Services","http://www.webreference.com/index2.html",1,0,1], +["About","http://www.webreference.com/about.html",1,0,0] +] + +HM_Array3_1 = [ +[], +["3-D Animation","http://www.webreference.com/3d/",1,0,0], +["Design","http://www.webreference.com/dlab/",1,0,0], +["HTML","http://www.webreference.com/html/",1,0,0], +["JavaScript","http://www.webreference.com/js/",1,0,0], +["Graphics","http://www.webreference.com/graphics/",1,0,0], +["DHTML","http://www.webreference.com/dhtml/",1,0,1], +["Perl","http://www.webreference.com/perl/",1,0,0], +["XML","http://www.webreference.com/xml/",1,0,0] +] + +HM_Array3_3 = [ +[], +["Features","http://www.webreference.com/articles.html",1,0,0], +["Forum","http://www.webreference.com/cgi-bin/Ultimate.cgi?action=intro",1,0,0], +["How-to","http://www.webreference.com/dev/",1,0,0], +["New","http://www.webreference.com/headlines/",1,0,0], +["Hot Sites","http://www.webreference.com/hot/",1,0,0] +] + +HM_Array3_1_6 = [ +[], +["Diner","http://www.webreference.com/dhtml/diner/",1,0,0], +["Dynomat","http://www.webreference.com/dhtml/dynomat/",1,0,0], +["Links","http://www.webreference.com/dhtml/links/",1,0,0] +] + +HM_Array4 = [ +[120, +"mouse_x_position + 20", +"mouse_y_position + 20", +,,,,,,,,,,,,,,, +true], +["Experts","http://www.webreference.com/experts/",1,0,1], +["Contents","http://www.webreference.com/index2.html",1,0,0], +["Services","http://www.webreference.com/index2.html",1,0,0], +["About","http://www.webreference.com/about.html",1,0,0] +] + +HM_Array4_1 = [ +[], +["3-D Animation","http://www.webreference.com/3d/",1,0,0], +["Design","http://www.webreference.com/dlab/",1,0,0], +["HTML","http://www.webreference.com/html/",1,0,0], +["JavaScript","http://www.webreference.com/js/",1,0,0], +["Graphics","http://www.webreference.com/graphics/",1,0,0], +["DHTML","http://www.webreference.com/dhtml/",1,0,0], +["Perl","http://www.webreference.com/perl/",1,0,0], +["XML","http://www.webreference.com/xml/",1,0,0] +] + +HM_Array5 = [ +[100, // menu_width +70, // left_position +170, // top_position +"red", // font_color +"yellow", // mouseover_font_color +"yellow", // background_color +"black", // mouseover_background_color +"blue", // border_color +"green", // separator_color +1, // top_is_permanent +1, // top_is_horizontal +0, // tree_is_horizontal +1, // position_under +0, // top_more_images_visible +1, // tree_more_images_visible +"null", // evaluate_upon_tree_show +"null", // evaluate_upon_tree_hide +, // right_to_left +, // display_on_click +true, // top_is_variable_width +, // tree_is_variable_width +], +["Experts","http://www.webreference.com/experts/",1,0,1], +["Contents","http://www.webreference.com/index2.html",1,0,0], +["Services","http://www.webreference.com/index2.html",1,0,1], +["About","http://www.webreference.com/about.html",1,0,0] +] + +HM_Array5_1 = [ +[], +["3-D Animation","http://www.webreference.com/3d/",1,0,0], +["Design","http://www.webreference.com/dlab/",1,0,0], +["HTML","http://www.webreference.com/html/",1,0,0], +["JavaScript","http://www.webreference.com/js/",1,0,0], +["Graphics","http://www.webreference.com/graphics/",1,0,0], +["DHTML","http://www.webreference.com/dhtml/",1,0,1], +["Perl","http://www.webreference.com/perl/",1,0,0], +["XML","http://www.webreference.com/xml/",1,0,0] +] + +HM_Array5_3 = [ +[], +["Features","http://www.webreference.com/articles.html",1,0,0], +["Forum","http://www.webreference.com/cgi-bin/Ultimate.cgi?action=intro",1,0,0], +["How-to","http://www.webreference.com/dev/",1,0,0], +["New","http://www.webreference.com/headlines/",1,0,0], +["Hot Sites","http://www.webreference.com/hot/",1,0,0] +] + +HM_Array5_1_6 = [ +[], +["Diner","http://www.webreference.com/dhtml/diner/",1,0,0], +["Dynomat","http://www.webreference.com/dhtml/dynomat/",1,0,0], +["Links","http://www.webreference.com/dhtml/links/",1,0,0] +] + diff --git a/daemons/graphs/jsmenu/HM_Arrays_prova.js b/daemons/graphs/jsmenu/HM_Arrays_prova.js new file mode 100644 index 000000000..93143accd --- /dev/null +++ b/daemons/graphs/jsmenu/HM_Arrays_prova.js @@ -0,0 +1,60 @@ + +HM_Array1 = [ +[150,,, +,,,,,,,,,,,,,,,, +1,true], +["Experts","http://www.webreference.com/experts/",1,0,1], +["Contents","http://www.webreference.com/index2.html",1,0,0], +["Services","http://www.webreference.com/index2.html",1,0,1], +["About","http://www.webreference.com/about.html",1,0,0], +["Hot Sites","http://www.webreference.com/hot/",1,0,1] +] + +HM_Array1_1 = [ +[], +["3-D Animation","http://www.webreference.com/3d/",1,0,0], +["Design","http://www.webreference.com/dlab/",1,0,0], +["HTML","http://www.webreference.com/html/",1,0,0], +["JavaScript","http://www.webreference.com/js/",1,0,0], +["Graphics","http://www.webreference.com/graphics/",1,0,0], +["DHTML","http://www.webreference.com/dhtml/",1,0,1], +["Perl","http://www.webreference.com/perl/",1,0,0], +["XML","http://www.webreference.com/xml/",1,0,0] +] + +HM_Array1_3 = [ +[], +["Features","http://www.webreference.com/articles.html",1,0,0], +["Forum","http://www.webreference.com/cgi-bin/Ultimate.cgi?action=intro",1,0,0], +["How-to","http://www.webreference.com/dev/",1,0,0], +["New","http://www.webreference.com/headlines/",1,0,0], +["Hot Sites","http://www.webreference.com/hot/",1,0,0] +] + +HM_Array1_5 = [ +[], +["3-D Animation","http://www.webreference.com/3d/",1,0,0], +["Design","http://www.webreference.com/dlab/",1,0,0], +["HTML","http://www.webreference.com/html/",1,0,0], +["JavaScript","http://www.webreference.com/js/",1,0,0], +["Graphics","http://www.webreference.com/graphics/",1,0,0], +["DHTML","http://www.webreference.com/dhtml/",1,0,1], +["Perl","http://www.webreference.com/perl/",1,0,0], +["XML","http://www.webreference.com/xml/",1,0,0] +] + +HM_Array1_1_6 = [ +[], +["Diner","http://www.webreference.com/dhtml/diner/",1,0,0], +["Dynomat","http://www.webreference.com/dhtml/dynomat/",1,0,0], +["Links","http://www.webreference.com/dhtml/links/",1,0,0] +] + +HM_Array2 = [ +[150,,, +,,,,,,,,,,,,,,,, +1,true], +["Pippo","http://www.inria.fr",1,0,1], +["Pluto","http://www.cs.unibo.it",1,0,0], +["Paperino","http://www.larepubblica.it",1,0,1], +] diff --git a/daemons/graphs/jsmenu/HM_Loader.js b/daemons/graphs/jsmenu/HM_Loader.js new file mode 100644 index 000000000..2c7e31f68 --- /dev/null +++ b/daemons/graphs/jsmenu/HM_Loader.js @@ -0,0 +1,89 @@ +/*HM_Loader.js +* by Peter Belesis. v4.1.1 011002 +* Copyright (c) 2001 Peter Belesis. All Rights Reserved. +*/ + + HM_DOM = (document.getElementById) ? true : false; + HM_NS4 = (document.layers) ? true : false; + HM_IE = (document.all) ? true : false; + HM_IE4 = HM_IE && !HM_DOM; + HM_Mac = (navigator.appVersion.indexOf("Mac") != -1); + HM_IE4M = HM_IE4 && HM_Mac; + HM_Opera = (navigator.userAgent.indexOf("Opera")!=-1); + HM_Konqueror = (navigator.userAgent.indexOf("Konqueror")!=-1); + +HM_IsMenu = !HM_Opera && !HM_Konqueror && !HM_IE4M && (HM_DOM || HM_NS4 || HM_IE4); + +HM_BrowserString = HM_NS4 ? "NS4" : HM_DOM ? "DOM" : "IE4"; + + +if(window.event + "" == "undefined") event = null; +function HM_f_PopUp(){return false}; +function HM_f_PopDown(){return false}; +popUp = HM_f_PopUp; +popDown = HM_f_PopDown; + + +HM_GL_MenuWidth = 150; +HM_GL_FontFamily = "Arial,sans-serif"; +HM_GL_FontSize = 10; +HM_GL_FontBold = true; +HM_GL_FontItalic = false; +HM_GL_FontColor = "black"; +HM_GL_FontColorOver = "white"; +HM_GL_BGColor = "transparent"; +HM_GL_BGColorOver = "transparent"; +HM_GL_ItemPadding = 3; + +HM_GL_BorderWidth = 2; +HM_GL_BorderColor = "red"; +HM_GL_BorderStyle = "solid"; +HM_GL_SeparatorSize = 2; +HM_GL_SeparatorColor = "yellow"; + +HM_GL_ImageSrc = "HM_More_black_right.gif"; +HM_GL_ImageSrcLeft = "HM_More_black_left.gif"; + +HM_GL_ImageSrcOver = "HM_More_white_right.gif"; +HM_GL_ImageSrcLeftOver = "HM_More_white_left.gif"; + +HM_GL_ImageSize = 5; +HM_GL_ImageHorizSpace = 5; +HM_GL_ImageVertSpace = 5; + +HM_GL_KeepHilite = false; +HM_GL_ClickStart = false; +HM_GL_ClickKill = 0; +HM_GL_ChildOverlap = 40; +HM_GL_ChildOffset = 10; +HM_GL_ChildPerCentOver = null; +HM_GL_TopSecondsVisible = .5; +HM_GL_ChildSecondsVisible = .3; +HM_GL_StatusDisplayBuild = 0; +HM_GL_StatusDisplayLink = 1; +HM_GL_UponDisplay = null; +HM_GL_UponHide = null; + +HM_GL_RightToLeft = false; +HM_GL_CreateTopOnly = HM_NS4 ? true : false; +HM_GL_ShowLinkCursor = true; + +// the following function is included to illustrate the improved JS expression handling of +// the left_position and top_position parameters +// you may delete if you have no use for it + +function HM_f_CenterMenu(topmenuid) { + var MinimumPixelLeft = 0; + var TheMenu = HM_DOM ? document.getElementById(topmenuid) : HM_IE4 ? document.all(topmenuid) : eval("window." + topmenuid); + var TheMenuWidth = HM_DOM ? parseInt(TheMenu.style.width) : HM_IE4 ? TheMenu.style.pixelWidth : TheMenu.clip.width; + var TheWindowWidth = HM_IE ? document.body.clientWidth : window.innerWidth; + return Math.max(parseInt((TheWindowWidth-TheMenuWidth) / 2),MinimumPixelLeft); +} + +if(HM_IsMenu) { + document.write("<\/SCR" + "IPT>"); + document.write("<\/SCR" + "IPT>"); +} + + +//end \ No newline at end of file diff --git a/daemons/graphs/jsmenu/HM_Loader_prova.js b/daemons/graphs/jsmenu/HM_Loader_prova.js new file mode 100644 index 000000000..ed8f95752 --- /dev/null +++ b/daemons/graphs/jsmenu/HM_Loader_prova.js @@ -0,0 +1,89 @@ +/*HM_Loader.js +* by Peter Belesis. v4.1.1 011002 +* Copyright (c) 2001 Peter Belesis. All Rights Reserved. +*/ + + HM_DOM = (document.getElementById) ? true : false; + HM_NS4 = (document.layers) ? true : false; + HM_IE = (document.all) ? true : false; + HM_IE4 = HM_IE && !HM_DOM; + HM_Mac = (navigator.appVersion.indexOf("Mac") != -1); + HM_IE4M = HM_IE4 && HM_Mac; + HM_Opera = (navigator.userAgent.indexOf("Opera")!=-1); + HM_Konqueror = (navigator.userAgent.indexOf("Konqueror")!=-1); + +HM_IsMenu = !HM_Opera && !HM_Konqueror && !HM_IE4M && (HM_DOM || HM_NS4 || HM_IE4); + +HM_BrowserString = HM_NS4 ? "NS4" : HM_DOM ? "DOM" : "IE4"; + + +if(window.event + "" == "undefined") event = null; +function HM_f_PopUp(){return false}; +function HM_f_PopDown(){return false}; +popUp = HM_f_PopUp; +popDown = HM_f_PopDown; + + +HM_GL_MenuWidth = 150; +HM_GL_FontFamily = "Arial,sans-serif"; +HM_GL_FontSize = 10; +HM_GL_FontBold = true; +HM_GL_FontItalic = false; +HM_GL_FontColor = "black"; +HM_GL_FontColorOver = "white"; +HM_GL_BGColor = "transparent"; +HM_GL_BGColorOver = "transparent"; +HM_GL_ItemPadding = 3; + +HM_GL_BorderWidth = 2; +HM_GL_BorderColor = "red"; +HM_GL_BorderStyle = "solid"; +HM_GL_SeparatorSize = 2; +HM_GL_SeparatorColor = "yellow"; + +HM_GL_ImageSrc = "HM_More_black_right.gif"; +HM_GL_ImageSrcLeft = "HM_More_black_left.gif"; + +HM_GL_ImageSrcOver = "HM_More_white_right.gif"; +HM_GL_ImageSrcLeftOver = "HM_More_white_left.gif"; + +HM_GL_ImageSize = 5; +HM_GL_ImageHorizSpace = 5; +HM_GL_ImageVertSpace = 5; + +HM_GL_KeepHilite = false; +HM_GL_ClickStart = false; +HM_GL_ClickKill = 0; +HM_GL_ChildOverlap = 40; +HM_GL_ChildOffset = 10; +HM_GL_ChildPerCentOver = null; +HM_GL_TopSecondsVisible = .5; +HM_GL_ChildSecondsVisible = .3; +HM_GL_StatusDisplayBuild = 0; +HM_GL_StatusDisplayLink = 1; +HM_GL_UponDisplay = null; +HM_GL_UponHide = null; + +HM_GL_RightToLeft = false; +HM_GL_CreateTopOnly = HM_NS4 ? true : false; +HM_GL_ShowLinkCursor = true; + +// the following function is included to illustrate the improved JS expression handling of +// the left_position and top_position parameters +// you may delete if you have no use for it + +function HM_f_CenterMenu(topmenuid) { + var MinimumPixelLeft = 0; + var TheMenu = HM_DOM ? document.getElementById(topmenuid) : HM_IE4 ? document.all(topmenuid) : eval("window." + topmenuid); + var TheMenuWidth = HM_DOM ? parseInt(TheMenu.style.width) : HM_IE4 ? TheMenu.style.pixelWidth : TheMenu.clip.width; + var TheWindowWidth = HM_IE ? document.body.clientWidth : window.innerWidth; + return Math.max(parseInt((TheWindowWidth-TheMenuWidth) / 2),MinimumPixelLeft); +} + +if(HM_IsMenu) { + document.write("<\/SCR" + "IPT>"); + document.write("<\/SCR" + "IPT>"); +} + + +//end diff --git a/daemons/graphs/jsmenu/HM_More_black_left.gif b/daemons/graphs/jsmenu/HM_More_black_left.gif new file mode 100644 index 0000000000000000000000000000000000000000..ae9b1dd0fb6ab5c5ed2f6b991a2f15d768707a7e GIT binary patch literal 53 zcmZ?wbhEHbWM$xFXkcUjg8%>jEB<5wG8q|kKzxu40~1dVGkfQ4?pTum!zcy@YXBnM B3P}I} literal 0 HcmV?d00001 diff --git a/daemons/graphs/jsmenu/HM_More_black_right.gif b/daemons/graphs/jsmenu/HM_More_black_right.gif new file mode 100644 index 0000000000000000000000000000000000000000..ca628ba69bdcd33fa6d77e0e5deaeca7c0a143c5 GIT binary patch literal 53 zcmZ?wbhEHbWM$xFXkcUjg8%>jEB<5wG8q|kKzxu40~3#nT*C6(-;#oIR7JQLtN|`@ B3v~bh literal 0 HcmV?d00001 diff --git a/daemons/graphs/jsmenu/HM_More_blue_left.gif b/daemons/graphs/jsmenu/HM_More_blue_left.gif new file mode 100644 index 0000000000000000000000000000000000000000..1637826abdd1c4746d1762ec65e9e0e7e575291f GIT binary patch literal 53 zcmZ?wbhEHbWM$xFXkcVuVE7LNia%L^OhyJBAfEvw!@$JT!_3}!n>*Gdz%Yt|!5RQa Cw+l!B literal 0 HcmV?d00001 diff --git a/daemons/graphs/jsmenu/HM_More_blue_right.gif b/daemons/graphs/jsmenu/HM_More_blue_right.gif new file mode 100644 index 0000000000000000000000000000000000000000..ebc8f9bca0af5a66d27acd577746056f5c81b6b1 GIT binary patch literal 53 zcmZ?wbhEHbWM$xFXkcVuVE7LNia%L^OhyJBAfEvw!@$JjBA2lI_P3;<990o625SIR COAK@X literal 0 HcmV?d00001 diff --git a/daemons/graphs/jsmenu/HM_More_cyan_left.gif b/daemons/graphs/jsmenu/HM_More_cyan_left.gif new file mode 100644 index 0000000000000000000000000000000000000000..48e8325329f4beb725603d18316c6a5fc9266411 GIT binary patch literal 53 zcmZ?wbhEHbWM$xFXkcVu_zwb#KUsiGMg|=QAOOiQF!A&-vv=O+jx`A|jACH01^{o6 B3`YO} literal 0 HcmV?d00001 diff --git a/daemons/graphs/jsmenu/HM_More_cyan_right.gif b/daemons/graphs/jsmenu/HM_More_cyan_right.gif new file mode 100644 index 0000000000000000000000000000000000000000..788d9d2bef2223625cd3d8256e1baa96dac93641 GIT binary patch literal 53 zcmZ?wbhEHbWM$xFXkcVu_zwb#KUsiGMg|=QAOOiQF!8v^B`m-FEh#8RRfLPd8UTAF B4RZhh literal 0 HcmV?d00001 diff --git a/daemons/graphs/jsmenu/HM_More_green_left.gif b/daemons/graphs/jsmenu/HM_More_green_left.gif new file mode 100644 index 0000000000000000000000000000000000000000..132e1d2dd2acb077e2d155a334f69904f36107eb GIT binary patch literal 53 zcmZ?wbhEHbWM$xFXkcVu_|NeF|9{1wEI=kBgAM}_fMgh$czT%GJ8yHxngkd|F)&yI E07 E098s1bN~PV literal 0 HcmV?d00001 diff --git a/daemons/graphs/jsmenu/HM_More_magenta_left.gif b/daemons/graphs/jsmenu/HM_More_magenta_left.gif new file mode 100644 index 0000000000000000000000000000000000000000..e6369cf7c08144118bbabce0fd08f0bf1c4a6c9d GIT binary patch literal 53 zcmZ?wbhEHbWM$xFXkcXc&+s1z6o0ZXGB7YQ=r8~QNQQxlr-zxn^EP*^Nq}J#1A{dH DaE}Z} literal 0 HcmV?d00001 diff --git a/daemons/graphs/jsmenu/HM_More_magenta_right.gif b/daemons/graphs/jsmenu/HM_More_magenta_right.gif new file mode 100644 index 0000000000000000000000000000000000000000..56179da04a0bcabfafc2b171dc4384911fc64fb1 GIT binary patch literal 53 zcmZ?wbhEHbWM$xFXkcXc&+s1z6o0ZXGB7YQ=r8~QNQQxl$3-q-`R#8>K{=`-TnyF# Dd?O8W literal 0 HcmV?d00001 diff --git a/daemons/graphs/jsmenu/HM_More_red_left.gif b/daemons/graphs/jsmenu/HM_More_red_left.gif new file mode 100644 index 0000000000000000000000000000000000000000..b36de2008a211b36d00db234ef48154a612d1028 GIT binary patch literal 53 zcmZ?wbhEHbWM$xFXkcXc&%p5i|9{1wEQ|~cj0`#qKmd|qVB+avX79Ys9cvO`7{$O~ F4FF2D3rGL} literal 0 HcmV?d00001 diff --git a/daemons/graphs/jsmenu/HM_More_red_right.gif b/daemons/graphs/jsmenu/HM_More_red_right.gif new file mode 100644 index 0000000000000000000000000000000000000000..035f5e600c86c6f0240e1cc9fae1714ae21ab3e3 GIT binary patch literal 53 zcmZ?wbhEHbWM$xFXkcXc&%p5i|9{1wEQ|~cj0`#qKmd|qVB&F+OIUvUTT)Ptst6Z@ FH2_vg40Heh literal 0 HcmV?d00001 diff --git a/daemons/graphs/jsmenu/HM_More_white_left.gif b/daemons/graphs/jsmenu/HM_More_white_left.gif new file mode 100644 index 0000000000000000000000000000000000000000..935308d99cf3f2f47914e538a7a2a4daf1c6b23b GIT binary patch literal 53 zcmZ?wbhEHbWM$xFXkcXc4+e@qSr{1@7#VaJfB+=Jz{JzT%-(sMJJuw?Fp7b}8UUAQ B4MqR} literal 0 HcmV?d00001 diff --git a/daemons/graphs/jsmenu/HM_More_white_right.gif b/daemons/graphs/jsmenu/HM_More_white_right.gif new file mode 100644 index 0000000000000000000000000000000000000000..969fc49722dfd1df28e54ebe07680f7bdf11421f GIT binary patch literal 53 zcmZ?wbhEHbWM$xFXkcXc4+e@qSr{1@7#VaJfB+=Jz{KMsm$3Zyx1^vPRS_-*YXGAB B4srkh literal 0 HcmV?d00001 diff --git a/daemons/graphs/jsmenu/HM_More_yellow_left.gif b/daemons/graphs/jsmenu/HM_More_yellow_left.gif new file mode 100644 index 0000000000000000000000000000000000000000..8e10145ffbd3e090b034e21705f06859f7c01b51 GIT binary patch literal 53 zcmZ?wbhEHbWM$xFXkcXc{~w6{EB<6*WME)q&|v@qkPHJ8PY*MD=WXs-lK{gg1_o;Y DagGc} literal 0 HcmV?d00001 diff --git a/daemons/graphs/jsmenu/HM_More_yellow_right.gif b/daemons/graphs/jsmenu/HM_More_yellow_right.gif new file mode 100644 index 0000000000000000000000000000000000000000..8a438b938bbe48ffb29fc409aa25f68f2ef85750 GIT binary patch literal 53 zcmZ?wbhEHbWM$xFXkcXc{~w6{EB<6*WME)q&|v@qkPHJ8kBeNw^4s5%f^t+vxEQPf DeIgBW literal 0 HcmV?d00001 diff --git a/daemons/graphs/jsmenu/HM_ScriptDOM.js b/daemons/graphs/jsmenu/HM_ScriptDOM.js new file mode 100644 index 000000000..498a5912b --- /dev/null +++ b/daemons/graphs/jsmenu/HM_ScriptDOM.js @@ -0,0 +1,962 @@ +/*HM_ScriptDOM.js +* by Peter Belesis. v4.1.1 011002 +* Copyright (c) 2001 Peter Belesis. All Rights Reserved. +* Originally published and documented at http://www.dhtmlab.com/ +* Available solely from INT Media Group. Incorporated under exclusive license. +* Contact licensing@internet.com for more information. +*/ + +HM_IE5M = HM_IE && HM_Mac; +HM_IE5W = HM_IE && !HM_Mac; +HM_NS6 = (navigator.vendor == ("Netscape6") || navigator.product == ("Gecko")); +HM_IEpos = HM_IE || (HM_NS6 && parseInt(navigator.productSub)>=20010710); +HM_IEDTD = (HM_IE && document.doctype) ? document.doctype.name.indexOf(".dtd")!=-1 : false; +HM_IEnoDTD = HM_IE && !HM_IEDTD; + +HM_a_Parameters = [ + ["MenuWidth", 150, "number"], + ["FontFamily", "Arial,sans-serif"], + ["FontSize", 10, "number"], + ["FontBold", false, "boolean"], + ["FontItalic", false, "boolean"], + ["FontColor", "black"], + ["FontColorOver", "white"], + ["BGColor", "white"], + ["BGColorOver", "black"], + ["ItemPadding", 3, "number"], + ["BorderWidth", 2, "number"], + ["BorderColor", "red"], + ["BorderStyle", "solid"], + ["SeparatorSize", 1, "number"], + ["SeparatorColor", "yellow"], + ["ImageSrc", "HM_More_black_right.gif"], + ["ImageSrcOver", null], + ["ImageSrcLeft", "HM_More_black_left.gif"], + ["ImageSrcLeftOver", null], + ["ImageSize", 5, "number"], + ["ImageHorizSpace", 0, "number"], + ["ImageVertSpace", 0, "number"], + ["KeepHilite", false, "boolean"], + ["ClickStart", false, "boolean"], + ["ClickKill", true, "boolean"], + ["ChildOverlap", 20, "number"], + ["ChildOffset", 10, "number"], + ["ChildPerCentOver", null, "number"], + ["TopSecondsVisible", .5, "number"], + ["ChildSecondsVisible",.3, "number"], + ["StatusDisplayBuild", 1, "boolean"], + ["StatusDisplayLink", 1, "boolean"], + ["UponDisplay", null, "delayed"], + ["UponHide", null, "delayed"], + ["RightToLeft", false, "boolean"], + ["CreateTopOnly", 0, "boolean"], + ["ShowLinkCursor", false, "boolean"] +] + +HM_MenuIDPrefix = "HM_Menu"; +HM_ItemIDPrefix = "HM_Item"; +HM_ArrayIDPrefix = "HM_Array"; + +Function.prototype.isFunction = true; +Function.prototype.isString = false; +String.prototype.isFunction = false; +String.prototype.isString = true; +String.prototype.isBoolean = false; +String.prototype.isNumber = false; +Number.prototype.isString = false; +Number.prototype.isFunction = false; +Number.prototype.isBoolean = false; +Number.prototype.isNumber = true; +Boolean.prototype.isString = false; +Boolean.prototype.isFunction = false; +Boolean.prototype.isBoolean = true; +Boolean.prototype.isNumber = false; +Array.prototype.itemValidation = false; +Array.prototype.isArray = true; + +if(HM_IE) { + HM_a_ElementsCreated = []; + + function HM_f_StoreElement(el){ + HM_a_ElementsCreated[HM_a_ElementsCreated.length] = el; + } +} + +function HM_f_AssignParameters(paramarray){ + var ParamName = paramarray[0]; + var DefaultValue = paramarray[1]; + var FullParamName = "HM_" + ParamName; + + if (typeof eval("window.HM_PG_" + ParamName) == "undefined") { + if (typeof eval("window.HM_GL_" + ParamName) == "undefined") { + eval(FullParamName + "= DefaultValue"); + } + else { + eval(FullParamName + "= HM_GL_" + ParamName); + } + } + else { + eval(FullParamName + "= HM_PG_" + ParamName); + } + + paramarray[0] = FullParamName; + paramarray[1] = eval(FullParamName); +} + +function HM_f_EvalParameters(valuenew,valueold,valuetype){ + var TestString, ParPosition; + + if(typeof valuenew == "undefined" || valuenew == null || (valuenew.isString && valuenew.length == 0)){ + return valueold; + } + + if(valuetype != "delayed"){ + while(valuenew.isString) { + ParPosition = valuenew.indexOf("("); + if(ParPosition !=-1) { + TestString = "window." + valuenew.substr(0,ParPosition); + if (typeof eval(TestString) != "undefined" && eval(TestString).isFunction) { + valuenew = eval(valuenew); + } + } + else break + } + } + + while(valuenew.isFunction) {valuenew = valuenew()} + + switch(valuetype){ + case "number": + while (valuenew.isString) {valuenew = eval(valuenew)} + break; + case "boolean": + while (!valuenew.isBoolean) { + valuenew = (valuenew.isNumber) ? valuenew ? true : false : eval(valuenew); + } + break; + } + + return valuenew; +} + +for (i=0;i 1) { + MenuArrayIsValid = true; + if(!TheMenuArray.itemValidation) { + while((typeof TheMenuArray[TheMenuArray.length-1] != "object") || (!TheMenuArray[TheMenuArray.length-1].isArray)) { + TheMenuArray.length--; + } + TheMenuArray.itemValidation = true; + } + } + } + return MenuArrayIsValid; +} + +if(!window.HM_a_TreesToBuild) { + HM_a_TreesToBuild = []; + for(i=1; i<100; i++){ + if(HM_f_ValidateArray(HM_ArrayIDPrefix + i)) HM_a_TreesToBuild[HM_a_TreesToBuild.length] = i; + } +} + +HM_CurrentArray = null; +HM_CurrentTree = null; +HM_CurrentMenu = null; +HM_CurrentItem = null; +HM_a_TopMenus = []; +HM_AreLoaded = false; +HM_AreCreated = false; +HM_BeingCreated = false; +HM_UserOverMenu = false; +HM_HideAllTimer = null; +HM_TotalTrees = 0; +HM_ZIndex = 5000; + +function HM_f_StartIt() { + if(HM_AreCreated) return; + if((typeof(document.body) == "undefined") || (document.body == null)) return; + HM_AreLoaded = true; + if (HM_ClickKill) { + HM_f_OtherMouseDown = (document.onmousedown) ? document.onmousedown : new Function; + document.onmousedown = function(){HM_f_PageClick();HM_f_OtherMouseDown()} + } + else { + HM_TopMilliSecondsVisible = HM_TopSecondsVisible * 1000; + } + HM_f_MakeTrees(); + HM_f_OtherOnLoad(); +} + +function HM_f_MakeTrees(){ + HM_BeingCreated = true; + var TreeParams = null; + var TreeHasChildren = false; + var ItemArray = null; + + for(var t=0; t WindowRightEdge) { + if (this.hasParent) { + this.xPos = ((ParentLeftEdge - this.parentItem.DistanceToLeftEdge) + this.parentItem.ChildOverlap) - this.offsetWidth; + } + else { + dif = MenuRightEdge - WindowRightEdge; + this.xPos -= dif; + } + this.xPos = Math.max(5,this.xPos); + } + + if (MenuBottomEdge > WindowBottomEdge) { + dif = MenuBottomEdge - WindowBottomEdge; + this.yPos -= dif; + } + + if (MenuLeftEdge < WindowLeftEdge) { + if (this.hasParent) { + this.xPos = (ParentLeftEdge + this.parentItem.DistanceToRightEdge) - this.parentItem.ChildOverlap; + MenuRightEdge = this.xPos + this.offsetWidth; + if(MenuRightEdge > WindowRightEdge) this.xPos -= (MenuRightEdge - WindowRightEdge); + } + else {this.xPos = 5} + } +} + +function HM_f_LinkIt() { + if (this.linkText.indexOf("javascript:")!=-1) eval(this.linkText) + else { + HM_f_HideAll(); + location.href = this.linkText; + } +} + +function HM_f_PopDown(menuname){ + if (!HM_AreLoaded || !HM_AreCreated) return; + menuname = menuname.replace("elMenu",HM_MenuIDPrefix); + var MenuToHide = document.getElementById(menuname); + if(!MenuToHide)return; + MenuToHide.isOn = false; + if (!HM_ClickKill) MenuToHide.hideTop(); +} + +function HM_f_HideAll(callingmenu) { + for(var i=0; i=0; i--){ + TempElement = HM_a_ElementsCreated[i]; + TempElement.parentMenu = null; + TempElement.parentItem = null; + TempElement.itemElement = null; + TempElement.currentItem = null; + TempElement.child = null; + TempElement.siblingBelow = null; + TempElement.imgLyr = null; + } + TempElement = null; + + for(var i=0; i 1) { + MenuArrayIsValid = true; + if(!TheMenuArray.itemValidation) { + while((typeof TheMenuArray[TheMenuArray.length-1] != "object") || (!TheMenuArray[TheMenuArray.length-1].isArray)) { + TheMenuArray.length--; + } + TheMenuArray.itemValidation = true; + } + } + } + return MenuArrayIsValid; +} + +if(!window.HM_a_TreesToBuild) { + HM_a_TreesToBuild = []; + for(i=1; i<100; i++){ + if(HM_f_ValidateArray(HM_ArrayIDPrefix + i)) HM_a_TreesToBuild[HM_a_TreesToBuild.length] = i; + } +} + +HM_CurrentArray = null; +HM_CurrentTree = null; +HM_CurrentMenu = null; +HM_CurrentItem = null; +HM_a_TopMenus = []; +HM_AreLoaded = false; +HM_AreCreated = false; +HM_BeingCreated = false; +HM_UserOverMenu = false; +HM_HideAllTimer = null; +HM_TotalTrees = 0; +HM_ZIndex = 5000; + +function propertyTransfer(){ + this.obj = eval(this.id + "Obj"); + for (temp in this.obj) {this[temp] = this.obj[temp]} +} + +function HM_f_StartIt() { + if((typeof(document.body) == "undefined") || (document.body == null)) return; + if(HM_AreCreated) return; + HM_AreLoaded = true; + if (HM_ClickKill) { + HM_f_OtherMouseDown = (document.onmousedown) ? document.onmousedown : new Function; + document.onmousedown = function(){HM_f_PageClick();HM_f_OtherMouseDown()} + } + else { + HM_TopMilliSecondsVisible = HM_TopSecondsVisible * 1000; + } + HM_f_MakeTrees(); + HM_f_OtherOnLoad(); +} + +function HM_f_MakeTrees(){ + HM_BeingCreated = true; + var TreeParams = null; + var TreeHasChildren = false; + var ItemArray = null; + + for(var t=0; t"; + if(HM_CurrentMenu.showImage) { + var FullPadding = (HM_ItemPadding*2) + HM_ImageSize + HM_ImageHorizSpace; + } + if(hasmore && HM_CurrentMenu.showImage) { + var ImgSrc = HM_CurrentTree.RightToLeft ? HM_ImageSrcLeft : HM_ImageSrc; + var ImgStyle = "top:"+ (HM_ItemPadding + HM_ImageVertSpace) + "px;width:"+ HM_ImageSize + "px;"; + var ImgString = ""; + TempString += ImgString; + } + TempString += disptext + ""; + return TempString; +} + +function HM_f_SetItemProperties(itemid,itemidsuffix) { + this.tree = HM_CurrentTree; + this.itemsetup = HM_f_ItemSetup; + this.index = HM_CurrentMenu.itemCount - 1; + this.isLastItem = (HM_CurrentMenu.itemCount == HM_CurrentMenu.maxItems); + this.array = HM_CurrentMenu.array[HM_CurrentMenu.itemCount]; + this.dispText = this.array[0]; + this.linkText = this.array[1]; + this.permHilite = HM_f_EvalParameters(this.array[3],false,"boolean"); + this.hasRollover = (!this.permHilite && HM_f_EvalParameters(this.array[2],true,"boolean")); + this.hasMore = HM_f_EvalParameters(this.array[4],false,"boolean") && HM_f_ValidateArray(HM_ArrayIDPrefix + itemidsuffix); + this.childID = this.hasMore ? (HM_MenuIDPrefix + itemidsuffix) : null; + this.child = null; + this.onmouseover = HM_f_ItemOver; + this.onmouseout = HM_f_ItemOut; + this.setItemStyle = HM_f_SetItemStyle; + this.itemStr = HM_f_GetItemDivStr(itemid,this.dispText,this.hasMore); + this.showChild = HM_f_ShowChild; + this.ChildOverlap = null; +} + +function HM_f_Make4ItemElement(menucount) { + var ItemIDSuffix = menucount + "_" + HM_CurrentMenu.itemCount; + var LayerID = HM_ItemIDPrefix + ItemIDSuffix; + var ObjectID = LayerID + "Obj"; + eval(ObjectID + " = new Object()"); + ItemElement = eval(ObjectID); + ItemElement.setItemProperties = HM_f_SetItemProperties; + ItemElement.setItemProperties(LayerID,ItemIDSuffix); + return ItemElement; +} + +function HM_f_MakeElement(menuid) { + var MenuObject; + var LayerID = menuid; + var ObjectID = LayerID + "Obj"; + eval(ObjectID + " = new Object()"); + MenuObject = eval(ObjectID); + return MenuObject; +} + +function HM_f_MakeMenu(menucount) { + if(!HM_f_ValidateArray(HM_ArrayIDPrefix + menucount)) return false; + HM_CurrentArray = eval(HM_ArrayIDPrefix + menucount); + NewMenu = document.all(HM_MenuIDPrefix + menucount); + if(!NewMenu) { + NewMenu = HM_f_MakeElement(HM_MenuIDPrefix + menucount); + NewMenu.array = HM_CurrentArray; + NewMenu.tree = HM_CurrentTree; + + if(HM_CurrentMenu) { + NewMenu.parentMenu = HM_CurrentMenu; + NewMenu.parentItem = HM_CurrentMenu.itemElement; + NewMenu.parentItem.child = NewMenu; + NewMenu.hasParent = true; + NewMenu.isHorizontal = HM_CurrentTree.TreeIsHorizontal; + NewMenu.showImage = HM_CurrentTree.TreeImageShow; + } + else { + NewMenu.isHorizontal = HM_CurrentTree.TopIsHorizontal; + NewMenu.showImage = HM_CurrentTree.TopImageShow; + } + + HM_CurrentMenu = NewMenu; + HM_CurrentMenu.itemCount = 0; + HM_CurrentMenu.maxItems = HM_CurrentMenu.array.length - 1; + HM_CurrentMenu.showIt = HM_f_ShowIt; + HM_CurrentMenu.keepInWindow = HM_f_KeepInWindow; + HM_CurrentMenu.onmouseover = HM_f_MenuOver; + HM_CurrentMenu.onmouseout = HM_f_MenuOut; + HM_CurrentMenu.hideTree = HM_f_HideTree + HM_CurrentMenu.hideParents = HM_f_HideParents; + HM_CurrentMenu.hideChildren = HM_f_HideChildren; + HM_CurrentMenu.hideTop = HM_f_HideTop; + HM_CurrentMenu.hideSelf = HM_f_HideSelf; + HM_CurrentMenu.count = menucount; + HM_CurrentMenu.hasChildVisible = false; + HM_CurrentMenu.isOn = false; + HM_CurrentMenu.hideTimer = null; + HM_CurrentMenu.currentItem = null; + HM_CurrentMenu.setMenuStyle = HM_f_SetMenuStyle; + HM_CurrentMenu.sizeFixed = false; + HM_CurrentMenu.fixSize = HM_f_FixSize; + HM_CurrentMenu.onselectstart = HM_f_CancelSelect; + HM_CurrentMenu.moveTo = HM_f_MoveTo; + HM_CurrentMenu.IsVariableWidth = ((HM_CurrentMenu.hasParent && HM_CurrentTree.TreeIsVariableWidth) || (!HM_CurrentMenu.hasParent && HM_CurrentTree.TopIsVariableWidth)); + HM_CurrentMenu.htmlString = ""); + menuLyr = document.all(HM_MenuIDPrefix + menucount); + menuLyr.propertyTransfer = propertyTransfer; + menuLyr.propertyTransfer(); + HM_CurrentMenu = menuLyr; + if(!HM_CurrentMenu.hasParent)HM_CurrentTree.treeParent = HM_CurrentTree.startChild = HM_CurrentMenu; + HM_CurrentMenu.setMenuStyle(); + HM_CurrentMenu.items = HM_CurrentMenu.children; + HM_CurrentMenu.lastItem = HM_CurrentMenu.items[HM_CurrentMenu.items.length-1]; + for(var i=0; i0 ? HM_CurrentMenu.items[i-1] : null; + it.propertyTransfer = propertyTransfer; + it.propertyTransfer(); + it.itemsetup(i+1); + } + HM_CurrentMenu.moveTo(0,0); + return HM_CurrentMenu; +} + +function HM_f_SetMenuStyle(){ + with(this.style) { + borderWidth = HM_BorderWidth + "px"; + borderColor = HM_CurrentTree.BorderColor; + borderStyle = HM_BorderStyle; + overflow = "hidden"; + cursor = "default"; + } +} + +function HM_f_SetItemStyle() { + with(this.style){ + backgroundColor = (this.permHilite) ? HM_CurrentTree.BGColorOver : HM_CurrentTree.BGColor; + color = (this.permHilite) ? HM_CurrentTree.FontColorOver : HM_CurrentTree.FontColor; + font = ((HM_FontBold) ? "bold " : "normal ") + HM_FontSize + "pt " + HM_FontFamily; + padding = HM_ItemPadding + "px"; + fontStyle = (HM_FontItalic) ? "italic" : "normal"; + overflow = "hidden"; + pixelWidth = HM_CurrentTree.ItemWidth; + + if((this.menu.showImage && (!this.menu.IsVariableWidth || (this.menu.IsVariableWidth && this.tree.RightToLeft && !this.menu.isHorizontal))) || (this.menu.IsVariableWidth && this.imgLyr)) { + + var FullPadding = (HM_ItemPadding*2) + HM_ImageSize + HM_ImageHorizSpace; + if (this.tree.RightToLeft) paddingLeft = FullPadding + "px"; + else paddingRight = FullPadding + "px"; + } + if(!this.isLastItem) { + var SeparatorString = HM_SeparatorSize + "px solid " + this.tree.SeparatorColor; + if (this.menu.isHorizontal) borderRight = SeparatorString; + else borderBottom = SeparatorString; + } + + if(this.menu.isHorizontal){ + pixelTop = 0; + if(this.menu.IsVariableWidth) { + this.realWidth = this.scrollWidth; + if(this.isLastItem) pixelWidth = this.realWidth; + else pixelWidth = (this.realWidth + HM_SeparatorSize); + pixelLeft = this.index ? (this.siblingBelow.style.pixelLeft + this.siblingBelow.style.pixelWidth) : 0; + if(this.isLastItem) { + LeftAndWidth = pixelLeft + pixelWidth; + this.menu.style.pixelWidth = LeftAndWidth + (HM_BorderWidth * 2); + } + + } + else { + if(this.isLastItem) pixelWidth = (HM_CurrentTree.MenuWidth - HM_BorderWidth - HM_SeparatorSize); + else pixelWidth = (HM_CurrentTree.MenuWidth - HM_BorderWidth); + pixelLeft = (this.index * (HM_CurrentTree.MenuWidth - HM_BorderWidth)); + var LeftAndWidth = pixelLeft + pixelWidth; + this.menu.style.pixelWidth = LeftAndWidth + (HM_BorderWidth * 2); + } + } + else { + pixelLeft = 0; + } + } +} + +function HM_f_FixSize(makevis){ + if(this.isHorizontal) { + var MaxItemHeight = 0; + for(i=0; i WindowRightEdge) { + if (this.hasParent) { + this.xPos = ((ParentLeftEdge - this.parentItem.DistanceToLeftEdge) + this.parentItem.ChildOverlap) - this.offsetWidth; + } + else { + dif = MenuRightEdge - WindowRightEdge; + this.xPos -= dif; + } + this.xPos = Math.max(5,this.xPos); + } + + if (MenuBottomEdge > WindowBottomEdge) { + dif = MenuBottomEdge - WindowBottomEdge; + this.yPos -= dif; + } + + if (MenuLeftEdge < WindowLeftEdge) { + if (this.hasParent) { + this.xPos = (ParentLeftEdge + this.parentItem.DistanceToRightEdge) - this.parentItem.ChildOverlap; + MenuRightEdge = this.xPos + this.style.pixelWidth; + if(MenuRightEdge > WindowRightEdge) this.xPos -= (MenuRightEdge - WindowRightEdge); + } + else {this.xPos = 5} + } +} + +function HM_f_LinkIt() { + if (this.linkText.indexOf("javascript:")!=-1) eval(this.linkText) + else { + HM_f_HideAll(); + location.href = this.linkText; + } +} + +function HM_f_PopDown(menuname){ + if (!HM_AreLoaded || !HM_AreCreated) return; + menuname = menuname.replace("elMenu",HM_MenuIDPrefix); + var MenuToHide = document.all(menuname); + if(!MenuToHide)return; + MenuToHide.isOn = false; + if (!HM_ClickKill) MenuToHide.hideTop(); +} + +function HM_f_HideAll(callingmenu) { + for(var i=0; i 1) { + MenuArrayIsValid = true; + if(!TheMenuArray.itemValidation) { + while((typeof TheMenuArray[TheMenuArray.length-1] != "object") || (!TheMenuArray[TheMenuArray.length-1].isArray)) { + TheMenuArray.length--; + } + TheMenuArray.itemValidation = true; + } + } + } + return MenuArrayIsValid; +} + +if(!window.HM_a_TreesToBuild) { + HM_a_TreesToBuild = []; + for(i=1; i<100; i++){ + if(HM_f_ValidateArray(HM_ArrayIDPrefix + i)) HM_a_TreesToBuild[HM_a_TreesToBuild.length] = i; + } +} + +HM_CurrentArray = null; +HM_CurrentTree = null; +HM_CurrentMenu = null; +HM_CurrentItem = null; +HM_a_TopMenus = []; +HM_AreLoaded = false; +HM_AreCreated = false; +HM_BeingCreated = false; +HM_UserOverMenu = false; +HM_HideAllTimer = null; +HM_TotalTrees = 0; +HM_ZIndex = 5000; + +function HM_f_Initialize() { + if(HM_AreCreated) { + for(var i=0; i" + TempString + ""; + var TempStringOver = TempString.fontcolor(HM_CurrentTree.FontColorOver); + TempString = TempString.fontcolor(HM_CurrentTree.FontColor); + return [TempString,TempStringOver]; +} + +function HM_f_MakeMenu(menucount) { + if(!HM_f_ValidateArray(HM_ArrayIDPrefix + menucount)) return false; + HM_CurrentArray = eval(HM_ArrayIDPrefix + menucount); + + NewMenu = eval("window." + HM_MenuIDPrefix + menucount); + if(!NewMenu) { + eval(HM_MenuIDPrefix + menucount + " = new Layer(HM_CurrentTree.MenuWidth,window)"); + NewMenu = eval(HM_MenuIDPrefix + menucount); + + if(HM_CurrentMenu) { + NewMenu.parentMenu = HM_CurrentMenu; + NewMenu.parentItem = HM_CurrentItem; + NewMenu.parentItem.child = NewMenu; + NewMenu.hasParent = true; + NewMenu.isHorizontal = HM_CurrentTree.TreeIsHorizontal; + NewMenu.showImage = HM_CurrentTree.TreeImageShow; + } + else { + NewMenu.isHorizontal = HM_CurrentTree.TopIsHorizontal; + NewMenu.showImage = HM_CurrentTree.TopImageShow; + } + + HM_CurrentMenu = NewMenu; + HM_CurrentMenu.count = menucount; + HM_CurrentMenu.tree = HM_CurrentTree; + HM_CurrentMenu.array = HM_CurrentArray; + HM_CurrentMenu.maxItems = HM_CurrentArray.length - 1; + HM_CurrentMenu.bgColor = HM_CurrentTree.BorderColor; + HM_CurrentMenu.IsVariableWidth = ((HM_CurrentMenu.hasParent && HM_CurrentTree.TreeIsVariableWidth) || (!HM_CurrentMenu.hasParent && HM_CurrentTree.TopIsVariableWidth)); + HM_CurrentMenu.onmouseover = HM_f_MenuOver; + HM_CurrentMenu.onmouseout = HM_f_MenuOut; + HM_CurrentMenu.moveTo(0,0); + } + + if(!HM_CurrentTree.treeParent) HM_CurrentTree.treeParent = HM_CurrentTree.startChild = HM_CurrentMenu; + + while (HM_CurrentMenu.itemCount < HM_CurrentMenu.maxItems) { + HM_CurrentMenu.itemCount++; + HM_CurrentItem = eval("window." + HM_ItemIDPrefix + menucount + "_" + HM_CurrentMenu.itemCount); + if(!HM_CurrentItem) { + eval(HM_ItemIDPrefix + menucount + "_" + HM_CurrentMenu.itemCount + " = new Layer(HM_CurrentTree.ItemWidth - (HM_ItemPadding*2),HM_CurrentMenu)") + if(HM_StatusDisplayBuild) status = "Creating Hierarchical Menus: " + menucount + " / " + HM_CurrentMenu.itemCount; + HM_CurrentItem = eval(HM_ItemIDPrefix + menucount + "_" + HM_CurrentMenu.itemCount); + HM_CurrentItem.itemSetup(menucount + "_" + HM_CurrentMenu.itemCount); + } + if(HM_CurrentItem.hasMore && (!HM_CreateTopOnly || HM_AreCreated && HM_CreateTopOnly)) { + MenuCreated = HM_f_MakeMenu(menucount + "_" + HM_CurrentMenu.itemCount); + if(MenuCreated) { + HM_CurrentMenu = HM_CurrentMenu.parentMenu; + HM_CurrentArray = HM_CurrentMenu.array; + } + } + } + HM_CurrentMenu.itemCount = 0; + if (HM_CurrentMenu.isHorizontal) { + HM_CurrentMenu.clip.right = HM_CurrentMenu.lastItem.left + HM_CurrentMenu.lastItem.clip.right + HM_BorderWidth; + } + else { + HM_CurrentMenu.clip.right = HM_CurrentMenu.lastItem.clip.width + (HM_BorderWidth*2); + } + HM_CurrentMenu.clip.bottom = HM_CurrentMenu.lastItem.top + HM_CurrentMenu.lastItem.clip.bottom + HM_BorderWidth; + return HM_CurrentMenu; +} + +function HM_f_ItemSetup(itemidsuffix) { + this.menu = HM_CurrentMenu; + this.tree = HM_CurrentTree; + this.index = HM_CurrentMenu.itemCount - 1; + this.array = HM_CurrentArray[HM_CurrentMenu.itemCount]; + this.dispText = this.array[0]; + this.linkText = this.array[1]; + this.permHilite = HM_f_EvalParameters(this.array[3],false,"boolean"); + this.hasRollover = (!this.permHilite && HM_f_EvalParameters(this.array[2],true,"boolean")); + this.hasMore = HM_f_EvalParameters(this.array[4],false,"boolean") && HM_f_ValidateArray(HM_ArrayIDPrefix + itemidsuffix); + var HtmlStrings = HM_f_GetItemHtmlStr(this.dispText); + this.htmStr = HtmlStrings[0]; + this.htmStrOver = HtmlStrings[1]; + this.visibility = "inherit"; + this.onmouseover = HM_f_ItemOver; + this.onmouseout = HM_f_ItemOut; + this.menu.lastItem = this; + this.showChild = HM_f_ShowChild; + + this.ClickStart = this.hasMore && this.tree.ClickStart && (this.tree.TopIsPermanent && (this.tree.treeParent==this.menu)); + if(this.ClickStart) { + this.captureEvents(Event.MOUSEUP); + this.onmouseup = this.showChild; + this.linkText = ""; + } + else { + if (this.linkText) { + this.captureEvents(Event.MOUSEUP); + this.onmouseup = HM_f_LinkIt; + } + } + + this.txtLyrOff = new Layer(HM_CurrentTree.ItemTextWidth - (HM_ItemPadding*2),this); + with(this.txtLyrOff) { + document.write(this.permHilite ? this.htmStrOver : this.htmStr); + document.close(); + if (HM_CurrentTree.RightToLeft && this.menu.showImage && (!this.menu.isHorizontal || (this.menu.isHorizontal && (!this.menu.IsVariableWidth || (this.menu.IsVariableWidth && this.hasMore))) )) left = HM_ItemPadding + HM_ImageSize + HM_ImageHorizSpace; + visibility = "inherit"; + } + + if(this.menu.IsVariableWidth){ + this.ItemTextWidth = this.txtLyrOff.document.width; + this.ItemWidth = this.ItemTextWidth + (HM_ItemPadding*2); + if(HM_CurrentMenu.showImage) { + if(!this.menu.isHorizontal || this.hasMore) { + this.ItemWidth += (HM_ItemPadding + HM_ImageSize + HM_ImageHorizSpace); + } + } + } + else { + this.ItemWidth = this.tree.ItemWidth; + this.ItemTextWidth = this.tree.ItemTextWidth; + } + if (this.menu.isHorizontal) { + if (this.index) this.left = this.siblingBelow.left + this.siblingBelow.clip.width + HM_SeparatorSize; + else this.left = (HM_BorderWidth + HM_ItemPadding); + this.top = (HM_BorderWidth + HM_ItemPadding); + } + else { + this.left = (HM_BorderWidth + HM_ItemPadding); + if (this.index) this.top = this.siblingBelow.top + this.siblingBelow.clip.height + HM_SeparatorSize; + else this.top = (HM_BorderWidth + HM_ItemPadding) + } + this.clip.top = this.clip.left = -HM_ItemPadding; + this.clip.right = this.ItemWidth - HM_ItemPadding; + this.bgColor = this.permHilite ? this.tree.BGColorOver : this.tree.BGColor; + + if(this.tree.NSFontOver) { + if(!this.permHilite){ + this.txtLyrOn = new Layer(this.ItemTextWidth,this); + with(this.txtLyrOn) { + if (HM_CurrentTree.RightToLeft && this.menu.showImage && (!this.menu.isHorizontal || (this.menu.isHorizontal && (!this.menu.IsVariableWidth || (this.menu.IsVariableWidth && this.hasMore))) )) left = HM_ItemPadding + HM_ImageSize + HM_ImageHorizSpace; + visibility = "hide"; + } + } + } + + this.fullClip = this.txtLyrOff.document.height + (HM_ItemPadding * 2); + if(this.menu.isHorizontal) { + if(this.index) { + var SiblingHeight = this.siblingBelow.clip.height; + this.fullClip = Math.max(SiblingHeight,this.fullClip); + if(this.fullClip > SiblingHeight) { + var SiblingPrevious = this.siblingBelow; + while(SiblingPrevious != null) { + SiblingPrevious.clip.height = this.fullClip; + SiblingPrevious = SiblingPrevious.siblingBelow; + } + } + } + } + this.clip.height = this.fullClip; + + if(!this.menu.isHorizontal && this.menu.IsVariableWidth) { + this.fullWidth = this.clip.width; + if(this.index) { + var SiblingWidth = this.siblingBelow.clip.width; + this.fullWidth = Math.max(SiblingWidth,this.fullWidth); + SiblingPrevious = this.siblingBelow; + while(SiblingPrevious != null) { + SiblingPrevious.clip.width = this.fullWidth; + SiblingPrevious.dummyLyr.clip.width = this.fullWidth; + if(SiblingPrevious.hasMore) { + SiblingPrevious.DistanceToRightEdge = SiblingPrevious.clip.right + SiblingPrevious.WhatsOnRight; + SiblingPrevious.DistanceToLeftEdge = HM_ItemPadding + SiblingPrevious.WhatsOnLeft; + SiblingPrevious.CompleteWidth = SiblingPrevious.ItemWidth + SiblingPrevious.WhatsOnLeft + SiblingPrevious.WhatsOnRight; + SiblingPrevious.ChildOverlap = (parseInt((HM_ChildPerCentOver != null) ? (HM_ChildPerCentOver * SiblingPrevious.CompleteWidth) : HM_ChildOverlap)); + } + if(SiblingPrevious.imgLyr && !HM_CurrentTree.RightToLeft) { + SiblingPrevious.imgLyr.left = this.fullWidth - (HM_ItemPadding * 2) - HM_ImageSize - HM_ImageHorizSpace; + } + SiblingPrevious = SiblingPrevious.siblingBelow; + } + } + this.clip.width = this.fullWidth; + } + + this.dummyLyr = new Layer(100,this); + with(this.dummyLyr) { + left = top = -HM_ItemPadding; + clip.width = this.clip.width; + clip.height = this.clip.height; + visibility = "inherit"; + } + + if(this.hasMore && HM_CurrentMenu.showImage) { + this.imageSrc = this.tree.RightToLeft ? HM_ImageSrcLeft : HM_ImageSrc; + this.hasImageRollover = ((!this.tree.RightToLeft && HM_ImageSrcOver) || (this.tree.RightToLeft && HM_ImageSrcLeftOver)); + if(this.hasImageRollover) { + this.imageSrcOver = this.tree.RightToLeft ? HM_ImageSrcLeftOver : HM_ImageSrcOver; + if(this.permHilite) this.imageSrc = this.imageSrcOver; + } + this.imgLyr = new Layer(HM_ImageSize,this); + + with(this.imgLyr) { + document.write(""); + document.close(); + moveBelow(this.txtLyrOff); + left = (HM_CurrentTree.RightToLeft) ? HM_ImageHorizSpace : this.ItemWidth - (HM_ItemPadding * 2) - HM_ImageSize - HM_ImageHorizSpace; + top = HM_ImageVertSpace; + visibility = "inherit"; + } + this.imageElement = this.imgLyr.document.images[0]; + } + + if(this.hasMore) { + this.WhatsOnRight = (!this.menu.isHorizontal || (this.menu.isHorizontal && this.isLastItem)) ? HM_BorderWidth : HM_SeparatorSize; + this.DistanceToRightEdge = this.clip.right + this.WhatsOnRight; + this.WhatsOnLeft = (!this.menu.isHorizontal || (this.menu.isHorizontal && this.index==0)) ? HM_BorderWidth : HM_SeparatorSize; + this.DistanceToLeftEdge = HM_ItemPadding + this.WhatsOnLeft; + this.CompleteWidth = this.ItemWidth + this.WhatsOnLeft + this.WhatsOnRight; + this.ChildOverlap = (parseInt((HM_ChildPerCentOver != null) ? (HM_ChildPerCentOver * this.CompleteWidth) : HM_ChildOverlap)); + } +} + +function HM_f_PopUp(menuname,e){ + if (!HM_AreLoaded) return; + menuname = menuname.replace("elMenu",HM_MenuIDPrefix); + var TempMenu = eval("window."+menuname); + if(!TempMenu)return; + HM_CurrentMenu = TempMenu; + if (HM_CurrentMenu.tree.ClickStart) { + var ClickElement = e.target; + ClickElement.onclick = HM_f_PopMenu; + } + else HM_f_PopMenu(e); +} + +function HM_f_PopMenu(e){ + if (!HM_AreLoaded || !HM_AreCreated) return true; + if (HM_CurrentMenu.tree.ClickStart && e.type != "click") return true; + HM_f_HideAll(); + HM_CurrentMenu.hasParent = false; + HM_CurrentMenu.tree.startChild = HM_CurrentMenu; + var mouse_x_position = e.pageX; + var mouse_y_position = e.pageY; + HM_CurrentMenu.xPos = (HM_CurrentMenu.tree.MenuLeft!=null) ? eval(HM_CurrentMenu.tree.MenuLeft) : mouse_x_position; + HM_CurrentMenu.yPos = (HM_CurrentMenu.tree.MenuTop!=null) ? eval(HM_CurrentMenu.tree.MenuTop) : mouse_y_position; + + HM_CurrentMenu.keepInWindow(); + HM_CurrentMenu.moveTo(HM_CurrentMenu.xPos,HM_CurrentMenu.yPos); + HM_CurrentMenu.isOn = true; + HM_CurrentMenu.showIt(true); + return false; +} + +function HM_f_MenuOver() { + if(!this.tree.startChild){this.tree.startChild = this} + if(this.tree.startChild == this) HM_f_HideAll(this) + this.isOn = true; + HM_UserOverMenu = true; + HM_CurrentMenu = this; + if (this.hideTimer) clearTimeout(this.hideTimer); +} + +function HM_f_MenuOut() { + this.isOn = false; + HM_UserOverMenu = false; + if(HM_StatusDisplayLink) status = ""; + if(!HM_ClickKill) { + clearTimeout(HM_HideAllTimer); + HM_HideAllTimer = null; + HM_HideAllTimer = setTimeout("HM_CurrentMenu.hideTree()",HM_ChildMilliSecondsVisible); + } +} + +function HM_f_ShowChild(){ + if(!this.child) { + HM_CurrentTree = this.tree; + HM_CurrentMenu = this.menu; + HM_CurrentItem = this; + this.child = HM_f_MakeMenu(this.menu.count + "_"+(this.index+1)); + this.tree.treeParent = this.menu; + this.tree.startChild = this.menu; + } + if (this.tree.PositionUnder && (this.menu == this.tree.treeParent)) { + this.child.xPos = this.pageX + this.clip.left - HM_BorderWidth; + this.child.yPos = this.menu.top + this.menu.clip.height - HM_BorderWidth; + } + else { + this.oL = this.pageX; + this.child.offsetWidth = this.child.clip.width; + this.oT = this.pageY + this.clip.top - HM_BorderWidth; + if(this.tree.RightToLeft) { + this.child.xPos = ((this.oL - this.DistanceToLeftEdge) + this.ChildOverlap) - this.child.offsetWidth; + } + else { + this.child.xPos = (this.oL + this.DistanceToRightEdge) - this.ChildOverlap; + } + this.child.yPos = this.oT + HM_ChildOffset + HM_BorderWidth; + } + if(!this.tree.PositionUnder || this.menu!=this.tree.treeParent) this.child.keepInWindow(); + this.child.moveTo(this.child.xPos,this.child.yPos); + this.menu.hasChildVisible = true; + this.menu.visibleChild = this.child; + this.child.showIt(true); +} + +function HM_f_ItemOver(){ + if (HM_KeepHilite) { + if (this.menu.currentItem && this.menu.currentItem != this && this.menu.currentItem.hasRollover) { + with(this.menu.currentItem){ + bgColor = this.tree.BGColor; + if(this.tree.NSFontOver) { + txtLyrOff.visibility = "inherit"; + txtLyrOn.visibility = "hide"; + } + } + if(this.menu.currentItem.hasImageRollover)this.menu.currentItem.imageElement.src = this.menu.currentItem.imageSrc; + } + } + if(this.hasRollover) { + this.bgColor = this.tree.BGColorOver; + if(this.tree.NSFontOver) { + if(!this.txtLyrOn.isWritten){ + this.txtLyrOn.document.write(this.htmStrOver); + this.txtLyrOn.document.close(); + this.txtLyrOn.isWritten = true; + } + this.txtLyrOff.visibility = "hide"; + this.txtLyrOn.visibility = "inherit"; + } + if(this.hasImageRollover)this.imageElement.src = this.imageSrcOver; + } + + if(HM_StatusDisplayLink) status = this.linkText; + this.menu.currentItem = this; + if (this.menu.hasChildVisible) { + if(this.menu.visibleChild == this.child && this.menu.visibleChild.hasChildVisible) this.menu.visibleChild.hideChildren(this); + else this.menu.hideChildren(this); + } + + if (this.hasMore && !this.ClickStart) this.showChild(); +} + +function HM_f_ItemOut() { + if ( (!HM_KeepHilite || ((this.tree.TopIsPermanent && (this.tree.treeParent==this)) && !this.menu.hasChildVisible)) && this.hasRollover) { + with(this){ + bgColor = this.tree.BGColor; + if(this.tree.NSFontOver) { + txtLyrOff.visibility = "inherit"; + txtLyrOn.visibility = "hide"; + } + if(this.hasImageRollover)this.imageElement.src = this.imageSrc; + } + } + if(!HM_ClickKill && !HM_UserOverMenu) { + clearTimeout(HM_HideAllTimer); + HM_HideAllTimer = null; + HM_HideAllTimer = setTimeout("HM_CurrentMenu.hideTree()",HM_ChildMilliSecondsVisible); + } +} + +function HM_f_ShowIt(on) { + if (!(this.tree.TopIsPermanent && (this.tree.treeParent==this))) { + if(!this.hasParent || (this.hasParent && this.tree.TopIsPermanent && (this.tree.treeParent==this.parentMenu) )) { + if (on == this.hidden) + eval(on ? this.tree.UponDisplay : this.tree.UponHide) + } + if (on) this.zIndex = ++HM_ZIndex; + this.visibility = on ? "show" : "hide"; + } + if (HM_KeepHilite && this.currentItem && this.currentItem.hasRollover) { + with(this.currentItem){ + bgColor = this.tree.BGColor; + if(this.tree.NSFontOver) { + txtLyrOff.visibility = "inherit"; + txtLyrOn.visibility = "hide"; + } + } + if(this.currentItem.hasImageRollover)this.currentItem.imageElement.src = this.currentItem.imageSrc; + } + this.currentItem = null; +} + +function HM_f_KeepInWindow() { + var ExtraSpace = 10; + var WindowLeftEdge = window.pageXOffset; + var WindowTopEdge = window.pageYOffset; + var WindowWidth = window.innerWidth; + var WindowHeight = window.innerHeight; + var WindowRightEdge = (WindowLeftEdge + WindowWidth) - ExtraSpace; + var WindowBottomEdge = (WindowTopEdge + WindowHeight) - ExtraSpace; + + var MenuLeftEdge = this.xPos; + var MenuRightEdge = MenuLeftEdge + this.clip.width; + var MenuBottomEdge = this.yPos + this.clip.height; + + if (this.hasParent) { + var ParentLeftEdge = this.parentItem.pageX; + this.offsetWidth = this.clip.width; + } + if (MenuRightEdge > WindowRightEdge) { + if (this.hasParent) { + this.xPos = ((ParentLeftEdge - this.parentItem.DistanceToLeftEdge) + this.parentItem.ChildOverlap) - this.offsetWidth; + } + else { + dif = MenuRightEdge - WindowRightEdge; + this.xPos -= dif; + } + this.xPos = Math.max(5,this.xPos); + } + + if (MenuBottomEdge > WindowBottomEdge) { + dif = MenuBottomEdge - WindowBottomEdge; + this.yPos -= dif; + } + + if (MenuLeftEdge < WindowLeftEdge) { + if (this.hasParent) { + this.xPos = (ParentLeftEdge + this.parentItem.DistanceToRightEdge) - this.parentItem.ChildOverlap; + MenuRightEdge = this.xPos + this.offsetWidth; + if(MenuRightEdge > WindowRightEdge) this.xPos -= (MenuRightEdge - WindowRightEdge); + } + else {this.xPos = 5} + } +} + +function HM_f_LinkIt() { + if (this.linkText.indexOf("javascript:")!=-1) eval(this.linkText) + else { + HM_f_HideAll(); + location.href = this.linkText; + } +} + +function HM_f_PopDown(menuname){ + if (!HM_AreLoaded || !HM_AreCreated) return; + menuname = menuname.replace("elMenu",HM_MenuIDPrefix); + var MenuToHide = eval("window."+menuname); + if(!MenuToHide)return; + MenuToHide.isOn = false; + if (!HM_ClickKill) MenuToHide.hideTop(); +} + +function HM_f_HideAll(callingmenu) { + for(var i=0; i + +HM Version 4.1.1 Examples + + + + + + + + +
+

Sample HTML page with 5 Hierarchical Menus

+

Permanent Centered Horizontal Menu (Cascades on click):

+

+

Permanent Horizontal Variable-Width Menu (Cascades on mouseover):

+

+

+ Relative-to-Mouse-Position Vertical Variable-Width Popup Menu (Displays on mouseover)

+
+ +

+ Relative-to-Mouse-Position Using Keywords Popup Menu (Displays on click)

+
+

+ Absolute Position Popup Menu (Displays on mouseover)

+
+ + + + diff --git a/daemons/graphs/jsmenu/prova.gif b/daemons/graphs/jsmenu/prova.gif new file mode 100644 index 0000000000000000000000000000000000000000..7f53e61db458cfb52c05b9117c114a911f87d621 GIT binary patch literal 11995 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 KF647_7W^Onsm%2N literal 0 HcmV?d00001 diff --git a/daemons/graphs/jsmenu/prova.html b/daemons/graphs/jsmenu/prova.html new file mode 100644 index 000000000..7f242943a --- /dev/null +++ b/daemons/graphs/jsmenu/prova.html @@ -0,0 +1,87 @@ + + +HM Version 4.1.1 Examples + + + + + + + + + + + + + + + + + + diff --git a/daemons/graphs/tools/.cvsignore b/daemons/graphs/tools/.cvsignore new file mode 100644 index 000000000..a9c3ad4a1 --- /dev/null +++ b/daemons/graphs/tools/.cvsignore @@ -0,0 +1,7 @@ +*.cm[iaox] +*.[ao] +*.cmxa +drawGraph +uriSetQueue +drawGraph.opt +uriSetQueue.opt diff --git a/daemons/graphs/tools/Makefile b/daemons/graphs/tools/Makefile new file mode 100644 index 000000000..072667031 --- /dev/null +++ b/daemons/graphs/tools/Makefile @@ -0,0 +1,60 @@ +PID= +DOT=dot +#SED=sed "s/font-family:Times;//g" +SED=cat + +REQUIRES = http helm-registry +PREDICATES = mt +OCAMLOPTIONS = -package "$(REQUIRES)" -predicates "$(PREDICATES)" -thread +OCAMLC = ocamlfind ocamlc $(OCAMLOPTIONS) +OCAMLOPT = ocamlfind ocamlopt $(OCAMLOPTIONS) +EXECUTABLES = uriSetQueue drawGraph +EXECUTABLES_OPT = $(patsubst %,%.opt,$(EXECUTABLES)) + +#OBJS=prova.$(PID).svg prova.$(PID).ps prova.$(PID).gif prova.$(PID).ismap prova.$(PID).imap prova.$(PID).html +OBJS=prova.$(PID).gif prova.$(PID).ismap prova.$(PID).html + +all: $(EXECUTABLES) +opt: $(EXECUTABLES_OPT) +world: all opt +clean: + rm -f *.cm[aiox] *.cmxa *.[ao] $(EXECUTABLES) $(EXECUTABLES_OPT) + +tmp: $(OBJS) +clean_tmp: + rm -f $(OBJS) prova.$(PID).dot xx.$(PID)00 xx.$(PID)01 xx.$(PID)02 \ + xx.$(PID)02n xx.$(PID)03 log.$(PID) + +uriSetQueue: uriSetQueue.ml + $(OCAMLC) -linkpkg -o $@ $< +uriSetQueue.opt: uriSetQueue.ml + $(OCAMLOPT) -linkpkg -o $@ $< + +drawGraph: drawGraph.ml + $(OCAMLC) -linkpkg -o $@ $< +drawGraph.opt: drawGraph.ml + $(OCAMLOPT) -linkpkg -o $@ $< + +prova.$(PID).dot: prova0.$(PID).dot + csplit --prefix=xx.$(PID) prova0.$(PID).dot 1 2 `expr \`wc -l prova0.$(PID).dot | sed 's/\([0123456789]\+\) prova0.$(PID).dot/\1/'\` + 1` + ./simplify_deps/simplify_deps.opt < xx.$(PID)02 > xx.$(PID)02n + cat xx.$(PID)01 xx.$(PID)02n xx.$(PID)03 > prova.$(PID).dot + +prova.$(PID).svg: prova.$(PID).dot + $(DOT) -Tsvg prova.$(PID).dot | $(SED) > prova.$(PID).svg + +prova.$(PID).ps: prova.$(PID).dot + $(DOT) -Tps prova.$(PID).dot > prova.$(PID).ps + +prova.$(PID).imap: prova.$(PID).dot + $(DOT) -Timap prova.$(PID).dot > prova.$(PID).imap + +prova.$(PID).gif: prova.$(PID).dot + $(DOT) -Tgif prova.$(PID).dot > prova.$(PID).gif + +prova.$(PID).ismap: prova.$(PID).dot + $(DOT) -Tismap prova.$(PID).dot > prova.$(PID).ismap + +prova.$(PID).html: prova.$(PID).ismap + cat xx.$(PID)00 prova.$(PID).ismap | ./mk_html.pl $(PID) > prova.$(PID).html + diff --git a/daemons/graphs/tools/drawGraph.conf.xml.sample b/daemons/graphs/tools/drawGraph.conf.xml.sample new file mode 100644 index 000000000..a26b4b990 --- /dev/null +++ b/daemons/graphs/tools/drawGraph.conf.xml.sample @@ -0,0 +1,7 @@ + + +
+ 58083 + /projects/helm/daemons/graphs/tools +
+
diff --git a/daemons/graphs/tools/drawGraph.ml b/daemons/graphs/tools/drawGraph.ml new file mode 100644 index 000000000..c17902fbc --- /dev/null +++ b/daemons/graphs/tools/drawGraph.ml @@ -0,0 +1,101 @@ +(* Copyright (C) 2002, HELM Team. + * + * This file is part of HELM, an Hypertextual, Electronic + * Library of Mathematics, developed at the Computer Science + * Department, University of Bologna, Italy. + * + * HELM is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * HELM is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with HELM; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + * For details, see the HELM World-Wide-Web page, + * http://cs.unibo.it/helm/. + *) + +open Printf;; + +let debug = true;; +let debug_print s = if debug then prerr_endline s;; + +let configuration_file = "/projects/helm/etc/drawGraph.conf.xml";; + +let daemon_name = "Draw Graph";; + +let wget url fname = + prerr_endline (sprintf "DEBUG: wgetting url '%s'" url); + let oc = open_out fname in + Http_user_agent.get_iter (output_string oc) url; + close_out oc +;; + +let errmsg = + sprintf +" + + Graph: error + + +

Error occurred while drawing graph!
Please report the occured problem

+

%s

+ +" +in +let string_of_exit_status = function + | Unix.WEXITED n -> sprintf "Process exited with code %d" n + | Unix.WSIGNALED n -> sprintf "Process killed by signal %d" n + | Unix.WSTOPPED n -> sprintf "Process stopped by signal %d" n +in +let callback (req: Http_types.request) outchan = + try + (match req#path with + | "/draw" -> + let url = req#param "url" in + let pid = Unix.getpid () in + wget (sprintf "%s¶m.PID=%d" url pid) (sprintf "prova0.%d.dot" pid); + (match Unix.system (sprintf "make tmp PID=%d > log.%d" pid pid) with + | Unix.WEXITED 0 -> + debug_print "HTML successfully generated"; + Http_daemon.respond_file (sprintf "prova.%d.html" pid) outchan + | status -> + debug_print "Failure, sending error message"; + let res = + new Http_response.response + ~body: + (errmsg ("Exit status: " ^ (string_of_exit_status status))) + () + in + Http_daemon.respond_with res outchan) + | "/get_gif" -> + let pid = req#param "pid" in + Http_daemon.respond_file (sprintf "prova.%s.gif" pid) outchan; + ignore (Unix.system ( + sprintf "make PID=%s clean_tmp; rm -f prova0.%s.dot" pid pid)) + | invalid_request -> + Http_daemon.respond_error ~code:(`Status (`Client_error `Bad_request)) + outchan) + with + | Http_types.Param_not_found attr_name -> + Http_daemon.respond_error ~code:(`Status (`Client_error `Bad_request)) + ~body:(sprintf "Parameter '%s' is missing" attr_name) + outchan +in +Helm_registry.load_from configuration_file; +let port = Helm_registry.get_int "draw_graph.port" in +Sys.chdir (Helm_registry.get "draw_graph.dir"); +printf "%s started and listening on port %d\n" daemon_name port; +printf "current directory is %s\n" (Sys.getcwd ()); +flush stdout; +Http_daemon.start' ~port callback; +printf "%s is terminating, bye!\n" daemon_name + diff --git a/daemons/graphs/tools/mk_html.pl b/daemons/graphs/tools/mk_html.pl new file mode 100755 index 000000000..a928cd5ad --- /dev/null +++ b/daemons/graphs/tools/mk_html.pl @@ -0,0 +1,47 @@ +#!/usr/bin/perl + +use URI::Escape; + +print < + + + Graph + + + + +EOT + +my $count = 0; + +while () { + $count++; + my (undef,$point1,$point2,$uri) = split; + my ($point1x,$point1y) = split /,/,$point1; + my ($point2x,$point2y) = split /,/,$point2; + $point1y = substr($point1y,0,-1); + $point2y = substr($point2y,0,-1); + $point1x = substr($point1x,1); + $point2x = substr($point2x,1); + + print < +EOT +} + +print < + + + +EOT diff --git a/daemons/graphs/tools/simplify_deps/.cvsignore b/daemons/graphs/tools/simplify_deps/.cvsignore new file mode 100644 index 000000000..51af83437 --- /dev/null +++ b/daemons/graphs/tools/simplify_deps/.cvsignore @@ -0,0 +1,5 @@ +simplify_deps.cmi +simplify_deps.cmo +simplify_deps.cmx +simplify_deps +simplify_deps.opt diff --git a/daemons/graphs/tools/simplify_deps/Makefile b/daemons/graphs/tools/simplify_deps/Makefile new file mode 100644 index 000000000..7395c8c9b --- /dev/null +++ b/daemons/graphs/tools/simplify_deps/Makefile @@ -0,0 +1,12 @@ +OBJS = simplify_deps simplify_deps.opt + +all: $(OBJS) + +simplify_deps: simplify_deps.ml + ocamlfind ocamlc -package str -linkpkg simplify_deps.ml -o simplify_deps + +simplify_deps.opt: simplify_deps.ml + ocamlfind ocamlopt -package str -linkpkg simplify_deps.ml -o simplify_deps.opt + +clean: + rm -f $(OBJS) simplify_deps.cm[iox] simplify_deps.o diff --git a/daemons/graphs/tools/simplify_deps/simplify_deps.ml b/daemons/graphs/tools/simplify_deps/simplify_deps.ml new file mode 100644 index 000000000..9b0fb0042 --- /dev/null +++ b/daemons/graphs/tools/simplify_deps/simplify_deps.ml @@ -0,0 +1,102 @@ +type node = + Node of string * node list ref (* label, children *) + +let debug = false;; + +(************************************************) +(* SIMPLIFICATION AND PRETTY-PRINTING *) +(************************************************) + +let reachable target source_arcs = + let rec find s = + if s = target then true + else + let Node (_,arcs) = s in + List.fold_left (fun i n -> i or find n) false !arcs + in + List.fold_left + (fun i n -> + i or + (if n = target then + (* this is the arc we would like to get rid of *) + false + else + find n + ) + ) false source_arcs +;; + +let consider_arc (source,target,rest) = + let Node (source_name,source_arcs) = source in + let Node (target_name,_) = target in + if not (reachable target !source_arcs) then + print_endline (source_name ^ " -> " ^ target_name ^ rest ^ ";") + else + if debug then + print_endline (source_name ^ " -> " ^ target_name ^ " [color=green];") +;; + +let simplify_deps_and_output_them = + List.iter consider_arc +;; + +(************************************************) +(* PARSING *) +(************************************************) + +let nodes = ref [];; +let arcs = ref [];; (* (source,target) *) + +let search_node s = + List.find (function Node (s',_) -> s' = s) !nodes +;; + +let parse () = + try + while true do + let line = read_line () in + if Str.string_match (Str.regexp " \\([^ ]*\\) -> \\([^ ;]*\\)\\(\\( \\[.*\\]\\)?\\);") line 0 then + let source = Str.matched_group 1 line in + let target = Str.matched_group 2 line in + begin + if source <> target then + (* not a self loop *) + let rest = Str.matched_group 3 line in + let tar = + try + search_node target + with + Not_found -> + let tar = Node (target,ref []) in + nodes := tar :: !nodes ; + tar + in + let sou = + try + let sou = search_node source in + let Node (_,ts) = sou in + ts := tar::!ts ; + sou + with + Not_found -> + let sou = Node (source,ref [tar]) in + nodes := sou :: !nodes ; + sou + in + arcs := (sou,tar,rest)::!arcs + end + else + print_endline line + done + with + End_of_file -> () +;; + +(************************************************) +(* MAIN *) +(************************************************) + +let _ = + parse () ; + simplify_deps_and_output_them !arcs +;; diff --git a/daemons/graphs/tools/uriSetQueue.conf.xml.sample b/daemons/graphs/tools/uriSetQueue.conf.xml.sample new file mode 100644 index 000000000..9bfc3d859 --- /dev/null +++ b/daemons/graphs/tools/uriSetQueue.conf.xml.sample @@ -0,0 +1,6 @@ + + +
+ 58082 +
+
diff --git a/daemons/graphs/tools/uriSetQueue.ml b/daemons/graphs/tools/uriSetQueue.ml new file mode 100644 index 000000000..430275800 --- /dev/null +++ b/daemons/graphs/tools/uriSetQueue.ml @@ -0,0 +1,190 @@ +(* Copyright (C) 2002, HELM Team. + * + * This file is part of HELM, an Hypertextual, Electronic + * Library of Mathematics, developed at the Computer Science + * Department, University of Bologna, Italy. + * + * HELM is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * HELM is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with HELM; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + * For details, see the HELM World-Wide-Web page, + * http://cs.unibo.it/helm/. + *) + +let debug = true;; +let debug_print s = if debug then prerr_endline s;; +Http_common.debug := debug;; + +open Printf;; + +let configuration_file = "/projects/helm/etc/uriSetQueue.conf.xml";; +let daemon_name = "Uri Set Queue";; + +module OrderedUri: Set.OrderedType with type t = string = + struct + type t = string + let compare = compare + end +module UriSet = Set.Make (OrderedUri) +type uri_queue = { + mutable size: int; + mutable overflowed: bool; + uris: string Queue.t; + mutable olduris: UriSet.t; +} + (** raised when a queue is accessed before being defined *) +exception Queue_not_found of int;; + (** global uri_queue, used by all children *) +let uri_queue = { + size = 0; overflowed = false; uris = Queue.create (); olduris = UriSet.empty +};; +let (get_queue, add_queue, remove_queue) = + let uri_queues = Hashtbl.create 17 in + ((fun pid -> (* get_queue *) + try + Hashtbl.find uri_queues pid + with Not_found -> raise (Queue_not_found pid)), + (fun pid size -> (* add_queue *) + Hashtbl.replace + uri_queues + pid + { size = size; overflowed = false; + uris = Queue.create (); olduris = UriSet.empty }), + (fun pid -> (* remove_queue *) + try + Hashtbl.remove uri_queues pid + with Not_found -> raise (Queue_not_found pid))) +;; + +exception Found;; +let queue_mem item queue = (* mem function over queues *) + try + Queue.iter (fun e -> if item = e then raise Found) queue; + false + with Found -> true +;; + +let callback (req: Http_types.request) outchan = + try + let res = new Http_response.response () in + res#addBasicHeaders; + res#setContentType "text/xml"; + (match req#path with + + | "/add_if_not_in" -> + let (uri, pid) = (req#param "uri", int_of_string (req#param "PID")) in + debug_print (sprintf "Adding uri '%s' to queue '%d'" uri pid); + let queue = get_queue pid in + let result = + if (Queue.length queue.uris) + (UriSet.cardinal queue.olduris) >= + queue.size + then + begin (* overflow! *) + queue.overflowed <- true; + debug_print "Answer: not_added_because_already_too_many"; + "not_added_because_already_too_many" + end else begin (* there's room for another uri *) + if (queue_mem uri queue.uris) || (UriSet.mem uri queue.olduris) + then + begin (* url already in *) + debug_print "Answer: already_in"; + "already_in" + end else begin (* uri not in *) + Queue.add uri queue.uris; + debug_print "Answer: added"; + "added" + end + end + in + res#setBody (sprintf "\n<%s/>\n" result); + if debug then res#serialize stderr; + Http_daemon.respond_with res outchan + + | "/is_overflowed" -> + let pid = int_of_string (req#param "PID") in + let queue = get_queue pid in + let result = string_of_bool (queue.overflowed) in + debug_print (sprintf "%d queue is_overflowed = %s" pid result); + res#setBody (sprintf "\n<%s/>\n" result); + if debug then res#serialize stderr; + Http_daemon.respond_with res outchan + + | "/set_uri_set_size" -> + let (pid, size) = + (int_of_string (req#param "PID"), int_of_string (req#param "size")) + in + debug_print (sprintf "Setting size '%d' for queue '%d'" size pid); + (try + let queue = get_queue pid in + queue.size <- size; + with Queue_not_found p -> + assert (p = pid); + add_queue pid size); + res#setBody "\n\n"; + if debug then res#serialize stderr; + Http_daemon.respond_with res outchan + + | "/get_next" -> + let pid = int_of_string (req#param "PID") in + debug_print (sprintf "Getting next uri from queue '%d'" pid); + let queue = get_queue pid in + let element = (* xml response's root element *) + try + let uri = Queue.take queue.uris in + queue.olduris <- UriSet.add uri queue.olduris; + sprintf + "<%suri value=\"%s\"/>" + (if queue.overflowed then "marked_" else "") + uri + with Queue.Empty -> "" + in + res#setBody ("\n" ^ element ^ "\n"); + if debug then res#serialize stderr; + Http_daemon.respond_with res outchan + + | "/reset_to_empty" -> + let pid = int_of_string (req#param "PID") in + remove_queue pid; + debug_print (sprintf "Resetting queue '%d'" pid); + res#setBody "\n\n"; + if debug then res#serialize stderr; + Http_daemon.respond_with res outchan + + | invalid_request -> + debug_print ("Invalid request received"); + Http_daemon.respond_error + ~code:(`Status (`Client_error `Bad_request)) outchan); + prerr_endline "Request done!\n" + with + | Http_types.Param_not_found attr_name -> + Http_daemon.respond_error ~code:(`Status (`Client_error `Bad_request)) + ~body:(sprintf "Parameter '%s' is missing" attr_name) + outchan + | Failure "int_of_string" -> (* error in converting some paramters *) + Http_daemon.respond_error + ~code:(`Status (`Client_error `Bad_request)) outchan + | Queue_not_found queue_name -> + Http_daemon.respond_error ~code:(`Status (`Client_error `Bad_request)) + ~body:(sprintf "Queue '%d' is not defined" queue_name) + outchan +in + +Helm_registry.load_from configuration_file; +let port = Helm_registry.get_int "uri_set_queue.port" in +printf "%s started and listening on port %d\n" daemon_name port; +flush stdout; +Http_daemon.start' ~port ~mode:`Thread callback; +printf "%s is terminating, bye!\n" daemon_name + diff --git a/daemons/http_getter/.cvsignore b/daemons/http_getter/.cvsignore new file mode 100644 index 000000000..111b760aa --- /dev/null +++ b/daemons/http_getter/.cvsignore @@ -0,0 +1,14 @@ +*.cmi +*.cmo +*.cma +*.cmx +*.cmxa +*.a +*.o +http_getter +http_getter.opt +autom4te.cache +buildTimeOpts.ml +config.log +config.status +configure diff --git a/daemons/http_getter/AUTHORS b/daemons/http_getter/AUTHORS new file mode 100644 index 000000000..5eab6c071 --- /dev/null +++ b/daemons/http_getter/AUTHORS @@ -0,0 +1,11 @@ + +- current version (the OCaml one!): + + Stefano Zacchiroli + +- for the old Perl version: + + Claudio Sacerdoti Coen + Stefano Zacchiroli + Luca Padovani + diff --git a/daemons/http_getter/BUGS b/daemons/http_getter/BUGS new file mode 100644 index 000000000..e69de29bb diff --git a/daemons/http_getter/COPYING b/daemons/http_getter/COPYING new file mode 100644 index 000000000..d60c31a97 --- /dev/null +++ b/daemons/http_getter/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/daemons/http_getter/ChangeLog b/daemons/http_getter/ChangeLog new file mode 100644 index 000000000..cd6f55bbd --- /dev/null +++ b/daemons/http_getter/ChangeLog @@ -0,0 +1,6 @@ +- ignore comments and blank lines in servers file +- added "list_servers", "add_server", "remove_server" methods +- bugfix: multiple definition of URI by different servers are now permitted + +08/01/2003: OCaml reimplementation available! (version 0.2.1) +28/12/2000: First alpha release diff --git a/daemons/http_getter/Makefile b/daemons/http_getter/Makefile new file mode 100644 index 000000000..d7b1089af --- /dev/null +++ b/daemons/http_getter/Makefile @@ -0,0 +1,31 @@ +VERSION = 0.3.0 +NAME = http_getter + +REQUIRES = helm-getter helm-logger helm-registry netstring +COMMONOPTS = -package "$(REQUIRES)" -pp camlp4o -thread +OCAMLFIND = OCAMLPATH=../ocaml/METAS ocamlfind +OCAMLC = $(OCAMLFIND) ocamlc -g $(COMMONOPTS) +OCAMLOPT = $(OCAMLFIND) opt $(COMMONOPTS) + +all: byte +byte: $(NAME) +opt: $(NAME).opt +world: byte opt + +$(NAME): buildTimeOpts.cmo main.ml + $(OCAMLC) -linkpkg -o $@ $^ +$(NAME).opt: buildTimeOpts.cmx main.ml + $(OCAMLOPT) -linkpkg -o $@ $^ + +%.cmo: %.ml + $(OCAMLC) -c $< +%.cmx: %.ml + $(OCAMLOPT) -c $< + +distclean: clean + rm -f buildTimeOpts.ml +clean: + rm -f *.cm[aiox] *.o $(NAME){,.opt} *.dot + +.PHONY: all byte opt world clean distclean + diff --git a/daemons/http_getter/Makefile.overrides b/daemons/http_getter/Makefile.overrides new file mode 100644 index 000000000..4b669eb49 --- /dev/null +++ b/daemons/http_getter/Makefile.overrides @@ -0,0 +1,2 @@ +http_getter_types.cmi http_getter_types.cmo: http_getter_types.ml + $(OCAMLC) -c $< diff --git a/daemons/http_getter/NEWS b/daemons/http_getter/NEWS new file mode 100644 index 000000000..aaf0047a2 --- /dev/null +++ b/daemons/http_getter/NEWS @@ -0,0 +1,13 @@ + +09/02/2004 + + Split getter in backend and frontend. Frontend is the only remaining file here + (namely main.ml). Backend is shipped in the helm-http_getter library (look in + the HELM cvs, dir ocaml/getter/). + -- Zack + +08/01/2003 + + Fully OCaml HTTP Getter is now available: go and burn the Perl implementation! + -- Zack + diff --git a/daemons/http_getter/README b/daemons/http_getter/README new file mode 100644 index 000000000..1074b3bf5 --- /dev/null +++ b/daemons/http_getter/README @@ -0,0 +1,7 @@ +HELM (Hypertextual Electronic Library of Mathematics) is a project aimed +at the creation of tools for the development and exploitation of a huge +distributed library of formal mathematical knowledge. This package holds +the getter used to map logical names into phisical names and download +the required files. + +For more information see http://helm.cs.unibo.it diff --git a/daemons/http_getter/buildTimeOpts.ml.in b/daemons/http_getter/buildTimeOpts.ml.in new file mode 100644 index 000000000..b4865ac3e --- /dev/null +++ b/daemons/http_getter/buildTimeOpts.ml.in @@ -0,0 +1,3 @@ + +let conffile = "@GETTER_CONF_FILE@";; + diff --git a/daemons/http_getter/configure.ac b/daemons/http_getter/configure.ac new file mode 100644 index 000000000..36efda576 --- /dev/null +++ b/daemons/http_getter/configure.ac @@ -0,0 +1,13 @@ +AC_INIT(main.ml) + +AC_ARG_WITH(conffile, + AS_HELP_STRING([--with-conffile=fname], + [set default run time configuration file (default is /etc/http_getter.conf.xml]), + [GETTER_CONF_FILE=$withval], [GETTER_CONF_FILE=/etc/http_getter.conf.xml]) + +AC_SUBST(GETTER_CONF_FILE) + +AC_OUTPUT([ + buildTimeOpts.ml +]) + diff --git a/daemons/http_getter/http_getter.conf.xml.sample b/daemons/http_getter/http_getter.conf.xml.sample new file mode 100644 index 000000000..b98763cc6 --- /dev/null +++ b/daemons/http_getter/http_getter.conf.xml.sample @@ -0,0 +1,11 @@ + + +
+ /projects/helm/var/servers.txt + /tmp/helm/cache + /projects/helm/var + /projects/helm/xml/dtd + 58081 + http_getter.log +
+
diff --git a/daemons/http_getter/main.ml b/daemons/http_getter/main.ml new file mode 100644 index 000000000..3117a85c9 --- /dev/null +++ b/daemons/http_getter/main.ml @@ -0,0 +1,352 @@ +(* Copyright (C) 2003-2005, HELM Team. + * + * This file is part of HELM, an Hypertextual, Electronic + * Library of Mathematics, developed at the Computer Science + * Department, University of Bologna, Italy. + * + * HELM is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * HELM is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with HELM; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + * For details, see the HELM World-Wide-Web page, + * http://helm.cs.unibo.it/ + *) + +open Printf + +open Http_getter_common +open Http_getter_const +open Http_getter_misc +open Http_getter_types + + (* constants *) + +let configuration_file = BuildTimeOpts.conffile + +let common_headers = [ + "Cache-Control", "no-cache"; + "Pragma", "no-cache"; + "Expires", "0" +] + + (* HTTP queries argument parsing *) + + (* parse encoding ("format" parameter), default is `Normal *) +let parse_enc (req: Http_types.request) = + try + (match req#param "format" with + | "normal" -> `Normal + | "gz" -> `Gzipped + | s -> raise (Bad_request ("Invalid format: " ^ s))) + with Http_types.Param_not_found _ -> `Normal + + (* parse "patch_dtd" parameter, default is true *) +let parse_patch (req: Http_types.request) = + try + (match req#param "patch_dtd" with + | s when String.lowercase s = "yes" -> true + | s when String.lowercase s = "no" -> false + | s -> raise (Bad_request ("Invalid patch_dtd value: " ^ s))) + with Http_types.Param_not_found _ -> true + + (* parse output format ("format" parameter), no default value *) +let parse_output_format meth (req: Http_types.request) = + match req#param "format" with + | s when String.lowercase s = "txt" -> `Text + | s when String.lowercase s = "xml" -> `Xml + | s -> raise (Bad_request ("Invalid /" ^ meth ^ " format: " ^ s)) + +let xml_escape = Netencoding.Html.encode ~in_enc:`Enc_utf8 () + +let html_tag ?exn () = + let xml_decl = "\n" in + match exn with + | Some (exn, arg) -> + let (exn, arg) = (xml_escape exn, xml_escape arg) in + sprintf + ("%s\n") + xml_decl xhtml_ns helm_ns exn arg + | None -> + sprintf "%s\n" + xml_decl xhtml_ns helm_ns + +let mk_return_fun pp_fun contype msg outchan = + Http_daemon.respond + ~body:(pp_fun msg) ~headers:["Content-Type", contype] outchan + +let pp_msg s = sprintf "%s%s" (html_tag ()) s +let null_pp s = s + +let return_html_error exn = + let pp_error s = + sprintf + ("%s\nHttp Getter error: %s" + ^^ "") + (html_tag ~exn ()) s + in + mk_return_fun pp_error "text/xml" + +let return_html_internal_error exn = + let pp_internal_error s = + sprintf + ("%s\nHttp Getter Internal error: %s" + ^^ "") + (html_tag ~exn ()) s + in + mk_return_fun pp_internal_error "text/xml" + +let return_html_msg = mk_return_fun pp_msg "text/xml" +let return_html_raw = mk_return_fun null_pp "text/xml" +let return_xml_raw = mk_return_fun null_pp "text/xml" +let return_400 exn body = return_html_error exn body + +let return_all_uris doctype uris outchan = + Http_daemon.send_basic_headers ~code:(`Code 200) outchan; + Http_daemon.send_header "Content-Type" "text/xml" outchan; + Http_daemon.send_headers common_headers outchan; + Http_daemon.send_CRLF outchan; + output_string + outchan + (sprintf +" + + +<%s> +" + doctype + (Lazy.force Http_getter_env.my_own_url) + doctype + doctype); + List.iter + (fun uri -> output_string outchan (sprintf "\t\n" uri)) + uris; + output_string outchan (sprintf "\n" doctype) + +let return_all_xml_uris fmt outchan = + let uris = Http_getter.getalluris () in + match fmt with + | `Text -> + let buf = Buffer.create 10240 in + List.iter (bprintf buf "%s\n") uris ; + let body = Buffer.contents buf in + Http_daemon.respond + ~headers:(("Content-Type", "text/plain") :: common_headers) + ~body outchan + | `Xml -> return_all_uris "alluris" uris outchan + +let return_ls regexp fmt outchan = + let ls_items = Http_getter.ls regexp in + let buf = Buffer.create 10240 in + (match fmt with + | `Text -> + List.iter + (function + | Ls_section dir -> bprintf buf "dir, %s\n" dir + | Ls_object obj -> + bprintf buf "object, %s, <%s,%s,%s,%s>\n" + obj.uri (if obj.ann then "YES" else "NO") + (string_of_ls_flag obj.types) + (string_of_ls_flag obj.body) + (string_of_ls_flag obj.proof_tree)) + ls_items + | `Xml -> + Buffer.add_string buf "\n"; + bprintf buf "\n" + (Lazy.force Http_getter_env.my_own_url); + Buffer.add_string buf "\n"; + List.iter + (function + | Ls_section dir -> bprintf buf "
%s
\n" dir + | Ls_object obj -> + bprintf buf +" +\t +\t +\t +\t + +" + obj.uri (if obj.ann then "YES" else "NO") + (string_of_ls_flag obj.types) + (string_of_ls_flag obj.body) + (string_of_ls_flag obj.proof_tree)) + ls_items; + Buffer.add_string buf "
\n"); + let body = Buffer.contents buf in + Http_daemon.respond + ~headers:(("Content-Type", "text/plain") :: common_headers) + ~body outchan + +let return_help outchan = return_html_raw (Http_getter.help ()) outchan + +let return_resolve uri outchan = + try + return_xml_raw + (sprintf "\n" (Http_getter.resolve uri)) + outchan + with + | Unresolvable_URI _ -> return_xml_raw "\n" outchan + | Key_not_found _ -> return_xml_raw "\n" outchan + +let log_failure msg = Http_getter_logger.log ("Request not fulfilled: " ^ msg) + +let convert_file ~from_enc ~to_enc fname = + let remove f = fun () -> if Sys.file_exists f then Sys.remove f in + match from_enc, to_enc with + | `Normal, `Normal + | `Gzipped, `Gzipped -> fname, (fun () -> ()) + | `Normal, `Gzipped -> + let tmp = Http_getter_misc.tempfile () in + Http_getter_misc.gzip ~keep:true ~output:tmp fname; + tmp, remove tmp + | `Gzipped, `Normal -> + let tmp = Http_getter_misc.tempfile () in + Http_getter_misc.gunzip ~keep:true ~output:tmp fname; + tmp, remove tmp + +let is_gzip fname = Http_getter_misc.extension fname = ".gz" + +let patch_fun_for uri url = + let xmlbases = + if Http_getter_common.is_theory_uri uri then + Some (Filename.dirname uri, Filename.dirname url) + else + None + in + Http_getter_common.patch_xml ?xmlbases ~via_http:true () + +let respond_dtd patch_dtd fname outchan = + let via_http = false in + let patch_fun = + if patch_dtd then Some (Http_getter_common.patch_dtd ~via_http ()) + else None + in + Http_getter_common.return_file ~via_http:true ~fname ~contype:"text/plain" + ~gunzip:false ?patch_fun ~enc:`Normal outchan + +(* let respond_xsl + ?(via_http = true) ?(enc = `Normal) ?(patch = true) ~url outchan + = + let patch_fun = + if patch then Http_getter_common.patch_xsl ~via_http () else (fun x -> x) + in + let fname = tempfile () in + finally (fun () -> Sys.remove fname) (lazy ( + wget ~output:fname url; + return_file ~via_http ~fname ~contype:"text/xml" ~patch_fun ~enc outchan + )) *) +(* | "/getxslt" -> + Http_getter_cache.respond_xsl + ~url:(Http_getter.resolve (req#param "uri")) + ~patch:(parse_patch req) outchan *) + +let respond_xslt patch_xslt xslt_name outchan = + let fname = Http_getter.getxslt xslt_name in + let patch_fun = + if patch_xslt then Some (Http_getter_common.patch_xsl ~via_http:true ()) + else None + in + Http_getter_common.return_file ~fname ~contype:"text/xml" ?patch_fun + ~gunzip:false ~via_http:true ~enc:`Normal outchan + + (* thread action *) + +let callback (req: Http_types.request) outchan = + try + Http_getter_logger.log ("Connection from " ^ req#clientAddr); + Http_getter_logger.log ("Received request: " ^ req#uri); + (match req#path with + | "/help" -> return_help outchan + | "/getxml" -> + let uri = req#param "uri" in + let fname = Http_getter.getxml uri in (* local name, in cache *) + let remote_name = Http_getter.resolve uri in (* remote name *) + let src_enc = if is_gzip fname then `Gzipped else `Normal in + let enc = parse_enc req in + let fname, cleanup = convert_file ~from_enc:src_enc ~to_enc:enc fname in + let contenc = if enc = `Gzipped then Some "x-gzip" else None in + let patch_fun = + if parse_patch req + then Some (patch_fun_for uri remote_name) + else None + in + let gunzip = (enc = `Gzipped) in + (try + Http_getter_common.return_file + ~fname ~contype:"text/xml" ?contenc ?patch_fun ~gunzip + ~via_http:true ~enc outchan; + with exn -> cleanup (); raise exn); + cleanup () + | "/getxslt" -> respond_xslt (parse_patch req) (req#param "uri") outchan + | "/getdtd" -> + let fname = Http_getter.getdtd (req#param "uri") in + respond_dtd (parse_patch req) fname outchan + | "/resolve" -> return_resolve (req#param "uri") outchan + | "/clean_cache" -> + Http_getter.clean_cache (); + return_html_msg "Done." outchan + | "/getalluris" -> + return_all_xml_uris (parse_output_format "getalluris" req) outchan + | "/ls" -> + return_ls (req#param "baseuri") (parse_output_format "ls" req) outchan + | "/getempty" -> + Http_daemon.respond ~body:Http_getter_const.empty_xml outchan + | invalid_request -> + Http_daemon.respond_error ~code:(`Status (`Client_error `Bad_request)) + outchan); + Http_getter_logger.log "Done!\n" + with + | Http_types.Param_not_found attr_name -> + let msg = sprintf "Parameter '%s' is missing" attr_name in + log_failure msg; + return_400 ("bad_request", msg) msg outchan + | Bad_request msg -> + log_failure msg; + return_html_error ("bad_request", msg) msg outchan + | Internal_error msg -> + log_failure msg; + return_html_internal_error ("internal_error", msg) msg outchan + | exn -> + let msg = "uncaught exception: " ^ (Printexc.to_string exn) in + (match exn with + | Http_getter_types.Key_not_found uri -> + return_html_error ("key_not_found", uri) msg outchan + | _ -> + log_failure msg; + return_html_error ("uncaught_exception", msg) msg outchan) + +let batch_update = ref false + +let args = [ ] + + (* Main *) +let main () = + Arg.parse args (fun _-> ()) "http_getter honors the following options:\n"; + Helm_registry.load_from configuration_file; + Http_getter.init (); + print_string (Http_getter_env.env_to_string ()); + flush stdout; + Sys.catch_break true; + let d_spec = Http_daemon.daemon_spec + ~mode:`Thread ~timeout:(Some 600) + ~port:(Lazy.force Http_getter_env.port) + ~callback:callback () + in + try + Http_daemon.main d_spec + with Sys.Break -> () + +let _ = main () + diff --git a/daemons/http_getter/panel/.cvsignore b/daemons/http_getter/panel/.cvsignore new file mode 100644 index 000000000..5c9fd1612 --- /dev/null +++ b/daemons/http_getter/panel/.cvsignore @@ -0,0 +1 @@ +getter-panel.tar.gz diff --git a/daemons/http_getter/panel/Makefile b/daemons/http_getter/panel/Makefile new file mode 100644 index 000000000..2663e20a1 --- /dev/null +++ b/daemons/http_getter/panel/Makefile @@ -0,0 +1,12 @@ + +all: + +clean: + rm -f getter-panel.tar.gz + +cleanbak: + rm -rf *~ + +dist: clean cleanbak + cd ..; tar cvfz getter-panel.tar.gz panel ; mv getter-panel.tar.gz panel + diff --git a/daemons/http_getter/panel/control.html b/daemons/http_getter/panel/control.html new file mode 100644 index 000000000..495c420e7 --- /dev/null +++ b/daemons/http_getter/panel/control.html @@ -0,0 +1,129 @@ + + + +Getter Control Panel + + + + + + + + + + + +
Getter Control Panel
+ +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ Getter URL + + +
+
+
+ Check if Getter is running and request Help:
+ +
+
+
+ Update Getter's maps:
+ +
+
+
+ Clean cache (must be done every time a file is modified)
+ +
+
+
+ List servers:
+ +
+
+
+ Add a server to the servers list:
+ Server URL:
+ Server position:
+ +
+
+
+ Remove a server from the servers list:
+ Server number:
+ +
+
+
+ +
+ + +
+ +
+ +
+
+ In case you want to customize the panel for your own needs, you can download + the source archive (HTML + JavaScript): + +
+ + + + + diff --git a/daemons/http_getter/panel/control.js b/daemons/http_getter/panel/control.js new file mode 100644 index 000000000..45736aaa4 --- /dev/null +++ b/daemons/http_getter/panel/control.js @@ -0,0 +1,35 @@ + +function getParam(name, def) +{ + var search = top.location.search; + search = search.slice(1); + var args = search.split("&"); + var value = "-1"; + for (var i = 0 ; i < args.length ; i++) { + var couple = args[i].split("="); + if (couple[0] == name) value = couple[1]; + } + if (value == "-1") value = def; + return value; +} + +function getInitialGetterURL() +{ + return getParam("getterURL", "http://mowgli.cs.unibo.it:58081/"); +} + +function getGetterURL() +{ + return document.getterURL.elements[0].value; +} + +function selectGetterURL(ss) +{ + if (ss.selectedIndex == 0) { + document.getterURL.elements[0].value = ""; + } else { + //document.getterURL.elements[0].value = "http://" + ss.options[ss.selectedIndex].value + ":8081/"; + document.getterURL.elements[0].value = "http://" + ss.options[ss.selectedIndex].value; + } +} + diff --git a/daemons/http_getter/panel/index.html b/daemons/http_getter/panel/index.html new file mode 100644 index 000000000..caeebcf24 --- /dev/null +++ b/daemons/http_getter/panel/index.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/daemons/http_getter/panel/welcome.html b/daemons/http_getter/panel/welcome.html new file mode 100644 index 000000000..f6fbed438 --- /dev/null +++ b/daemons/http_getter/panel/welcome.html @@ -0,0 +1,6 @@ + + + + + + diff --git a/daemons/http_getter/tools/dump_db.ml b/daemons/http_getter/tools/dump_db.ml new file mode 100755 index 000000000..3a64f1dd6 --- /dev/null +++ b/daemons/http_getter/tools/dump_db.ml @@ -0,0 +1,6 @@ +#!/usr/bin/ocamlrun /usr/bin/ocaml +#use "topfind";; +#require "dbm";; +let db = Dbm.opendbm Sys.argv.(1) [ Dbm.Dbm_rdonly ] 0 in +Dbm.iter (Printf.printf "%s: %s\n") db; +Dbm.close db diff --git a/daemons/http_getter/tools/dump_db.pl b/daemons/http_getter/tools/dump_db.pl new file mode 100755 index 000000000..95d3f4ab5 --- /dev/null +++ b/daemons/http_getter/tools/dump_db.pl @@ -0,0 +1,19 @@ +#!/usr/bin/perl -w + +# dump on stdout the data contained in a db file. +# Print one line for each record in this format +# = +# +# Stefano "Zack" Zacchiroli +# + +use strict qw(O_RDONLY); +use DB_File; + +my $dbfile = shift || die "which db file ?"; +my %map; +tie(%map, 'DB_File', $dbfile, O_RDONLY, 0664); +while(($key,$value) = each %map) { + print "$key = $value\n"; +} + diff --git a/daemons/http_getter/tools/uri_escape.pl b/daemons/http_getter/tools/uri_escape.pl new file mode 100755 index 000000000..0303e3f73 --- /dev/null +++ b/daemons/http_getter/tools/uri_escape.pl @@ -0,0 +1,16 @@ +#!/usr/bin/perl -w +use strict; + +# escape a URI with uri escaping +# +# Stefano "Zack" Zacchiroli +# + + +use URI::Escape; + +while(<>) { + chomp; + print uri_escape($_); + print "\n"; +} diff --git a/daemons/http_getter/tools/uri_unescape.pl b/daemons/http_getter/tools/uri_unescape.pl new file mode 100755 index 000000000..7f77d3768 --- /dev/null +++ b/daemons/http_getter/tools/uri_unescape.pl @@ -0,0 +1,15 @@ +#!/usr/bin/perl -w +use strict; + +# unescape a URI escaped with uri escaping +# +# Stefano "Zack" Zacchiroli +# + +use URI::Escape; + +while(<>) { + chomp; + print uri_unescape($_); + print "\n"; +} diff --git a/daemons/proofChecker/.cvsignore b/daemons/proofChecker/.cvsignore new file mode 100644 index 000000000..aae07b862 --- /dev/null +++ b/daemons/proofChecker/.cvsignore @@ -0,0 +1 @@ +*.cm[iox] *.o proofChecker proofChecker.opt diff --git a/daemons/proofChecker/.depend b/daemons/proofChecker/.depend new file mode 100644 index 000000000..e69de29bb diff --git a/daemons/proofChecker/Makefile b/daemons/proofChecker/Makefile new file mode 100644 index 000000000..af48d0a5d --- /dev/null +++ b/daemons/proofChecker/Makefile @@ -0,0 +1,47 @@ +BIN_DIR = /usr/local/bin +REQUIRES = helm-cic_proof_checking http +PREDICATES = +OCAMLOPTIONS = -package "$(REQUIRES)" -predicates "$(PREDICATES)" -thread +OCAMLC = ocamlfind ocamlc $(OCAMLOPTIONS) -g +OCAMLOPT = ocamlfind ocamlopt $(OCAMLOPTIONS) +OCAMLDEP = ocamldep + +LIBRARIES = $(shell ocamlfind query -recursive -predicates "byte $(PREDICATES)" -format "%d/%a" $(REQUIRES)) +LIBRARIES_OPT = $(shell ocamlfind query -recursive -predicates "native $(PREDICATES)" -format "%d/%a" $(REQUIRES)) + +all: $(PROOFCHECKEROBJS) proofChecker +opt: $(PROOFCHECKEROBJS:.cmo=.cmx) proofChecker.opt + +DEPOBJS = proofChecker.ml + +PROOFCHECKEROBJS = proofChecker.cmo + +depend: + $(OCAMLDEP) $(DEPOBJS) > .depend + +proofChecker: $(PROOFCHECKEROBJS) $(LIBRARIES) + $(OCAMLC) -linkpkg -o proofChecker $(PROOFCHECKEROBJS) + +proofChecker.opt: $(PROOFCHECKEROBJS:.cmo=.cmx) $(LIBRARIES_OPT) + $(OCAMLOPT) -linkpkg -o proofChecker.opt $(PROOFCHECKEROBJS:.cmo=.cmx) + +.SUFFIXES: .ml .mli .cmo .cmi .cmx +.ml.cmo: $(LIBRARIES) + $(OCAMLC) -c $< +.mli.cmi: $(LIBRARIES) + $(OCAMLC) -c $< +.ml.cmx: $(LIBRARIES_OPT) + $(OCAMLOPT) -c $< + +clean: + rm -f *.cm[iox] *.o proofChecker proofChecker.opt + +install: + cp proofChecker proofChecker.opt $(BIN_DIR) + +uninstall: + rm -f $(BIN_DIR)/proofChecker $(BIN_DIR)/proofChecker.opt + +.PHONY: install uninstall clean + +include .depend diff --git a/daemons/proofChecker/proofChecker.conf.xml.sample b/daemons/proofChecker/proofChecker.conf.xml.sample new file mode 100644 index 000000000..1f58c6c83 --- /dev/null +++ b/daemons/proofChecker/proofChecker.conf.xml.sample @@ -0,0 +1,11 @@ + + +
+ 58084 +
+
+ remote + http://localhost:58081/ + +
+
diff --git a/daemons/proofChecker/proofChecker.ml b/daemons/proofChecker/proofChecker.ml new file mode 100644 index 000000000..e4f00fe3a --- /dev/null +++ b/daemons/proofChecker/proofChecker.ml @@ -0,0 +1,133 @@ +(* Copyright (C) 2002, HELM Team. + * + * This file is part of HELM, an Hypertextual, Electronic + * Library of Mathematics, developed at the Computer Science + * Department, University of Bologna, Italy. + * + * HELM is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * HELM is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with HELM; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + * For details, see the HELM World-Wide-Web page, + * http://cs.unibo.it/helm/. + *) + +open Printf;; + +let _ = Helm_registry.load_from "/projects/helm/etc/proofChecker.conf.xml";; + +let port = Helm_registry.get_int "proofchecker.port";; + +let (html_preamble, html_postamble) = + ((fun uri -> + (sprintf +" + + Proof-Checking %s + + +

Proof-Checking %s:

+" + uri uri)), +("

Done.

+ + +END +")) +;; + +let bad_request outchan = + printf "INVALID REQUEST !!!!!\n\n"; + flush stdout; + Http_daemon.respond_error ~code:(`Status (`Client_error `Bad_request)) + outchan; + flush outchan +;; + +let usage_string = +" + + + ProofChecker's help message + + +

ProofChecker

+

Usage

+

+ Usage: http://hostname:proofcheckerport/command +

+

+ Available commands: +

+

+ help
+ display this help message +

+

+ proofCheck?uri=uri
+ proof-checks the object whose URI is specified by uri +

+ + +" +;; + +let outchan = ref stderr;; + +let _ = + HelmLogger.register_log_callback + (fun ?append_NL msg -> + output_string !outchan (HelmLogger.html_of_html_msg msg) ; + flush !outchan) +;; + +let callback (req : Http_types.request) outchan' = + match req#path with + | "/proofCheck" -> + begin + outchan := outchan' ; + try + let uri = req#param "uri" in + Http_daemon.send_basic_headers ~code:(`Code 200) outchan' ; + Http_daemon.send_header "Content-type" "text/html" outchan' ; + Http_daemon.send_CRLF outchan' ; + printf "Request to proof-check \"%s\"..." uri; + flush stdout; + fprintf outchan' "%s" (html_preamble uri); + flush outchan'; + (try + ignore (CicTypeChecker.typecheck (UriManager.uri_of_string uri)); + with e -> + fprintf outchan' "%s\n" (Printexc.to_string e); + flush outchan'); + fprintf outchan' "%s" html_postamble; + flush outchan'; + printf " done\n\n"; + flush stdout + with Http_types.Param_not_found _ -> (* 'uri' argument not found *) + bad_request outchan' + end + | "/help" -> + Http_daemon.respond ~body:usage_string + ~headers:["Content-Type", "text/html"] outchan' + | req -> bad_request outchan' + +in + +printf "Proof Checker started and listening on port %d\n" port; +flush stdout; +CicEnvironment.set_trust (fun _ -> false); +Http_daemon.start' ~port ~mode:`Fork callback ; +printf "Proof Checker is terminating, bye!\n" + diff --git a/daemons/rdfly/.cvsignore b/daemons/rdfly/.cvsignore new file mode 100644 index 000000000..5424f8c69 --- /dev/null +++ b/daemons/rdfly/.cvsignore @@ -0,0 +1 @@ +*.o *.cm[iox] rdfly rdfly.opt diff --git a/daemons/rdfly/Makefile b/daemons/rdfly/Makefile new file mode 100644 index 000000000..779bb7b44 --- /dev/null +++ b/daemons/rdfly/Makefile @@ -0,0 +1,39 @@ +BIN_DIR = /usr/local/bin +REQUIRES = mysql http helm-registry +PREDICATES = +OCAMLOPTIONS = -package "$(REQUIRES)" -predicates "$(PREDICATES)" -pp camlp4o +OCAMLFIND = ocamlfind +OCAMLC = $(OCAMLFIND) ocamlc -thread $(OCAMLOPTIONS) +OCAMLOPT = $(OCAMLFIND) ocamlopt -thread $(OCAMLOPTIONS) +OCAMLDEP = ocamldep -pp camlp4o + +LIBRARIES = $(shell $(OCAMLFIND) query -recursive -predicates "byte $(PREDICATES)" -format "%d/%a" $(REQUIRES)) +LIBRARIES_OPT = $(shell $(OCAMLFIND) query -recursive -predicates "native $(PREDICATES)" -format "%d/%a" $(REQUIRES)) + +OBJS = rdfly.cmo + +all: rdfly +opt: rdfly.opt + +rdfly: $(OBJS) $(LIBRARIES) + $(OCAMLC) -linkpkg -o $@ $(OBJS) + +rdfly.opt: $(OBJS:.cmo=.cmx) $(LIBRARIES_OPT) + $(OCAMLOPT) -linkpkg -o rdfly.opt $(OBJS:.cmo=.cmx) + +.SUFFIXES: .ml .mli .cmo .cmi .cmx +.ml.cmo: + $(OCAMLC) -c $< +.mli.cmi: + $(OCAMLC) -c $< +.ml.cmx: + $(OCAMLOPT) -c $< + +$(OBJS): $(LIBRARIES) +$(OBJS:.cmo=.cmx)): $(LIBRARIES_OPT) + +clean: + rm -f *.cm[iox] *.o rdfly rdfly.opt + +.PHONY: install uninstall clean + diff --git a/daemons/rdfly/rdfly.conf.xml.sample b/daemons/rdfly/rdfly.conf.xml.sample new file mode 100644 index 000000000..5d479dacf --- /dev/null +++ b/daemons/rdfly/rdfly.conf.xml.sample @@ -0,0 +1,12 @@ + + +
+
+ localhost + helm + mowgli + 3306 +
+ 58086 +
+
diff --git a/daemons/rdfly/rdfly.ml b/daemons/rdfly/rdfly.ml new file mode 100644 index 000000000..b9a79d139 --- /dev/null +++ b/daemons/rdfly/rdfly.ml @@ -0,0 +1,192 @@ + +module M = Mysql + + (* First of all we load the configuration *) +let _ = + let configuration_file = "/projects/helm/etc/rdfly.conf.xml" in + Helm_registry.load_from configuration_file +;; + +let open_db ?host ?database ?port ?password ?user = + try + M.quick_connect ?host ?database ?port ?password ?user + with + M.Error e as exc -> + prerr_endline e ; + raise exc + +let extract_position s = + let sharp_pos = String.rindex s '#' + 1 in + String.sub s sharp_pos ((String.length s) - sharp_pos) + +let mk_new_msg () = ref [] + +let msg_output_string msg s = msg := s::!msg + +let msg_serialize msg = + String.concat "" (List.rev !msg) + +let msg_output_header msg obj = + msg_output_string msg "\n\n" ; + msg_output_string msg ("\n \n") + +let msg_output_trailer msg = + msg_output_string msg " \n\n" + +let msg_output_dc_header msg obj = + msg_output_string msg "\n\n" ; + msg_output_string msg ("\n") ; + msg_output_string msg " " +;; + +let msg_output_dc_trailer msg = + msg_output_string msg " \n" +;; + +let value_of_optional_value = + function + None -> assert false + | Some v -> v +;; + +let forward_metadata db obj = + let res = M.exec db ("SELECT * FROM refObj WHERE source = '" ^ obj ^ "';") in + let msg = mk_new_msg () in + msg_output_header msg obj ; + M.iter res + ~f:(function cols -> + let position = extract_position (value_of_optional_value (cols.(2))) in + let occurrence = value_of_optional_value (cols.(1)) in + msg_output_string msg " \n \n" ; + msg_output_string msg (" " ^ position ^ "\n") ; + msg_output_string msg (" " ^ occurrence ^ "\n") ; + msg_output_string msg " \n \n" + ) ; + msg_output_trailer msg ; + msg_serialize msg +;; + +let backward_metadata db obj = + let res = M.exec db ("SELECT * FROM refObj WHERE h_occurrence = '" ^ obj ^ "';") in + let msg = mk_new_msg () in + msg_output_header msg obj ; + M.iter res + ~f:(function cols -> + let position = extract_position (value_of_optional_value (cols.(2))) in + let occurrence = value_of_optional_value (cols.(0)) in + msg_output_string msg " \n \n" ; + msg_output_string msg (" " ^ position ^ "\n") ; + msg_output_string msg (" " ^ occurrence ^ "\n") ; + msg_output_string msg " \n \n" + ) ; + msg_output_trailer msg ; + msg_serialize msg +;; + +let dc_metadata db obj = + let tables = + [ "dc:creator","dccreator" ; + "dc:date","dcdate" ; + "dc:description","dcdescription" ; + "dc:format","dcformat" ; + "dc:identifier","dcidentifier" ; + "dc:language","dclanguage" ; + "dc:publisher","dcpublisher" ; + "dcq:RelationType","dcqRelationType" ; + "dc:relation","dcrelation" ; + "dc:rights","dcrights" ; + "dc:source","dcsource" ; + "dc:subject","dcsubject" ; + "dc:title","dctitle" ; + "hth:ResourceFormat","hthResourceFormat" ; + "hth:contact","hthcontact" ; + "hth:firstVersion","hthfirstVersion" ; + "hth:institution","hthinstitution" ; + "hth:modified","hthmodified" + ] + in + let msg = mk_new_msg () in + msg_output_dc_header msg obj ; + List.iter + (fun (propertyname,tablename) -> + let res = + M.exec db + ("SELECT * FROM " ^ tablename ^ " WHERE uri = '" ^ obj ^ "';") in + M.iter res + ~f:(function cols -> + let value = value_of_optional_value (cols.(0)) in + msg_output_string msg + (" <" ^ propertyname ^ ">" ^ value ^ "\n") ; + ) ; + ) tables ; + msg_output_dc_trailer msg ; + msg_serialize msg +;; + +let debug_print s = prerr_endline ("[RDFly] " ^ s) + +let mk_return_fun contype msg outchan = + Http_daemon.respond + ~body:msg ~headers:["Content-Type", contype] outchan + +let return_html = mk_return_fun "text/html" +let return_xml = mk_return_fun "text/xml" +let return_400 body ch = + Http_daemon.respond_error ~code:(`Code 400) ~body ch +let return_html_error s = return_html ("" ^ s ^ "") + +let get_option key = + try + Some (Helm_registry.get key) + with Helm_registry.Key_not_found _ -> None + +let get_int_option key = + try + Some (Helm_registry.get_int key) + with Helm_registry.Key_not_found _ -> None + +let host = get_option "rdfly.mysql_connection.host";; +let database = get_option "rdfly.mysql_connection.database";; +let port = get_int_option "rdfly.mysql_connection.port";; +let password = get_option "rdfly.mysql_connection.password";; +let user = get_option "rdfly.mysql_connection.user";; +let daemonport = Helm_registry.get_int "rdfly.port";; + +let callback (req: Http_types.request) ch = + try + debug_print ("Connection from " ^ req#clientAddr) ; + debug_print ("Received request: " ^ req#uri) ; + (match req#path with + | "/help" -> + return_html_error "yeah right..." ch + | "/get" -> + let obj = req#param "object" + and kind = req#param "kind" in + let db = open_db ?host ?database ?port ?password ?user () in + begin + match kind with + "forward" -> return_xml (forward_metadata db obj) ch + | "backward" -> return_xml (backward_metadata db obj) ch + | "dc" -> return_xml (dc_metadata db obj) ch + | s -> return_html_error ("unsupported kind: " ^ s) ch + end ; + M.disconnect db + | invalid_request -> + Http_daemon.respond_error ~code:(`Status (`Client_error `Bad_request)) + ch) + with + | Http_types.Param_not_found attr_name -> + return_400 (Printf.sprintf "Parameter '%s' is missing" attr_name) ch + | exc -> + return_html_error ("Uncaught exception: " ^ (Printexc.to_string exc)) ch + +let main () = + Sys.catch_break true; + try + Http_daemon.start' + ~timeout:(Some 600) ~port:daemonport callback + with Sys.Break -> () +in + +main () + diff --git a/daemons/uwobo/.cvsignore b/daemons/uwobo/.cvsignore new file mode 100644 index 000000000..7a77a0ecd --- /dev/null +++ b/daemons/uwobo/.cvsignore @@ -0,0 +1,7 @@ +*.cmi +*.cmo +*.cmx +*.cma +*.cmxa +uwobo +uwobo.opt diff --git a/daemons/uwobo/.depend b/daemons/uwobo/.depend new file mode 100644 index 000000000..a37a2cd19 --- /dev/null +++ b/daemons/uwobo/.depend @@ -0,0 +1,18 @@ +uwobo.cmo: uwobo_common.cmi uwobo_engine.cmi uwobo_logger.cmi \ + uwobo_profiles.cmi uwobo_styles.cmi +uwobo.cmx: uwobo_common.cmx uwobo_engine.cmx uwobo_logger.cmx \ + uwobo_profiles.cmx uwobo_styles.cmx +uwobo_common.cmo: uwobo_common.cmi +uwobo_common.cmx: uwobo_common.cmi +uwobo_engine.cmo: uwobo_common.cmi uwobo_logger.cmi uwobo_styles.cmi \ + uwobo_engine.cmi +uwobo_engine.cmx: uwobo_common.cmx uwobo_logger.cmx uwobo_styles.cmx \ + uwobo_engine.cmi +uwobo_logger.cmo: uwobo_logger.cmi +uwobo_logger.cmx: uwobo_logger.cmi +uwobo_profiles.cmo: uwobo_profiles.cmi +uwobo_profiles.cmx: uwobo_profiles.cmi +uwobo_styles.cmo: uwobo_common.cmi uwobo_logger.cmi uwobo_styles.cmi +uwobo_styles.cmx: uwobo_common.cmx uwobo_logger.cmx uwobo_styles.cmi +uwobo_engine.cmi: uwobo_common.cmi uwobo_logger.cmi uwobo_styles.cmi +uwobo_styles.cmi: uwobo_common.cmi uwobo_logger.cmi diff --git a/daemons/uwobo/Makefile b/daemons/uwobo/Makefile new file mode 100644 index 000000000..00b578aca --- /dev/null +++ b/daemons/uwobo/Makefile @@ -0,0 +1,68 @@ +VERSION = 0.3.0 +DISTDIR = uwobo-$(VERSION) +DISTTARBALL = $(DISTDIR).tar.gz +REQUIRES = http gdome2 gdome2-xslt pcre unix helm-registry +COMMONOPTS = -package "$(REQUIRES)" -pp camlp4o +OCAMLFIND = ocamlfind +OCAMLC = $(OCAMLFIND) ocamlc $(COMMONOPTS) +OCAMLOPT = $(OCAMLFIND) ocamlopt $(COMMONOPTS) +OCAMLDEP = $(OCAMLFIND) ocamldep $(COMMONOPTS) +OCAMLDOC = \ + ocamldoc \ + $(shell $(OCAMLFIND) query -i-format http) \ + $(shell $(OCAMLFIND) query -i-format gdome2) \ + $(shell $(OCAMLFIND) query -i-format gdome2-xslt) \ + $(shell $(OCAMLFIND) query -i-format pcre) \ + $(shell $(OCAMLFIND) query -i-format unix) +MODULES = uwobo_common uwobo_styles uwobo_profiles uwobo_logger uwobo_engine +OBJS = $(patsubst %,%.cmo,$(MODULES)) +OBJSOPT = $(patsubst %,%.cmx,$(MODULES)) + +all: byte +byte: uwobo +opt: uwobo.opt +world: byte opt + +include .depend +depend: + $(OCAMLDEP) *.ml *.mli > .depend + +%.cmi: %.mli + $(OCAMLC) -c $< +%.cmo: %.ml %.cmi + $(OCAMLC) -c $< +%.cmx: %.ml %.cmi + $(OCAMLOPT) -c $< +uwobo.cmo: uwobo.ml + $(OCAMLC) -c $< +uwobo.cmx: uwobo.ml + $(OCAMLOPT) -c $< +uwobo: $(OBJS) uwobo.ml + $(OCAMLC) -linkpkg -o $@ $^ +uwobo.opt: $(OBJSOPT) uwobo.ml + $(OCAMLOPT) -linkpkg -o $@ $^ + +uwobo.dot: *.ml *.mli + $(OCAMLDOC) -dot -o $@ $^ + +distclean: clean +clean: + rm -f *.cm[aiox] *.o uwobo{,.opt,.dot} +dist: distclean depend + mkdir $(DISTDIR)/ + cp \ + $(patsubst %, %.ml, $(MODULES)) \ + $(patsubst %, %.mli, $(MODULES)) \ + uwobo.ml \ + Makefile .depend \ + $(DISTDIR)/ + tar cvzf $(DISTTARBALL) $(DISTDIR)/ + rm -rf $(DISTDIR)/ +distcheck: $(DISTTARBALL) + if [ -d $(DISTDIR) ]; then rm -rf $(DISTDIR); else true; fi + tar xvzf $< + cd $(DISTDIR); make + rm -rf $(DISTDIR) + +.PHONY: all dist distclean distcheck byte opt world depend clean + diff --git a/daemons/uwobo/doc/uwobo.tex b/daemons/uwobo/doc/uwobo.tex new file mode 100644 index 000000000..177d21dc4 --- /dev/null +++ b/daemons/uwobo/doc/uwobo.tex @@ -0,0 +1,216 @@ +\documentclass{article} + +\usepackage{hyperref} + +\title{UWOBO Reference Manual\thanks{People who contributed to former +versions are Ferruccio Guidi, Riccardo Solmi, Stephen Watt.}} +\author{Luca Padovani \and Claudio Sacerdoti Coen \and Stefano +Zacchiroli} + +\begin{document} + +\maketitle + +\noindent UWOBO is a Web Service implementing a XSLT engine. It allows +XSLT stylesheets to be applied to XML documents. Once the UWOBO deamon +is up and running, commands must be sent at the URL + +\begin{verbatim} +http://hostname:uwoboport/command +\end{verbatim} + +\section*{Stylesheet Management} + +Before stylesheets can be applied to XML documents, they must be +loaded into UWOBO. This way stylesheets are compiled once and used as +many times as needed. Once loaded, each stylesheet is identified by a +unique identifier. + +\begin{verbatim} +add?bind=key,uri[&bind=key,uri[&...]] +\end{verbatim} + +The \texttt{add} command is used to load a new stylesheet, specified +by a URI, and bind it to a corresponding key. Multiple stylesheets can +be loaded at once. + +\begin{verbatim} +remove?keys=[key1,key2,...] +\end{verbatim} + +The \texttt{remove} command unloads one or more stylesheets specified +by provided keys. It removes \emph{all} the loaded stylesheets if no +key is given. + +\begin{verbatim} +reload?keys=[key1,key2,...] +\end{verbatim} + +The \texttt{reload} command reloads previously loaded stylesheets +specified by the provided keys. It reloads all the loaded stylesheets +if no key is given. This command is particularly useful during +stylesheet development (assuming the URI of the loaded stylesheets +does not change), since it does not require the client to specify the +URL of the stylesheets again. + +\begin{verbatim} +list +\end{verbatim} + +The \texttt{list} command returns the list of the loaded stylesheets +along with their associated key. + +\section*{Profile Management} + +XSLT stylesheets may have \emph{parameters} that are typically +supplied at application time. Although UWOBO supports this kind of +interaction, it may be impractical from several different points of +view. Since parameters are communicated to UWOBO in the URL, the URL +itself may become very large: the URL readibility decreases because of +its lengths and also because of the quoting of the parameter values; +moreover, there is an upper limit to the length of a URL which can be +easily reached. + +Furthermore, it is often the case that among the supplied parameters, +a large number of these stays the same between applications. + +UWOBO provides a facility to store imperatively the value of +parameters as its internal state. However, since parameters are +typically used for storing user-dependent settings and preferences, +UWOBO provides a notion of \emph{profile}. Profiles can be created as +part of UWOBO's internal state. Profiles are identified by a key (a +sequence of alphanumeric characters) and map parameter names to +parameter values. At application time, UWOBO may be instructed to take +the values of the parameters to be passed to the stylesheets from a +particular profile. + +\begin{verbatim} +listprofiles +\end{verbatim} +The \texttt{listprofiles} command returns the list of profiles +currently loaded in UWOBO. + +\begin{verbatim} +createprofile?[id=id][&orig=orig][&origpassword=origpassword] + [&readperm={public|private}][&writeperm={public|private}] + [&adminperm={public|private}][&password=password] +\end{verbatim} +The \texttt{createprofile} command creates a new profile. The +identifier of the new profile can be provided, otherwise UWOBO will +pick a randomly chosen fresh identifier. An \emph{original profile} +can optionally be cloned (a password for the original profile must be +provided if the original profile has private read +permission). Permissions for read, write, and administrative access +can be set to public or to private, the default being public. The +newly created profile may optionally have a password set (the default +is no password set). + +\begin{verbatim} +removeprofile?id=id[&password=password] +\end{verbatim} +The \texttt{removeprofile} commands erases and removes the profile +from UWOBO. The password is required if the profile has private +administrative permission. + +\begin{verbatim} +setparam?id=id[&password=password]&key=key[&value=value] +\end{verbatim} +The \texttt{setparam} command sets the parameter \texttt{key} to +\texttt{value}, if the value is provided; otherwise the parameter is +unset. The password is required if the profile has private write +permission. + +\begin{verbatim} +setpassword?id=id[&oldpassword=oldpassword][&password=password] +\end{verbatim} +The \texttt{setpassword} command changes or unset the password +associated with the profile \texttt{id}. The old password must be +provided if it was set. + +\begin{verbatim} +setpermission?id=id[&password=password] + &permission={read|write|admin}&value={public|private} +\end{verbatim} +The \texttt{setpermission} commands changes the specified +permission. Permissions can be set to private (password protected) or +public. The password is required if the profile has private +administrative permission. + +\begin{verbatim} +getparams?id=id[&password=password] +\end{verbatim} +The \texttt{getparams} command returns a list of all the parameters +set in the specified profile. The password is required if the profile +has private read permission. + +\begin{verbatim} +getparam?id=id[&password=password]&key=key +\end{verbatim} +The \texttt{getparam} commands returns the value of the specified +parameter in the profile \texttt{id}. The password is required if the +profile has private read permission. + +\begin{verbatim} +getpermission?id=id[&password=password]&for={read|write|admin} +\end{verbatim} +The \texttt{getpermission} command returns the value of the permission +\texttt{key} in the profile \texttt{id}. The password is required if +the profile has private administrative permission. + +\section*{Stylesheet Application} + +\begin{verbatim} +apply?xmluri=uri&keys=key1,key2,... + [&errormode={ignore|comment|embed}] + [&debugmode={ignore|comment|embed}] + [&profile=id][&password=password] + [¶m.name=value[¶m.name=value[&...]]] + [¶m.key.name=value[¶m.key.name=value[&...]]] + [&prop.name[=value][&prop.name[=value][&...]]] +\end{verbatim} +The \texttt{apply} command applies a chain of stylesheets, specified +by the keys \texttt{key1}, \texttt{key2}, \dots, to an input document, +specified by \texttt{uri}. Error and debugging modes can be set to +three different values: \texttt{ignore} means that LibXSLT messages +are ignored; \texttt{comment} means that LibXSLT messages are embedded +in the result document inside an XML like comment; \texttt{embed} +means that LibXSLT messages are embedded at the beginning of the +result document (as childs of the root node) in XML elements in the +UWOBO namespace. + +Parameters can be set for each stylesheet application: global +parameters (i.e. parameters passed to all stylesheets) are set using +\texttt{param.name=value} syntax, per-stylesheet parameters are set +using \texttt{param.key.name=value} where \texttt{key} is the key of a +loaded stylesheet. It is possible to specify a profile that is +searched for additional global and local parameters. The parameters +stored in the profile have lower precedence with respect to those +provided in the URL. A password must be provided if the profile has +private read permission. + +Properties of the final chain output can be set as well: valueless +properties can be set using \texttt{prop.name} syntax, others can be +set using \texttt{prop.name=value} syntax. Supported properties are +listed in the UWOBO help page. + +\section*{Miscellaneous Commands} + +\begin{verbatim} +help +\end{verbatim} +The \texttt{help} command displays an help message. + +\begin{verbatim} +newsession?port=p +\end{verbatim} +The \texttt{newsession} command forks a new daemon on a specified +port. The newly created deamon inherits the state of the original +UWOBO it was forked off. + +\begin{verbatim} +kill +\end{verbatim} +The \texttt{kill} command kills the daemon. The log file is \emph{not} +deleted. + +\end{document} \ No newline at end of file diff --git a/daemons/uwobo/log/.cvsignore b/daemons/uwobo/log/.cvsignore new file mode 100644 index 000000000..397b4a762 --- /dev/null +++ b/daemons/uwobo/log/.cvsignore @@ -0,0 +1 @@ +*.log diff --git a/daemons/uwobo/panel/.cvsignore b/daemons/uwobo/panel/.cvsignore new file mode 100644 index 000000000..335ec9573 --- /dev/null +++ b/daemons/uwobo/panel/.cvsignore @@ -0,0 +1 @@ +*.tar.gz diff --git a/daemons/uwobo/panel/Makefile b/daemons/uwobo/panel/Makefile new file mode 100644 index 000000000..cb4fdd95a --- /dev/null +++ b/daemons/uwobo/panel/Makefile @@ -0,0 +1,11 @@ + +all: + +clean: + rm -f uwobo-panel.tar.gz + +cleanbak: + rm -rf *~ + +dist: clean cleanbak + cd ..; tar cvfz uwobo-panel.tar.gz uwobo-panel ; mv uwobo-panel.tar.gz uwobo-panel diff --git a/daemons/uwobo/panel/control.html b/daemons/uwobo/panel/control.html new file mode 100644 index 000000000..d47e6f749 --- /dev/null +++ b/daemons/uwobo/panel/control.html @@ -0,0 +1,638 @@ + + + +UWOBO Control Panel + + + + + + + + + + + +
UWOBO Control Panel
+ +
+ +
+This is a control panel for the UWOBO Web-Service. You can control a local or remote UWOBO service by filling +the appropriate fields below and sending the desired commands. In most cases, results of commands, such as error +messages or documents, will be opened in the frame at the bottom of this page. For those commands sending multiple +requests to the UWOBO server, a new window will be opened for each request issued. Note that in order to use +this page you must have JavaScript enabled. + +

+ +The sections: + + +In case you want to customize the panel for your own needs, you can download the source archive +(HTML + JavaScript): + + +
+ + + + + + + +
Global Parameterstop
+ +
+ +
+The following are global parameters used by all the other section to contact the UWOBO service and possibly a +Getter. The Getter is not required for some operations and can be excluded by unchecking the proper buttons +below. + +

+ +The following is the URL used to contact the UWOBO Web-Service. +localhost is relative to your machine. + +

+ + + + + + + + + + +
UWOBO URL
+
+ +
+
+
+ +
+
+
+ +
+
+ +The following is the URL used to contact the getter. The getter is usually launched manually. +In all cases except for the check button below, +localhost is relative to the host running UWOBO, because the getter URL is sent as +a parameter along with UWOBO commands. In other words, localhost is the host +running UWOBO and not your machine. + +

+ + + + + + + + + + +
Getter URL
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+ +
+ + + + + +
Daemon Managementtop
+ +
+ +
+

You can start a new daemon on a given port. The new daemon will have + an empty list of processed stylesheets. +

+ + + + + + + + +
Port
+
+ +
+
+
+ +
+
+
+ +
+ +
+

You can also kill the daemon. The log file will be mantained.

+ + + + +
+
+ +
+
+
+ +
+
+ + + + + +
Queriestop
+ +
+ +
+ +The following are commands to do some simple queries about the UWOBO service. + +

+ + + + + + + + + + + + + + +
+ Retrieve the version of the UWOBO service running at the UWOBO URL and list the syntax + of the accepted commands. + You can use this button to verify that a UWOBO service + is actually running there: +
+ Ask UWOBO for a list of the stylesheets currently compiled inside the Web-Service, along with their keys: +
+ +
+ +
+ +
+
+ + + + + +
Profilestop
+ +
+ +
+ +The following are commands to list and edit the UWOBO profiles. + +

+ +

List existent profiles.

+ + + + +
+ +

Create a new profile.

+ + + + + + + + + + + + +
NameParent profileParent profile password
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+ +

Remove a profile.

+ + + + + + + + + + +
NamePassword
+
+ +
+
+
+ +
+
+
+ +
+
+ +

Show profile parameters.

+ + + + + + + + + + +
NamePassword
+
+ +
+
+
+ +
+
+
+ +
+
+ +

Set profile parameters.

+ + + + + + + + + + + + + + +
NamePasswordParameter nameParameter value
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+ +
+ +
+ + + + + +
Stylesheet Managementtop
+ +
+ +
+ +In this section you can add, remove and reload stylesheet into the server. There are +some frequently used stylesheets whose URIs and keys can be automatically filled in +by selecting one of the options of the box below. Note that for such stylesheets +the getter is used by default (you can deselect it, however): + +

+ + + + + + + + + + +
Predefined Stylesheets
+
+ +
+
+
+ +
+
+
+ +
+
+ +Here you have to identify a stylesheet by means of a relative or absolute URI. Usually +you will specify a relative URI when using the getter to retrieve the stylesheet. +Moreover, you can specify a key associated to this stylesheet, so that it will be easier to +refer to it in subsequent operations. If escaping is enabled, then the stylesheet URI will +be escaped. This might be particularly useful if the stylesheet is loaded by the getter. + +

+ + + + + + + + + + + + + + + + + +
StylesheetKeyUse GetterEscape
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+ +Use the buttons below to remove or reload all the stylesheets. +Use these commands with +care, and remember that UWOBO can be shared among different users: + +

+ + + + + + +
+
+ +
+
+
+ +
+
+
+ +
+ + + + + +
Processingtop
+ +
+ +
+ +You can use the "Apply" command to perform a transformation. Specify the URI of the source +document in the form below. The URI can be relative or absolute (in the former case you +will probably want to enable the use of the getter). +If escaping is enabled, then special characters are escaped. This might be particularly useful +if the source is loaded by the getter. + +

+ + + + + + + + + + +
Source DocumentEscape
+
+ +
+
+
+ +
+
+ +You can specify a sequence of zero or more parameters separated by blanks. Each +parameter is made of a name immediately followed by = and then a value. +If "Escape" is checked, then parameters are escaped in the final +URI. + +

+ + + + + + + + + + +
Parameters (optional)Escape
+
+ +
+
+
+ +
+
+ +In the key list specify a list of keys +separated by blanks. This is the list of stylesheets to be applied in sequence to the +source document. +When ready, click on the button and have fun! + +

+ + + + + + + + + + + +
Key listUse Getter
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+ + + + + + +
Page maintained by: Luca Padovanitop
+ + + + + diff --git a/daemons/uwobo/panel/control.js b/daemons/uwobo/panel/control.js new file mode 100644 index 000000000..9858fe140 --- /dev/null +++ b/daemons/uwobo/panel/control.js @@ -0,0 +1,234 @@ + +function getParam(name, def) +{ + var search = top.location.search; + search = search.slice(1); + var args = search.split("&"); + var value = "-1"; + for (var i = 0 ; i < args.length ; i++) { + var couple = args[i].split("="); + if (couple[0] == name) value = couple[1]; + } + if (value == "-1") value = def; + return value; +} + +function getInitialPort() +{ + return "38080"; +} + +function getInitialProcessorURL() +{ + return getParam("processorURL", "http://mowgli.cs.unibo.it:58080/"); +} + +function getInitialGetterURL() +{ + return getParam("getterURL", "http://mowgli.cs.unibo.it:58081/"); +} + +function getUwoboURL() +{ + return document.uwoboURL.elements[0].value; +} + +function getGetterURL() +{ + return document.getterURL.elements[0].value; +} + +function selectUwoboURL(ss) +{ + if (ss.selectedIndex == 0) { + document.uwoboURL.elements[0].value = ""; + } else { + document.uwoboURL.elements[0].value = "http://" + ss.options[ss.selectedIndex].value + ":58080/"; + } +} + +function selectGetterURL(ss) +{ + if (ss.selectedIndex == 0) { + document.getterURL.elements[0].value = ""; + } else { + document.getterURL.elements[0].value = "http://" + ss.options[ss.selectedIndex].value + ":8081/"; + } +} + +function getPredefinedStylesheetKey(i) +{ + var v = document.predefinedStylesheets.elements[0].options[i].value; + var va = v.split(","); + return va[0]; +} + +function getPredefinedStylesheetURI(i) +{ + var v = document.predefinedStylesheets.elements[0].options[i].value; + var va = v.split(","); + return va[1]; +} + +function getPredefinedStylesheetUseGetter(i) +{ + var v = document.predefinedStylesheets.elements[0].options[i].value; + var va = v.split(","); + return va[2]; +} + +function selectPredefinedStylesheet(ss) +{ + if (ss.selectedIndex == 0) { + document.stylesheetURI.elements[0].value = ""; + document.stylesheetKey.elements[0].value = ""; + } else { + document.stylesheetURI.elements[0].value = getPredefinedStylesheetURI(ss.selectedIndex); + document.stylesheetKey.elements[0].value = getPredefinedStylesheetKey(ss.selectedIndex); + } + + document.loadUseGetter.elements[0].checked = getPredefinedStylesheetUseGetter(ss.selectedIndex) == "true" ? true : false; + document.loadEscape.elements[0].checked = true; +} + +function getProfileParams() +{ + var password = document.getParamsProfilePassword.elements[0].value; + if (password != "") { password = "&password=" + password; }; + + top.result.location.replace(getUwoboURL() + "getparams?id=" + document.getParamsProfileID.elements[0].value + password); +} + +function setProfileParam() +{ + var password = document.setParamProfilePassword.elements[0].value; + if (password != "") { password = "&password=" + password; }; + + top.result.location.replace(getUwoboURL() + "setparam?id=" + document.setParamProfileID.elements[0].value + "&key=" + document.setParamProfileKey.elements[0].value + "&value=" + document.setParamProfileValue.elements[0].value + password); +} + +function createProfile() +{ + var id = document.createProfileID.elements[0].value; + if (id != "") { id = "&id=" + id; }; + + var password = document.createProfilePassword.elements[0].value; + if (password != "") { password = "&password=" + password; }; + + var clone = document.createProfileClone.elements[0].value; + if (clone != "") { clone = "&orig=" + clone; }; + + top.result.location.replace(getUwoboURL() + "createprofile?foo=x" + id + password + clone); +} + +function removeProfile() +{ + var password = document.removeProfilePassword.elements[0].value; + if (password != "") { password = "&password=" + password; }; + + top.result.location.replace(getUwoboURL() + "removeprofile?id=" + document.removeProfileID.elements[0].value + password); +} + +function getStylesheetURL() +{ + var s; + + if (document.loadUseGetter.elements[0].checked) { + s = getGetterURL() + "getxslt?uri=" + document.stylesheetURI.elements[0].value; + } else { + s = document.stylesheetURI.elements[0].value; + } + + if (document.loadEscape.elements[0].checked) s = escape(s); + + return s; +} + +function loadStylesheet() +{ + top.result.location.replace(getUwoboURL() + "add?bind=" + document.stylesheetKey.elements[0].value + "," + getStylesheetURL()); +} + +function removeStylesheet() +{ + top.result.location.replace(getUwoboURL() + "remove?keys=" + document.stylesheetKey.elements[0].value); +} + +function removeAllStylesheets() +{ + top.result.location.replace(getUwoboURL() + "remove?keys="); +} + +function reloadStylesheet() +{ + top.result.location.replace(getUwoboURL() + "reload?keys=" + document.stylesheetKey.elements[0].value); +} + +function reloadAllStylesheets() +{ + top.result.location.replace(getUwoboURL() + 'reload?keys='); +} + +function loadAllPredefined() +{ + with (document.predefinedStylesheets.elements[0]) { + var i; + var request = ""; + + for (i = 1; i < length; i++) + request += + (request == "" ? "" : "&") + + "bind=" + getPredefinedStylesheetKey(i) + "," + escape((getPredefinedStylesheetUseGetter(i) == "true" ? (getGetterURL() + "getxslt?uri=") : "") + getPredefinedStylesheetURI(i)); + top.result.location.replace(getUwoboURL() + "add?" + request); + } +} + +function removeAllPredefined() +{ + with (document.predefinedStylesheets.elements[0]) { + var i; + var request = ""; + + for (i = 1; i < length; i++) + request += getPredefinedStylesheetKey(i) + (i == length - 1 ? "" : ","); + top.result.location.replace(getUwoboURL() + "remove?keys=" + request); + } +} + +function applyStylesheets() +{ + var i = 0; + var keyList = document.keyList.elements[0].value.split(" "); + + var url = getUwoboURL() + "apply?xmluri="; + + var sourceURL = ""; + + if (document.applyUseGetter.elements[0].checked) + sourceURL += getGetterURL() + "getxml?uri="; + + sourceURL += document.sourceDocument.elements[0].value; + + if (document.escapeSource.elements[0].checked) + url += escape(sourceURL); + else + url += sourceURL; + + url += "&keys="; + for (i = 0; i < keyList.length; i++) { + url += keyList[i]; + if (i < keyList.length - 1) url += ","; + } + + var paramList = document.parameters.elements[0].value.split(" "); + for (i = 0; i < paramList.length; i++) + if (paramList[i].length > 0) { + if (document.escapeParameters.elements[0].checked) { + var p = paramList[i].split("="); + url += "¶m." + p[0] + "=" + escape(p[1]); + } else + url += "¶m." + paramList[i]; + } + + top.result.location.replace(url); +} diff --git a/daemons/uwobo/panel/index.html b/daemons/uwobo/panel/index.html new file mode 100644 index 000000000..caeebcf24 --- /dev/null +++ b/daemons/uwobo/panel/index.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/daemons/uwobo/panel/welcome.html b/daemons/uwobo/panel/welcome.html new file mode 100644 index 000000000..f6fbed438 --- /dev/null +++ b/daemons/uwobo/panel/welcome.html @@ -0,0 +1,6 @@ + + + + + + diff --git a/daemons/uwobo/uwobo.conf.xml.sample b/daemons/uwobo/uwobo.conf.xml.sample new file mode 100644 index 000000000..75b6f2df7 --- /dev/null +++ b/daemons/uwobo/uwobo.conf.xml.sample @@ -0,0 +1,14 @@ + + +
+ /projects/helm/var + /tmp/helm/cache +
+ +
+ /var/log/mowgli/uwobo + .log + + 58080 +
+
diff --git a/daemons/uwobo/uwobo.ml b/daemons/uwobo/uwobo.ml new file mode 100644 index 000000000..1a5b44f62 --- /dev/null +++ b/daemons/uwobo/uwobo.ml @@ -0,0 +1,817 @@ +(* + * Copyright (C) 2003: + * Stefano Zacchiroli + * for the HELM Team http://helm.cs.unibo.it/ + * + * This file is part of HELM, an Hypertextual, Electronic + * Library of Mathematics, developed at the Computer Science + * Department, University of Bologna, Italy. + * + * HELM is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * HELM is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with HELM; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + * For details, see the HELM World-Wide-Web page, + * http://helm.cs.unibo.it/ + *) + +open Printf;; +open Uwobo_common;; + + (* debugging settings *) +let debug = false ;; +let debug_level = `Notice ;; +let debug_print s = if debug then prerr_endline s ;; +Http_common.debug := false ;; + +let configuration_file = "/projects/helm/etc/uwobo.conf.xml";; + + (* First of all we load the configuration *) +let _ = + Helm_registry.load_from configuration_file +;; + +let save_configuration () = + if not (Helm_registry.has "uwobo.cloned") then + Helm_registry.save_to configuration_file +;; + + (* other settings *) +let daemon_name = "UWOBO OCaml" ;; +let default_media_type = "text/html" ;; +let default_encoding = "utf8" ;; + +let get_media_type props = + try + List.assoc "media-type" props + with + Not_found -> default_media_type +;; + +let get_encoding props = + try + List.assoc "encoding" props + with + Not_found -> default_encoding +;; + +let string_of_param_option (req: Http_types.request) name = + try + req#param name + with + Http_types.Param_not_found _ -> "#" + +let string_option_of_string = + function + "#" -> None + | s -> Some s + +let port = Helm_registry.get_int "uwobo.port";; + +let logfilename_of_port port = + let basename = Helm_registry.get "uwobo.log_basename" in + let extension = Helm_registry.get "uwobo.log_extension" in + basename ^ "_" ^ string_of_int port ^ extension +;; + +let logfile = logfilename_of_port port;; +let logfile_perm = 0o640 ;; + +let respond_html body outchan = + Http_daemon.respond ~body ~headers:["Content-Type", "text/html"] outchan +;; + + (** perform an 'action' that can be applied to a list of keys or, if no keys + was given, to all keys *) +let act_on_keys + keys_param styles logger per_key_action all_keys_action all_keys logmsg += + let keys = + try + Pcre.split ~pat:"," keys_param + with Http_types.Param_not_found _ -> [] + in + match keys with + | [] -> (* no key provided, act on all stylesheets *) + logger#log (sprintf "%s all stylesheets (keys = %s) ..." + logmsg (String.concat ", " all_keys)); + (try all_keys_action () with e -> logger#log (Printexc.to_string e)); + logger#log (sprintf "Done! (all stylesheets)") + | keys -> + List.iter + (fun key -> (* act on a single stylesheet *) + logger#log (sprintf "%s stylesheet %s" logmsg key); + (try per_key_action key with e -> logger#log (Printexc.to_string e)); + logger#log (sprintf "Done! (stylesheet %s)" key)) + keys +;; + + (** parse parameters for '/apply' action *) +let parse_apply_params = + let is_global_param x = Pcre.pmatch ~pat:"^param(\\.[^.]+){1}$" x in + let is_local_param x = Pcre.pmatch ~pat:"^param(\\.[^.]+){2}$" x in + let is_property x = Pcre.pmatch ~pat:"^prop\\.[^.]+$" x in + List.fold_left + (fun (old_params, old_properties) (name, value) -> + match name with + | name when is_global_param name -> + let name = Pcre.replace ~pat:"^param\\." name in + ((fun x -> (old_params x) @ [name, value]), old_properties) + | name when is_local_param name -> + let pieces = Pcre.extract ~pat:"^param\\.([^.]+)\\.(.*)" name in + let (key, name) = (pieces.(1), pieces.(2)) in + ((function + | x when x = key -> [name, value] @ (old_params x) + | x -> old_params x), + old_properties) + | name when is_property name -> + let name = Pcre.replace ~pat:"^prop\\." name in + (old_params, ((name, value) :: old_properties)) + | _ -> (old_params, old_properties)) + ((fun _ -> []), []) (* no parameters, no properties *) +;; + +let serialize_param_list = + let is_global_param = Pcre.pmatch ~pat:"^param(\\.[^.]+){1}$" in + let is_local_param = Pcre.pmatch ~pat:"^param(\\.[^.]+){2}$" in + function params -> + let param_value_list = + List.filter + (fun (param, _) -> (is_global_param param) || (is_local_param param)) + params + in + (String.concat + "," + (List.map + (fun (param, value) -> (Pcre.replace ~pat:"^param\\." param) ^ "=" ^ value) + param_value_list)) + +let deserialize_param_list = + List.map + (fun pv -> + match Pcre.split ~pat:"=" pv with + [key] -> (key, None) + | [key; value] -> (key, Some value) + | _ -> assert false) + +(** Parse libxslt's message modes for error and debugging messages. Default is + to ignore mesages of both kind *) +let parse_libxslt_msgs_mode (req: Http_types.request) = + ((try + (match req#param "errormode" with + | s when String.lowercase s = "ignore" -> LibXsltMsgIgnore + | s when String.lowercase s = "comment" -> LibXsltMsgComment + | s when String.lowercase s = "embed" -> LibXsltMsgEmbed + | err -> + raise (Uwobo_failure + (sprintf + "Unknown value '%s' for parameter '%s', use one of '%s' or '%s'" + err "errormode" "ignore" "comment"))) + with Http_types.Param_not_found _ -> LibXsltMsgIgnore), + (try + (match req#param "debugmode" with + | s when String.lowercase s = "ignore" -> LibXsltMsgIgnore + | s when String.lowercase s = "comment" -> LibXsltMsgComment + | s when String.lowercase s = "embed" -> LibXsltMsgEmbed + | err -> + raise (Uwobo_failure + (sprintf + "Unknown value '%s' for parameter '%s', use one of '%s' or '%s'" + err "debugmode" "ignore" "comment"))) + with Http_types.Param_not_found _ -> LibXsltMsgIgnore)) +;; + + (** send ~cmd (without trailing "\n"!) through ~cmd_pipe, then wait for answer + on ~res_pipe (with a timeout of 60 seconds) and send over outchan data + received from ~res_pipe *) +let short_circuit_grandfather_and_client ~cmd ~cmd_pipe ~res_pipe outchan = +(* debug_print (sprintf "Sending command '%s' to grandparent ..." cmd); *) + output_string cmd_pipe (cmd ^ "\n"); (* send command to grandfather *) + flush cmd_pipe; + let res_pipe_fd = Unix.descr_of_in_channel res_pipe in + let (read_fds, _, _) = (* wait for an answer *) + Unix.select [res_pipe_fd] [] [] 60.0 + in + (match read_fds with + | [fd] when fd = res_pipe_fd -> (* send answer to http client *) + Http_daemon.send_basic_headers ~code:(`Code 200) outchan; + Http_daemon.send_header "Content-Type" "text/html" outchan; + Http_daemon.send_CRLF outchan; + (try + while true do + output_string outchan ((input_line res_pipe) ^ "\n") + done + with End_of_file -> flush outchan) + | _ -> (* no answer received from grandfather *) + return_error "Timeout!" outchan) +;; + +let (add_cmd_RE, remove_cmd_RE, reload_cmd_RE, kill_cmd_RE, + createprofile_cmd_RE, removeprofile_cmd_RE, setprofileparam_cmd_RE, + setparams_cmd_RE, setpassword_cmd_RE, setpermission_cmd_RE) = + (Pcre.regexp "^add ", Pcre.regexp "^remove ", Pcre.regexp "^reload ", + Pcre.regexp "^kill", Pcre.regexp "^createprofile ", Pcre.regexp "^removeprofile ", + Pcre.regexp "^setprofileparam ", + Pcre.regexp "^setparams ", Pcre.regexp "^setpassword ", Pcre.regexp "^setpermission ") +;; + + (** raised by child processes when HTTP daemon process have to be restarted *) +exception Restart_HTTP_daemon ;; + + (** log a list of libxslt's messages using a processing logger *) +let log_libxslt_msgs logger libxslt_logger = + List.iter + (function + | (LibXsltErrorMsg _) as msg -> logger#logBold (string_of_xslt_msg msg) + | (LibXsltDebugMsg _) as msg -> logger#logEmph (string_of_xslt_msg msg)) + libxslt_logger#msgs +;; + + (* LibXSLT logger *) +let veillogger = new Uwobo_common.libXsltLogger ;; + + (* start_new_session cmd_pipe_exit res_pipe_entrance outchan port logfile + @param cmd_pipe Pipe to be closed before forking + @param res_pipe Pipe to be closed before forking + @param outchan To be closed before forking + @param port The port to be used + @param logfile The logfile to redirect the stdout and sterr to + *) + (* It can raise Failure "Connection refused" *) + (* It can raise Failure "Port already in use" *) +let start_new_session cmd_pipe res_pipe outchan port logfile = + (* Let's check that the port is free *) + (try + ignore + (Http_user_agent.get + ("http://127.0.0.1:" ^ string_of_int port ^ "/help")) ; + raise (Failure "Port already in use") + with + Unix.Unix_error (Unix.ECONNREFUSED, _, _) -> () + ) ; + match Unix.fork () with + 0 -> + Unix.handle_unix_error + (function () -> + (* 1. We close all the open pipes to avoid duplicating them *) + Unix.close (Unix.descr_of_out_channel cmd_pipe) ; + Unix.close (Unix.descr_of_in_channel res_pipe) ; + Unix.close (Unix.descr_of_out_channel outchan) ; + (* 2. We redirect stdout and stderr to the logfile *) + Unix.close Unix.stdout ; + assert + (Unix.openfile logfile [Unix.O_WRONLY ; Unix.O_APPEND ; Unix.O_CREAT] + 0o664 = Unix.stdout) ; + Unix.close Unix.stderr ; + assert + (Unix.openfile logfile [Unix.O_WRONLY ; Unix.O_APPEND ; Unix.O_CREAT] + 0o664 = Unix.stderr) ; + prerr_endline "***** Starting a new session" ; + + (* 3. We set up a new environment *) + let environment = + (* Here I am loosing the current value of port_env_var; *) + (* this should not matter *) + Unix.putenv "uwobo__port" (string_of_int port) ; + Unix.putenv "uwobo__cloned" "1" ; + Unix.environment () + in + (* 4. We exec a new copy of uwobo *) + Unix.execve Sys.executable_name [||] environment ; + (* It should never reach this point *) + assert false + ) () + | child when child > 0 -> + (* let's check if the new UWOBO started correctly *) + Unix.sleep 5 ; + (* It can raise Failure "Connection refused" *) + (try + ignore + (Http_user_agent.get + ("http://127.0.0.1:" ^ string_of_int port ^ "/help")) + with Unix.Unix_error (Unix.ECONNREFUSED, _, _) -> + raise (Failure "Connection refused")) + | _ -> failwith "Can't fork :-(" +;; + + (* request handler action + @param syslogger Uwobo_logger.sysLogger instance used for logginf + @param styles Uwobo_styles.styles instance which keeps the stylesheets list + @param cmd_pipe output _channel_ used to _write_ update messages + @param res_pipe input _channel_ used to _read_ grandparent results + @param req http request instance + @param outchan output channel connected to http client + *) +let callback + ~syslogger ~styles ~cmd_pipe ~res_pipe () (req: Http_types.request) outchan + = + try + syslogger#log `Notice (sprintf "Connection from %s" req#clientAddr); + syslogger#log `Debug (sprintf "Received request: %s" req#path); + (match req#path with + | "/add" -> + (let bindings = req#paramAll "bind" in + if bindings = [] then + return_error "No [key,stylesheet] binding provided" outchan + else begin + let cmd = sprintf "add %s" (String.concat ";" bindings) in + short_circuit_grandfather_and_client ~cmd ~cmd_pipe ~res_pipe outchan + end) + | "/kill" -> + let logger = new Uwobo_logger.processingLogger () in + logger#log "Exiting" ; + respond_html logger#asHtml outchan ; + let cmd = "kill" in + short_circuit_grandfather_and_client ~cmd ~cmd_pipe ~res_pipe outchan + | "/newsession" -> + let logger = new Uwobo_logger.processingLogger () in + let port = int_of_string (req#param "port") in + let logfile = logfilename_of_port port in + (try + start_new_session cmd_pipe res_pipe outchan port logfile ; + logger#log (sprintf "New session started: port = %d" port) ; + respond_html logger#asHtml outchan + with + Failure "int_of_string" -> + logger#log (sprintf "Invalid port number") ; + respond_html logger#asHtml outchan + | Failure "Port already in use" -> + Uwobo_common.return_error "port already in use" outchan + | Failure "Connection refused" -> + let log = ref [] in + (try + let ch = open_in logfile in + while true do log := (input_line ch ^ "\n") :: !log ; done + with + Sys_error _ + | End_of_file -> () + ) ; + let rec get_last_lines acc = + function + (n,he::tl) when n > 0 -> + get_last_lines (he ^ "
" ^ acc) (n-1,tl) + | _ -> acc + in + (* we just show the last 10 lines of the log file *) + let msg = + (if List.length !log > 0 then "
...
" else "
") ^ + get_last_lines "" (10,!log) + in + Uwobo_common.return_error "daemon not initialized" + ~body:msg outchan) + | "/remove" -> + let cmd = sprintf "remove %s" (req#param "keys") in + short_circuit_grandfather_and_client ~cmd ~cmd_pipe ~res_pipe outchan + | "/reload" -> + let cmd = sprintf "reload %s" (req#param "keys") in + short_circuit_grandfather_and_client ~cmd ~cmd_pipe ~res_pipe outchan + | "/list" -> + (let logger = new Uwobo_logger.processingLogger () in + (match styles#list with + | [] -> logger#log "No stylesheets loaded (yet)!" + | l -> + logger#log "Stylesheets list:"; + List.iter (fun s -> logger#log s) l); + respond_html logger#asHtml outchan) + | "/listprofiles" -> + let profile_list = Uwobo_profiles.list () in + respond_html ("
    " ^ String.concat "" (List.map (fun s -> "
  • " ^ s ^ "
  • ") profile_list) ^ "
") outchan + | "/createprofile" -> + let serialized_param_value_list = serialize_param_list req#params in + let cmd = sprintf "createprofile %s,%s,%s,%s,%s,%s,%s,%s" + (string_of_param_option req "id") + (string_of_param_option req "orig") + (string_of_param_option req "origpassword") + (string_of_param_option req "readperm") + (string_of_param_option req "writeperm") + (string_of_param_option req "adminperm") + (string_of_param_option req "password") + serialized_param_value_list + in + short_circuit_grandfather_and_client ~cmd ~cmd_pipe ~res_pipe outchan + | "/removeprofile" -> + let cmd = sprintf "removeprofile %s,%s" + (req#param "id") + (string_of_param_option req "password") + in + short_circuit_grandfather_and_client ~cmd ~cmd_pipe ~res_pipe outchan + | "/setparam" -> + let cmd = sprintf "setprofileparam %s,%s,%s,%s" + (string_of_param_option req "id") + (string_of_param_option req "password") + (req#param "key") + (string_of_param_option req "value") + in + short_circuit_grandfather_and_client ~cmd ~cmd_pipe ~res_pipe outchan + | "/setpassword" -> + let cmd = sprintf "setpassword %s,%s,%s" + (req#param "id") + (string_of_param_option req "oldpassword") + (string_of_param_option req "password") + in + short_circuit_grandfather_and_client ~cmd ~cmd_pipe ~res_pipe outchan + | "/setpermission" -> + begin + match req#param "for" with + "read" + | "write" + | "admin" as forwhat -> + let cmd = sprintf "setpermission %s,%s,%s,%s" + (req#param "id") + (string_of_param_option req "password") + forwhat + (req#param "value") + in + short_circuit_grandfather_and_client ~cmd ~cmd_pipe ~res_pipe outchan + | _ -> Http_daemon.respond_error ~code:(`Status (`Client_error `Bad_request)) outchan + end + | "/getparams" -> + let pid = req#param "id" in + let password = try Some (req#param "password") with _ -> None in + let res = Uwobo_profiles.get_params pid ?password () in + respond_html + ("
    " ^ + String.concat "" (List.map (fun (k,v) -> "
  • " ^ k ^ " = " ^ v ^ "
  • ") res) ^ + "
") outchan + | "/setparams" -> + let serialized_param_value_list = serialize_param_list req#params in + let cmd = sprintf "setparams %s,%s,%s" + (req#param "id") + (string_of_param_option req "password") + serialized_param_value_list + in + short_circuit_grandfather_and_client ~cmd ~cmd_pipe ~res_pipe outchan + | "/getparam" -> + let pid = req#param "id" in + let password = try Some (req#param "password") with _ -> None in + let key = req#param "key" in + let value = Uwobo_profiles.get_param pid ?password ~key () in + respond_html ("" ^ value ^ "") outchan + | "/getpermission" -> + let pid = req#param "id" in + let password = try Some (req#param "password") with _ -> None in + let forwhat = + match req#param "for" with + "read" -> Some `Read + | "write" -> Some `Write + | "admin" -> Some `Admin + | _ -> None + in + begin + match forwhat with + Some forwhat -> + let value = Uwobo_profiles.get_permission pid ?password forwhat in + respond_html ("" ^ (if value then "public" else "private") ^ "") outchan + | None -> Http_daemon.respond_error ~code:(`Status (`Client_error `Bad_request)) outchan ; + end + | "/apply" -> + let logger = new Uwobo_logger.processingLogger () in + veillogger#clearMsgs; + let profile = try Some (req#param "profile") with _ -> None in + let password = try Some (req#param "password") with _ -> None in + let xmluri = req#param "xmluri" in + let keys = Pcre.split ~pat:"," (req#param "keys") in + (* notation: "local" parameters are those defined on a per-stylesheet + pasis (i.e. param.key.param=value), "global" parameters are those + defined for all stylesheets (i.e. param.param=value) *) + let (user_params, props) = parse_apply_params req#params in + let profile_params = + match profile with + None -> [] + | Some profile -> Uwobo_profiles.get_params profile ?password () in + let params = + (* user provided parameters override the profile parameters *) + let is_global_param x = Pcre.pmatch ~pat:"^(\\.[^.]+){1}$" ("." ^ x) in + let is_local_param x = Pcre.pmatch ~pat:"^(\\.[^.]+){2}$" ("." ^ x) in + let add key value params = + if List.mem_assoc key params then params else params @ [key,value] + in + List.fold_left + (fun old_params (name, value) -> + match name with + | name when is_global_param name -> + (fun x -> add name value (old_params x)) + | name when is_local_param name -> + let pieces = Pcre.extract ~pat:"^([^.]+)\\.(.*)" name in + let (key, name) = (pieces.(1), pieces.(2)) in + (function + | x when x = key -> add name value (old_params x) + | x -> old_params x) + | _ -> assert false) + user_params profile_params + in + let (libxslt_errormode, libxslt_debugmode) = + parse_libxslt_msgs_mode req + in + syslogger#log `Debug (sprintf "Parsing input document %s ..." xmluri); + let domImpl = Gdome.domImplementation () in + let input = domImpl#createDocumentFromURI ~uri:xmluri () in + if debug then begin + let tmp_xml, tmp_uri = + let dir = + Filename.dirname (Helm_registry.get "uwobo.log_basename") + in + dir ^ "/input.xml", dir ^ "/input.uri" + in + ignore (domImpl#saveDocumentToFile ~doc:input ~name:tmp_xml ()); + let oc = open_out tmp_uri in + output_string oc xmluri; + close_out oc + end; + syslogger#log `Debug "Applying stylesheet chain ..."; + (try + let (write_result, media_type, encoding) = (* out_channel -> unit *) + Uwobo_engine.apply + ~logger:syslogger ~styles ~keys ~params ~props ~veillogger + ~errormode:libxslt_errormode ~debugmode:libxslt_debugmode + input + in + let content_type = (* value of Content-Type HTTP response header *) + sprintf "%s; charset=%s" + (match media_type with None -> get_media_type props | Some t -> t) + (match encoding with None -> get_encoding props | Some e -> e) + in + syslogger#log `Debug + (sprintf "sending output to client (Content-Type: %s)...." + content_type); + Http_daemon.send_basic_headers ~code:(`Code 200) outchan; + Http_daemon.send_header "Content-Type" content_type outchan; + Http_daemon.send_CRLF outchan; + write_result outchan + with Uwobo_failure errmsg -> + return_error + ("Stylesheet chain application failed: " ^ errmsg) + ~body: ("

LibXSLT's messages:

" ^ + String.concat "
\n" + (List.map string_of_xslt_msg veillogger#msgs)) + outchan) + | "/help" -> respond_html usage_string outchan + | invalid_request -> + Http_daemon.respond_error ~code:(`Status (`Client_error `Bad_request)) outchan); + syslogger#log `Debug (sprintf "%s done!" req#path); + with + | Http_types.Param_not_found attr_name -> + bad_request (sprintf "Parameter '%s' is missing" attr_name) outchan + | exc -> + return_error ("Uncaught exception: " ^ (Printexc.to_string exc)) outchan +;; + + (* UWOBO's startup *) +let main () = + (* (1) system logger *) + let logger_outchan = + debug_print (sprintf "Logging to file %s" logfile); + open_out_gen [Open_wronly; Open_append; Open_creat] logfile_perm logfile + in + let syslogger = + new Uwobo_logger.sysLogger ~level:debug_level ~outchan:logger_outchan () + in + syslogger#enable; + (* (2) stylesheets list *) + let styles = new Uwobo_styles.styles in + (* (3) clean up actions *) + let last_process = ref true in + let http_child = ref None in + let die_nice () = (** at_exit callback *) + if !last_process then begin + (match !http_child with + | None -> () + | Some pid -> Unix.kill pid Sys.sigterm); + syslogger#log `Notice (sprintf "%s is terminating, bye!" daemon_name); + syslogger#disable; + close_out logger_outchan + end + in + at_exit die_nice; + ignore (Sys.signal Sys.sigterm + (Sys.Signal_handle (fun _ -> raise Sys.Break))); + syslogger#log `Notice + (sprintf "%s started and listening on port %d" daemon_name port); + syslogger#log `Notice (sprintf "current directory is %s" (Sys.getcwd ())); + Unix.putenv "http_proxy" ""; (* reset http_proxy to avoid libxslt problems *) + while true do + let (cmd_pipe_exit, cmd_pipe_entrance) = Unix.pipe () in + let (res_pipe_exit, res_pipe_entrance) = Unix.pipe () in + match Unix.fork () with + | child when child > 0 -> (* (4) parent: listen on cmd pipe for updates *) + http_child := Some child; + let stop_http_daemon () = (* kill child *) + debug_print (sprintf "UWOBOmaster: killing pid %d" child); + Unix.kill child Sys.sigterm; (* kill child ... *) + ignore (Unix.waitpid [] child); (* ... and its zombie *) + in + Unix.close cmd_pipe_entrance; + Unix.close res_pipe_exit; + let cmd_pipe = Unix.in_channel_of_descr cmd_pipe_exit in + let res_pipe = Unix.out_channel_of_descr res_pipe_entrance in + (try + while true do + (* INVARIANT: 'Restart_HTTP_daemon' exception is raised only after + child process has been killed *) + debug_print "UWOBOmaster: waiting for commands ..."; + let cmd = input_line cmd_pipe in + debug_print (sprintf "UWOBOmaster: received %s command" cmd); + (match cmd with (* command from grandchild *) + | "test" -> + stop_http_daemon (); + output_string res_pipe "UWOBOmaster: Hello, world!\n"; + flush res_pipe; + raise Restart_HTTP_daemon + | line when Pcre.pmatch ~rex:kill_cmd_RE line -> (* /kill *) + exit 0 + | line when Pcre.pmatch ~rex:add_cmd_RE line -> (* /add *) + let bindings = + Pcre.split ~pat:";" (Pcre.replace ~rex:add_cmd_RE line) + in + stop_http_daemon (); + let logger = new Uwobo_logger.processingLogger () in + List.iter + (fun binding -> (* add a binding *) + let pieces = Pcre.split ~pat:"," binding in + match pieces with + | [key; style] -> + logger#log (sprintf "adding binding <%s,%s>" key style); + veillogger#clearMsgs; + (try + veillogger#clearMsgs; + styles#add key style; + log_libxslt_msgs logger veillogger; + with e -> + logger#log (Printexc.to_string e)) + | _ -> logger#log (sprintf "invalid binding %s" binding)) + bindings; + output_string res_pipe logger#asHtml; + flush res_pipe; + raise Restart_HTTP_daemon + | line when Pcre.pmatch ~rex:remove_cmd_RE line -> (* /remove *) + stop_http_daemon (); + let arg = Pcre.replace ~rex:remove_cmd_RE line in + let logger = new Uwobo_logger.processingLogger () in + veillogger#clearMsgs; + act_on_keys + arg styles logger + styles#remove (fun () -> styles#removeAll) styles#keys + "removing"; + log_libxslt_msgs logger veillogger; + output_string res_pipe (logger#asHtml); + raise Restart_HTTP_daemon + | line when Pcre.pmatch ~rex:reload_cmd_RE line -> (* /reload *) + stop_http_daemon (); + let arg = Pcre.replace ~rex:reload_cmd_RE line in + let logger = new Uwobo_logger.processingLogger () in + veillogger#clearMsgs; + act_on_keys + arg styles logger + styles#reload (fun () -> styles#reloadAll) styles#keys + "reloading"; + output_string res_pipe (logger#asHtml); + raise Restart_HTTP_daemon + | line when Pcre.pmatch ~rex:createprofile_cmd_RE line -> (* /createprofile *) + stop_http_daemon (); + begin + match (Pcre.split ~pat:"," (Pcre.replace ~rex:createprofile_cmd_RE line)) with + id::clone::clone_password::read_perm::write_perm::admin_perm::password::pv_list -> + let bool_option_of_string_option = + function + Some "true" -> Some true + | Some _ -> Some false + | None -> None + in + let pid = + Uwobo_profiles.create + ?id:(string_option_of_string id) + ?clone:(string_option_of_string clone) + ?clone_password:(string_option_of_string clone_password) + ?read_perm:(bool_option_of_string_option (string_option_of_string read_perm)) + ?write_perm:(bool_option_of_string_option (string_option_of_string write_perm)) + ?admin_perm:(bool_option_of_string_option (string_option_of_string admin_perm)) + ?password:(string_option_of_string password) + () + in + let pv_list' = (deserialize_param_list pv_list) in + List.iter + (fun (key, value) -> + Uwobo_profiles.set_param + pid ?password:(string_option_of_string password) ~key ~value ()) + pv_list' ; + save_configuration () ; + output_string res_pipe ("Profile " ^ pid ^ " created. Hi " ^ pid) ; + raise Restart_HTTP_daemon + | _ -> assert false + end + | line when Pcre.pmatch ~rex:removeprofile_cmd_RE line -> (* /removeprofile *) + stop_http_daemon (); + let pid, password = + match Pcre.split ~pat:"," (Pcre.replace ~rex:removeprofile_cmd_RE line) with + [pid; password] -> pid, (string_option_of_string password) + | _ -> assert false + in + Uwobo_profiles.remove pid ?password () ; + save_configuration () ; + output_string res_pipe "Done" ; + raise Restart_HTTP_daemon + | line when Pcre.pmatch ~rex:setparams_cmd_RE line -> (* /setparams *) + stop_http_daemon () ; + let pid, password, pv_list = + match Pcre.split ~pat:"," (Pcre.replace ~rex:setparams_cmd_RE line) with + pid::password::pv_list -> + pid, (string_option_of_string password), (deserialize_param_list pv_list) + | _ -> assert false + in + List.iter + (fun (key, value) -> Uwobo_profiles.set_param pid ?password ~key ~value ()) + pv_list ; + save_configuration () ; + output_string res_pipe "Done" ; + raise Restart_HTTP_daemon + | line when Pcre.pmatch ~rex:setprofileparam_cmd_RE line -> (* /setprofileparam *) + stop_http_daemon (); + let pid, password, key, value = + match Pcre.split ~pat:"," (Pcre.replace ~rex:setprofileparam_cmd_RE line) with + [pid; password; key; value] -> + pid, (string_option_of_string password), key, (string_option_of_string value) + | _ -> assert false + in + Uwobo_profiles.set_param pid ?password ~key ~value () ; + save_configuration () ; + output_string res_pipe "Done" ; + raise Restart_HTTP_daemon + | line when Pcre.pmatch ~rex:setpassword_cmd_RE line -> (* /setpassword *) + stop_http_daemon (); + let pid, old_password, password = + match Pcre.split ~pat:"," (Pcre.replace ~rex:setpassword_cmd_RE line) with + [pid; old_password; password] -> + pid, (string_option_of_string old_password), (string_option_of_string password) + | _ -> assert false + in + Uwobo_profiles.set_password pid ?old_password password ; + save_configuration () ; + output_string res_pipe "Done" ; + raise Restart_HTTP_daemon + | line when Pcre.pmatch ~rex:setpermission_cmd_RE line -> (* /setpermission *) + stop_http_daemon (); + let permission_of_string = + function + "read" -> `Read + | "write" -> `Write + | "admin" -> `Admin + | _ -> assert false + and bool_of_string s = "public" = s + in + let pid, password, forwhat, value = + match Pcre.split ~pat:"," (Pcre.replace ~rex:setpermission_cmd_RE line) with + [pid; password; forwhat; value] -> + pid, (string_option_of_string password), (permission_of_string forwhat), (bool_of_string value) + | _ -> assert false + in + Uwobo_profiles.set_permission pid ?password forwhat value ; + save_configuration () ; + output_string res_pipe "Done" ; + raise Restart_HTTP_daemon + | cmd -> (* invalid interprocess command received *) + syslogger#log `Warning + (sprintf "Ignoring invalid interprocess command: '%s'" cmd)) + done + with + | Restart_HTTP_daemon -> + close_in cmd_pipe; (* these calls close also fds *) + close_out res_pipe + | Sys.Break as exn -> raise exn + | e -> (* Should we return a 404 error here? Maybe... (how?) *) + output_string res_pipe (Printexc.to_string e); + close_in cmd_pipe; (* these calls close also fds *) + close_out res_pipe) + | 0 -> (* (5) child: serve http requests *) + Unix.close cmd_pipe_exit; + Unix.close res_pipe_entrance; + last_process := false; + let cmd_pipe = Unix.out_channel_of_descr cmd_pipe_entrance in + let res_pipe = Unix.in_channel_of_descr res_pipe_exit in + debug_print (sprintf "Starting HTTP daemon on port %d ..." port); + (* next invocation doesn't return, process will keep on serving HTTP + requests until it will get killed by father *) + Http_daemon.start'~port ~mode:`Fork + (callback ~syslogger ~styles ~cmd_pipe ~res_pipe ()) + | _ (* < 0 *) -> (* fork failed :-((( *) + failwith "Can't fork :-(" + done +;; + + (* daemon initialization *) +try + Sys.catch_break true; + main () +with Sys.Break -> () (* 'die_nice' registered with at_exit *) +;; + diff --git a/daemons/uwobo/uwobo_common.ml b/daemons/uwobo/uwobo_common.ml new file mode 100644 index 000000000..8952f8132 --- /dev/null +++ b/daemons/uwobo/uwobo_common.ml @@ -0,0 +1,243 @@ +(* + * Copyright (C) 2003: + * Stefano Zacchiroli + * for the HELM Team http://helm.cs.unibo.it/ + * + * This file is part of HELM, an Hypertextual, Electronic + * Library of Mathematics, developed at the Computer Science + * Department, University of Bologna, Italy. + * + * HELM is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * HELM is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with HELM; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + * For details, see the HELM World-Wide-Web page, + * http://helm.cs.unibo.it/ + *) + +open Printf ;; + +exception Uwobo_failure of string ;; + +let uwobo_namespace = "http://helm.cs.unibo.it/uwobo" ;; +let xsl_namespace = "http://helm.cs.unibo.it/uwobo" ;; + +let supported_properties = [ + "cdata-section-elements"; + "doctype-public"; + "doctype-system"; + "encoding"; + "indent"; + "media-type"; + "method"; + "omit-xml-declaration"; + "standalone"; + "version" +] + +let is_supported_property name = List.mem name supported_properties + +let version = "0.3.0" ;; + +let usage_string = + sprintf + " + + + UWOBO's help message + + +

UWOBO (version: %s)

+

Information

+ Version: %s +

Usage

+

+ Usage: http://hostname:uwoboport/command +

+

+ Available commands: +

+

+ help
+ displays this help message +

+

+ newsession?port=p
+ starts a new daemon on a given port p +

+

+ kill
+ kills the daemon. The log file is mantained. +

+

+ add?bind=key,uri[&bind=key,uri[&...]]
+ loads a new stylesheet, specified by uri, and bind it to key + key +

+

+ remove?keys=[key1,key2,...]
+ unload stylesheets specified by key1, key2, ... or all + stylesheets if no key was given +

+

+ reload?keys=[key1,key2,...]
+ reloads the stylesheets specified by key1, key2, .... Reloads all + the stylesheets if no key was given +

+

+ list
+ returns the list of loaded stylesheets +

+

+ apply?xmluri=uri&keys=key1,key2,...[&errormode={ignore|comment|embed}][&debugmode={ignore|comment|embed}][&profile=id][&password=password][¶m.name=value[¶m.name=value[&...]]][¶m.key.name=value[¶m.key.name=value[&...]]][&prop.name[=value][&prop.name[=value][&...]]]
+ applies a chain of stylesheets, specified by key1, key2, ..., to an + input document, specified by uri.
+ Error and debugging modes could be ste to three different values. + ignore means that LibXSLT messages are ignored; comment + meanst that LibXSLT messages are embedded in the result document inside an + XML like comment; embed means that LibXSLT messages are embedded + at the beginning of the result document (as childs of the root node) in + XML elements in the UWOBO namespace
+ Additional parameters can be set for each stylesheet application: global + parameters (i.e. parameters passed to all stylesheets) are set using + param.name=value syntax, per stylesheet parameters are set using + param.key.name=value where key is the key of a loaded + stylesheet.
+ Moreover, it is possible to specify a profile that is searched for + additional global and local parameters. The parameters stored in the profile + have lower precedence with respect to those provided in the URL. A + password for the profile must be provided if the read permission + of the profile is set to false.
+ Properties of the final chain output can be set as well: valueless properties + can be set using prop.name syntax, others can be set using + prop.name=value syntax.
+ Current supported properties are: %s. +

+

+ listprofiles
+ returns the list of profiles available +

+

+ createprofile?[id=id][&orig=orig][&origpassword=origpassword][&readperm={public|private}][&writeperm={public|private}][&adminperm={public|private}][&password=password]
+ creates a new profile. The id of the created profile is id (if provided); otherwise it is a fresh id. + The parameters are inherited from the profile orig, if provided. origpassword is the password of the + profile being copied in case the read permission of that profile is set to false. The default for + password is no password, the defaults for readper,writeperm,adminperm are public, public, public. +

+

+ removeprofile?id=id[&password=password]
+ removes the profile id. The password is required if the profile administrative permission + is set to false. +

+

+ setparam?id=id[&password=password]&key=key[&value=value]
+ sets the parameter key to value, if value is provided; otherwise + the parameter is unset. The password is required if the profile writing permission is set to + false. +

+

+ setpassword?id=id[&oldpassword=oldpassword][&password=password]
+ changes or unset the password for a profile. The old password is required if it was set. +

+

+ setpermission?id=id[&password=password]&permission={read|write|admin}&value={public|private}
+ changes the permission permission. The password is required if the administrative permission + is set to false. +

+

+ getparams?id=id[&password=password]
+ returns all the parameters of the profile id. The password is required if the read permission + is set to false. +

+

+ getparam?id=id[&password=password]&key=key
+ returns the value of the parameter key of the profile id. The password is required if the read permission + is set to false. +

+

+ getpermission?id=id[&password=password]&for={read|write|admin}
+ returns the value of the permission key of the profile id. The password is required if the administrative + permission is set to false. +

+ + +" + version version + (String.concat ", " supported_properties) (* supported properties *) +;; + +let pp_error = + sprintf + "Error: %s%s" +;; +let return_error msg ?(body = "") outchan = + Http_daemon.respond ~body:(pp_error msg body) outchan;; +let bad_request body outchan = + Http_daemon.respond_error ~code:(`Code 400) ~body outchan +;; + + (** {2 LibXSLT logging} *) + +type xslt_msg = + | LibXsltErrorMsg of string + | LibXsltDebugMsg of string +;; + +let string_of_xslt_msg = function + | LibXsltErrorMsg msg -> "LibXSLT ERROR: " ^ msg + | LibXsltDebugMsg msg -> "LibXSLT DEBUG: " ^ msg +;; + +type xslt_msg_mode = + | LibXsltMsgIgnore + | LibXsltMsgComment + | LibXsltMsgEmbed +;; + +class libXsltLogger = + let is_libxslt_error = function LibXsltErrorMsg _ -> true | _ -> false in + let is_libxslt_debug = function LibXsltDebugMsg _ -> true | _ -> false in + let flatten_libxslt_msg = function + | LibXsltErrorMsg msg -> msg + | LibXsltDebugMsg msg -> msg + in + object (self) + + initializer + Gdome_xslt.setErrorCallback + (Some (fun msg -> self#appendMsg (LibXsltErrorMsg msg))); + Gdome_xslt.setDebugCallback + (Some (fun msg -> self#appendMsg (LibXsltDebugMsg msg))) + + val mutable libXsltMsgs = [] (** libxslt's error and debugging messages *) + + (* libxslt's error and debugging messages handling *) + + method private appendMsg msg = libXsltMsgs <- msg :: libXsltMsgs + + method clearMsgs = libXsltMsgs <- [] + method clearErrorMsgs = + libXsltMsgs <- List.filter is_libxslt_debug libXsltMsgs + method clearDebugMsgs = + libXsltMsgs <- List.filter is_libxslt_error libXsltMsgs + + method msgs = libXsltMsgs + method errorMsgs = + List.map flatten_libxslt_msg (List.filter is_libxslt_error libXsltMsgs) + method debugMsgs = + List.map flatten_libxslt_msg (List.filter is_libxslt_debug libXsltMsgs) + + end +;; + diff --git a/daemons/uwobo/uwobo_common.mli b/daemons/uwobo/uwobo_common.mli new file mode 100644 index 000000000..9bd90c514 --- /dev/null +++ b/daemons/uwobo/uwobo_common.mli @@ -0,0 +1,75 @@ +(* + * Copyright (C) 2003: + * Stefano Zacchiroli + * for the HELM Team http://helm.cs.unibo.it/ + * + * This file is part of HELM, an Hypertextual, Electronic + * Library of Mathematics, developed at the Computer Science + * Department, University of Bologna, Italy. + * + * HELM is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * HELM is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with HELM; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + * For details, see the HELM World-Wide-Web page, + * http://helm.cs.unibo.it/ + *) + +exception Uwobo_failure of string + + (** XML namespace of UWOBO generated XML elements *) +val uwobo_namespace: string + +val supported_properties: string list +val is_supported_property: string -> bool + +val version: string (** version *) +val usage_string: string (** HTTP GET usage string *) + + (** return an ok (200) http response, which display in html an error message. + Error title is reported inside an h1 tag; error body, if given, follows *) +val return_error: string -> ?body: string -> out_channel -> unit + (** return a 400 (bad request) http response *) +val bad_request: string -> out_channel -> unit + + (** {2 LibXSLT logging} *) + + (** libxslt's message *) +type xslt_msg = + | LibXsltErrorMsg of string (** libxslt's error messages *) + | LibXsltDebugMsg of string (** libxslt's debugging messages *) + + (** pretty print a xslt_msg *) +val string_of_xslt_msg: xslt_msg -> string + + (** libxslt's message reporting mode. That is: how to report libxslt's + messages during apply method *) +type xslt_msg_mode = + | LibXsltMsgIgnore (** Ignore some kind of messages *) + | LibXsltMsgComment (** Embed in XML comments some kind of messages *) + | LibXsltMsgEmbed (** Embed in XML elements some kind of messages *) + +class libXsltLogger: + object + + method clearMsgs: unit + method clearErrorMsgs: unit + method clearDebugMsgs: unit + + method msgs: xslt_msg list + method errorMsgs: string list + method debugMsgs: string list + + end + diff --git a/daemons/uwobo/uwobo_engine.ml b/daemons/uwobo/uwobo_engine.ml new file mode 100644 index 000000000..03a3b424d --- /dev/null +++ b/daemons/uwobo/uwobo_engine.ml @@ -0,0 +1,263 @@ +(* + * Copyright (C) 2003: + * Stefano Zacchiroli + * for the HELM Team http://helm.cs.unibo.it/ + * + * This file is part of HELM, an Hypertextual, Electronic + * Library of Mathematics, developed at the Computer Science + * Department, University of Bologna, Italy. + * + * HELM is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * HELM is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with HELM; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + * For details, see the HELM World-Wide-Web page, + * http://helm.cs.unibo.it/ + *) + +open Printf;; +open Uwobo_common;; + + (** set this to true and uwobo will save transformation's intermediate results + in /tmp/uwobo_intermediate__.xml *) +let save_intermediate_results = false;; + +let xslNS = Gdome.domString "http://www.w3.org/1999/XSL/Transform" +let outputS = Gdome.domString "output" + + (** given a Gdome.document representing an XSLT stylesheet and an output + property return 'Some value' where 'value' is the property value, or None if + it's not defined *) +let get_property name (document: Gdome.document) = + let node_list = document#getElementsByTagNameNS xslNS outputS in + match node_list#item 0 with + | None -> None + | Some node -> + let element = new Gdome.element_of_node node in + let domName = Gdome.domString name in + if element#hasAttribute domName then + Some (element#getAttribute domName)#to_string + else + None +;; + +let namespaceURI = Some (Gdome.domString Uwobo_common.uwobo_namespace) ;; + + (** output type wrt adding of debugging/error messages *) +type outputType = + | XmlOutput of Gdome.node + | TextPlainOutput of Gdome.text + | NoOutput +;; + +exception Found of int ;; + + (** add debugging and/or error messages to a Gdome document. Handle three + distinct cases: (1) output contains an XML tree, (2) output contains only one + text node, (3) output contains no data. + If output contains an XML tree then users wishes are preserved and messages + are either not included or included as comments or included as XML ndoes. + If output contains only a text node comments are either not included or + included at the beginning of the textual output. + If output contains no data (i.e. DOM superroot node with no element or text + children) messages are embedded as XML comments or not embedded at all *) +let add_msgs ~errormode ~debugmode ~msgs (doc: Gdome.document) = + let getOutputType (doc: Gdome.document) = + let children = doc#get_childNodes in + let len = children#get_length in + let rec find_element i = + if i > len then + raise Not_found + else + (match children#item i with + | Some node when node#get_nodeType = GdomeNodeTypeT.ELEMENT_NODE -> + XmlOutput node + | _ -> find_element (i + 1)) + in + let rec find_text i = + if i > len then + raise Not_found + else + (match children#item i with + | Some node when node#get_nodeType = GdomeNodeTypeT.TEXT_NODE -> + TextPlainOutput (new Gdome.text_of_node node) + | _ -> find_element (i + 1)) + in + if len = 0 then + NoOutput + else + (try find_element 0 with Not_found -> + (try find_text 0 with Not_found -> NoOutput)) + in + match getOutputType (doc :> Gdome.document) with + | XmlOutput node -> + let add_generic_msg mode build tagname = + (match mode with + | LibXsltMsgIgnore -> (fun msg -> ()) + | LibXsltMsgComment -> + (fun msg -> +(* let contents = string_of_xslt_msg (build msg) ^ "
" in *) + let contents = string_of_xslt_msg (build msg) in + ignore (node#insertBefore + ~newChild:(doc#createComment + (Gdome.domString contents) :> Gdome.node) + ~refChild:node#get_firstChild)) + | LibXsltMsgEmbed -> + (fun msg -> +(* let contents = string_of_xslt_msg (build msg) ^ "
" in *) + let contents = string_of_xslt_msg (build msg) in + let element = + doc#createElementNS + ~namespaceURI ~qualifiedName:(Gdome.domString tagname) + in + ignore (element#appendChild + (doc#createTextNode + ~data:(Gdome.domString contents) :> Gdome.node)); + ignore (node#insertBefore + ~newChild:(element :> Gdome.node) + ~refChild:node#get_firstChild))) + in + let add_error_msg = + add_generic_msg + errormode (fun msg -> LibXsltErrorMsg msg) "uwobo:error" + in + let add_debug_msg = + add_generic_msg + debugmode (fun msg -> LibXsltDebugMsg msg) "uwobo:debug" + in + List.iter + (function + | LibXsltErrorMsg msg -> add_error_msg msg + | LibXsltDebugMsg msg -> add_debug_msg msg) + (List.rev msgs) (* because each msg is added as 1st children *) +| TextPlainOutput text -> + let add_generic_msg mode build = + (match mode with + | LibXsltMsgIgnore -> (fun _ -> ()) + | LibXsltMsgComment | LibXsltMsgEmbed -> + (fun msg -> + text#insertData ~offset:0 + ~arg:(Gdome.domString + (string_of_xslt_msg (build msg) ^ "\n")))) + in + let add_error_msg = + add_generic_msg errormode (fun msg -> LibXsltErrorMsg msg) + in + let add_debug_msg = + add_generic_msg debugmode (fun msg -> LibXsltDebugMsg msg) + in + List.iter + (function + | LibXsltErrorMsg msg -> add_error_msg msg + | LibXsltDebugMsg msg -> add_debug_msg msg) + (List.rev msgs) (* because each msg is added as 1st children *) +| NoOutput -> + let add_generic_msg mode build = + (match mode with + | LibXsltMsgIgnore -> (fun _ -> ()) + | LibXsltMsgComment | LibXsltMsgEmbed -> + (fun msg -> + let comment_node = + (* use comments anyway because text nodes aren't allowed in DOM as + superroot children *) + doc#createComment + (Gdome.domString (string_of_xslt_msg (build msg))) + in + ignore (doc#insertBefore ~newChild:(comment_node :> Gdome.node) + ~refChild:doc#get_firstChild))) + in + let add_error_msg = + add_generic_msg errormode (fun msg -> LibXsltErrorMsg msg) + in + let add_debug_msg = + add_generic_msg debugmode (fun msg -> LibXsltDebugMsg msg) + in + List.iter + (function + | LibXsltErrorMsg msg -> add_error_msg msg + | LibXsltDebugMsg msg -> add_debug_msg msg) + (List.rev msgs) (* because each msg is added as 1st children *) +;; + +let apply + ~(logger: Uwobo_logger.sysLogger) + ~(styles: Uwobo_styles.styles) + ~keys ~params ~props + ~(veillogger: Uwobo_common.libXsltLogger) + ?(errormode = LibXsltMsgIgnore) ?(debugmode = LibXsltMsgIgnore) + input + = + (* "p_" prefix means "processed" *) + let (p_stylesheets,last_stylesheet) = styles#get keys props logger in + logger#log `Debug "Creating input document ..."; + let intermediate_results_seqno = ref 0 in + let result = (* Gdome.document *) + List.fold_left + (fun source (key, stylesheet) -> + logger#log `Debug (sprintf "Applying stylesheet %s ..." key); + try + let params = + List.map + (fun (key,value) -> + let quoted_value = + if String.contains value '\'' then + if String.contains value '"' then + raise + (Failure + ("A parameter value can not contain both single and " ^ + "double quotes, since it must be a valid XPath string " ^ + "literal")) + else + "\"" ^ value ^ "\"" + else + "'" ^ value ^ "'" + in + (key,quoted_value) + ) (params key) + in + logger#log `Debug + (sprintf "Gdome_xslt.applyStylesheet params=%s" + (String.concat ", " (List.map (fun (k,v) -> k^": "^v) params))); + let res = Gdome_xslt.applyStylesheet ~source ~stylesheet ~params in + if save_intermediate_results then begin + let domImpl = Gdome.domImplementation () in + ignore + (domImpl#saveDocumentToFile + ~doc:res + ~name:(sprintf "/tmp/uwobo_intermediate_%d_%d.xml" + !intermediate_results_seqno (Unix.getpid())) + ()); + incr intermediate_results_seqno; + end; + res + with e -> raise (Uwobo_failure (Printexc.to_string e))) + input + p_stylesheets + in + (* add error and debugging messages to result document *) + add_msgs ~errormode ~debugmode ~msgs:veillogger#msgs result; +(* + (* DEBUGGING *) + add_msgs + ~errormode:LibXsltMsgEmbed ~debugmode:LibXsltMsgEmbed + ~msgs:[LibXsltErrorMsg "error1"; LibXsltDebugMsg "debug1"] + result; +*) + let p_last_stylesheet = snd (List.hd (List.rev p_stylesheets)) in + ((fun outchan -> (* serialization function *) + Gdome_xslt.saveResultToChannel ~outchan ~result + ~stylesheet:p_last_stylesheet), + (get_property "media-type" last_stylesheet), (* media-type *) + (get_property "encoding" last_stylesheet)) (* encoding *) + diff --git a/daemons/uwobo/uwobo_engine.mli b/daemons/uwobo/uwobo_engine.mli new file mode 100644 index 000000000..407afab02 --- /dev/null +++ b/daemons/uwobo/uwobo_engine.mli @@ -0,0 +1,55 @@ +(* + * Copyright (C) 2003: + * Stefano Zacchiroli + * for the HELM Team http://helm.cs.unibo.it/ + * + * This file is part of HELM, an Hypertextual, Electronic + * Library of Mathematics, developed at the Computer Science + * Department, University of Bologna, Italy. + * + * HELM is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * HELM is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with HELM; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + * For details, see the HELM World-Wide-Web page, + * http://helm.cs.unibo.it/ + *) + +open Uwobo_common ;; + + (** + @param logger logger for processing messages + @param styles stylesheets object + @param keys (ordered) list of stylesheet names to be applied + @param params function mapping stylesheet names to parameters list + @param props xml:output properties + @param errormode what to do with LibXSLT's error messages + @param debugmode what to do with LibXSLT's debugging messages + @param input URI of input document + @return a triple: 1st element is a function that takes an out_channel and + write the result document on it, 2nd element is a string option representing + the desired media-type, 3rd is a string option representing the desired + encoding + *) +val apply: + logger: Uwobo_logger.sysLogger -> + styles: Uwobo_styles.styles -> + keys: string list -> + params: (string -> (string * string) list) -> + props: (string * string) list -> + veillogger: Uwobo_common.libXsltLogger -> + ?errormode: xslt_msg_mode -> ?debugmode: xslt_msg_mode -> + Gdome.document -> + ((out_channel -> unit) * string option * string option) + diff --git a/daemons/uwobo/uwobo_logger.ml b/daemons/uwobo/uwobo_logger.ml new file mode 100644 index 000000000..0b557f114 --- /dev/null +++ b/daemons/uwobo/uwobo_logger.ml @@ -0,0 +1,107 @@ +(* + * Copyright (C) 2003: + * Stefano Zacchiroli + * for the HELM Team http://helm.cs.unibo.it/ + * + * This file is part of HELM, an Hypertextual, Electronic + * Library of Mathematics, developed at the Computer Science + * Department, University of Bologna, Italy. + * + * HELM is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * HELM is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with HELM; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + * For details, see the HELM World-Wide-Web page, + * http://helm.cs.unibo.it/ + *) + +open Printf;; + +type priority = [ + `Emerg | `Alert | `Crit | `Err | `Warning | `Notice | `Info | `Debug +] + +let int_of_priority = function + | `Emerg -> 0 + | `Alert -> 1 + | `Crit -> 2 + | `Err -> 3 + | `Warning -> 4 + | `Notice -> 5 + | `Info -> 6 + | `Debug -> 7 + +let string_of_priority = function + | `Emerg -> "EMERGENCY" + | `Alert -> "ALERT" + | `Crit -> "CRITICAL" + | `Err -> "ERROR" + | `Warning -> "WARNING" + | `Notice -> "NOTICE" + | `Info -> "INFO" + | `Debug -> "DEBUG" + +class sysLogger ?(level: priority = `Notice) ?(outchan = stderr) () = + object (self) + val level_no = int_of_priority level + val mutable enabled = false + method level = level + method levelNo = level_no + method enable = enabled <- true + method disable = enabled <- false + method log (prio: priority) msg = + let tm = Unix.localtime (Unix.time ()) in + if enabled && (int_of_priority prio <= level_no) then begin + fprintf outchan ("[UWOBO %02d/%02d/%4d %02d:%02d:%02d] %s: %s\n") + tm.Unix.tm_mday (tm.Unix.tm_mon + 1) (tm.Unix.tm_year + 1900) + tm.Unix.tm_hour tm.Unix.tm_min tm.Unix.tm_sec + (string_of_priority prio) msg; + flush outchan + end + end + +type lineType = + | Line of string (** normal line *) + | LineBold of string (** bold line *) + | LineEmph of string (** emph line *) +;; + + (** non thread safe, a processingLogger is usually instantied locally for each + thread *) +class processingLogger = + let html_escape = Netencoding.Html.encode ~in_enc:`Enc_iso88591 () in + let html_of_line = function + | Line l -> html_escape l + | LineBold l -> "" ^ html_escape l ^ "" + | LineEmph l -> "" ^ html_escape l ^ "" + in + let text_of_line = function + | Line l -> l + | LineBold l -> l + | LineEmph l -> l + in + fun () -> + object + val mutable log_lines = [] + method log msg = log_lines <- Line msg :: log_lines + method logBold msg = log_lines <- LineBold msg :: log_lines + method logEmph msg = log_lines <- LineEmph msg :: log_lines + method asText = + String.concat "\n" (List.rev (List.map text_of_line log_lines)) + method asHtml = + sprintf + "\n%s\n" + (String.concat "
\n" (List.map html_of_line (List.rev log_lines))) + end + diff --git a/daemons/uwobo/uwobo_logger.mli b/daemons/uwobo/uwobo_logger.mli new file mode 100644 index 000000000..2a1a6cd53 --- /dev/null +++ b/daemons/uwobo/uwobo_logger.mli @@ -0,0 +1,69 @@ +(* + * Copyright (C) 2003: + * Stefano Zacchiroli + * for the HELM Team http://helm.cs.unibo.it/ + * + * This file is part of HELM, an Hypertextual, Electronic + * Library of Mathematics, developed at the Computer Science + * Department, University of Bologna, Italy. + * + * HELM is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * HELM is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with HELM; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + * For details, see the HELM World-Wide-Web page, + * http://helm.cs.unibo.it/ + *) + +type priority = [ + | `Emerg (* system is unusable *) + | `Alert (* action must be taken immediately *) + | `Crit (* critical conditions *) + | `Err (* error conditions *) + | `Warning (* warning conditions *) + | `Notice (* normal, but significant, condition *) + | `Info (* informational message *) + | `Debug (* debug-level message *) +] + + (** + Warning: logging is disabled by default, you have to invoke #enable method + before being able to log anything. + @param level minimum level of priority that will be reported, msg with + priority less than this will be ignored + @param outchan output channel on which output log messages *) +class sysLogger: + ?level: priority -> ?outchan: out_channel -> + unit -> + object + method level: priority + method levelNo: int + (** enable logging, by default logging is disabled *) + method enable: unit + (** disable logging *) + method disable: unit + (** log a message *) + method log: priority -> string -> unit + end + +class processingLogger: + unit -> + object + method log: string -> unit + method logBold: string -> unit + method logEmph: string -> unit + method asText: string + method asHtml: string + end + diff --git a/daemons/uwobo/uwobo_profiles.ml b/daemons/uwobo/uwobo_profiles.ml new file mode 100644 index 000000000..bd6e919f9 --- /dev/null +++ b/daemons/uwobo/uwobo_profiles.ml @@ -0,0 +1,151 @@ +(* + * Copyright (C) 2004: + * Stefano Zacchiroli + * for the HELM Team http://helm.cs.unibo.it/ + * + * This file is part of HELM, an Hypertextual, Electronic + * Library of Mathematics, developed at the Computer Science + * Department, University of Bologna, Italy. + * + * HELM is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * HELM is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with HELM; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + * For details, see the HELM World-Wide-Web page, + * http://helm.cs.unibo.it/ + *) + +type profile_id = string + +let profiles = "profiles" + +let profile_key pid = + profiles ^ "." ^ pid + +let string_of_permission = + function + `Read -> "read" + | `Write -> "write" + | `Admin -> "admin" + +let permission_key for_what pid = + profile_key pid ^ ".permissions." ^ (string_of_permission for_what) + +let read_permission_key = permission_key `Read +let write_permission_key = permission_key `Write +let admin_permission_key = permission_key `Admin + +let password_key pid = + profile_key pid ^ ".password" + +let params_key pid = + profile_key pid ^ ".params" + +let param_key pid param = + params_key pid ^ "." ^ param + +exception Access_denied of string * profile_id +exception Profile_exists of profile_id +exception Impossible + +let new_key () = + let hex_of_nibble n = + if n >= 0 && n < 10 then + string_of_int n + else if n >= 10 && n < 16 then + String.make 1 (Char.chr (n - 10 + (Char.code 'A'))) + else + raise Impossible + in + let rec aux s = + function + 0 -> s + | n -> aux ((hex_of_nibble (Random.int 16)) ^ s) (n - 1) + in + aux "" 4 + +let create_fresh_id = + let rec aux () = + let key = new_key () in + if Helm_registry.has (read_permission_key key) then + aux () + else + key + in + aux + +let list () = fst (Helm_registry.ls profiles) + +let to_list_rel ~prefix () = + List.map (fun (key,value) -> Pcre.replace ~pat:("^" ^ Pcre.quote (prefix ^ ".")) key, value) + (Helm_registry.to_list ~prefix ()) + +let check_permission pid password for_what = + match password, Helm_registry.get_bool (permission_key for_what pid) with + _, true -> () + | Some pwd, false + when Some pwd = Helm_registry.get_opt Helm_registry.string (password_key pid) -> () + | _ -> raise (Access_denied (string_of_permission for_what, pid)) + +let create ?id ?clone ?clone_password ?(read_perm=true) ?(write_perm=true) ?(admin_perm=true) ?password () = + let pid = + match id with + None -> create_fresh_id () + | Some pid when Helm_registry.has (read_permission_key pid) -> raise (Profile_exists pid) + | Some pid -> pid + in + let params = + match clone with + None -> [] + | Some pid -> + check_permission pid clone_password `Read ; + to_list_rel ~prefix:(params_key pid) () + in + List.iter (fun (key, value) -> Helm_registry.set_string (params_key pid ^ "." ^ key) value) params ; + Helm_registry.set_bool (read_permission_key pid) read_perm ; + Helm_registry.set_bool (write_permission_key pid) write_perm ; + Helm_registry.set_bool (admin_permission_key pid) admin_perm ; + Helm_registry.set_opt Helm_registry.of_string (password_key pid) password ; + pid + +let remove pid ?password () = + check_permission pid password `Admin ; + List.iter (fun (key, _) -> Helm_registry.unset key) (Helm_registry.to_list ~prefix:(profile_key pid) ()) + +let get_params pid ?password () = + check_permission pid password `Read ; + to_list_rel ~prefix:(params_key pid) () + +let set_param pid ?password ~key ~value () = + check_permission pid password `Write ; + match value with + Some value' -> Helm_registry.set (param_key pid key) value' + | None -> Helm_registry.unset (param_key pid key) + +let get_param pid ?password ~key () = + check_permission pid password `Read ; + Helm_registry.get (param_key pid key) + +let set_password pid ?old_password new_password = + check_permission pid old_password `Admin ; + Helm_registry.set_opt Helm_registry.of_string (password_key pid) new_password + +let set_permission pid ?password for_what value = + check_permission pid password `Admin ; + Helm_registry.set_bool (permission_key for_what pid) value + +let get_permission pid ?password for_what = + check_permission pid password `Admin ; + Helm_registry.get_bool (permission_key for_what pid) + diff --git a/daemons/uwobo/uwobo_profiles.mli b/daemons/uwobo/uwobo_profiles.mli new file mode 100644 index 000000000..fc0798f14 --- /dev/null +++ b/daemons/uwobo/uwobo_profiles.mli @@ -0,0 +1,56 @@ +(* + * Copyright (C) 2004: + * Stefano Zacchiroli + * for the HELM Team http://helm.cs.unibo.it/ + * + * This file is part of HELM, an Hypertextual, Electronic + * Library of Mathematics, developed at the Computer Science + * Department, University of Bologna, Italy. + * + * HELM is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * HELM is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with HELM; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + * For details, see the HELM World-Wide-Web page, + * http://helm.cs.unibo.it/ + *) + +type profile_id = string + +exception Access_denied of string * profile_id +exception Profile_exists of profile_id + +val list : unit -> string list +val create : + ?id:profile_id -> + ?clone:profile_id -> + ?clone_password:string -> + ?read_perm:bool -> + ?write_perm:bool -> + ?admin_perm:bool -> ?password:string -> unit -> profile_id +val remove : profile_id -> ?password:string -> unit -> unit +val get_params : profile_id -> ?password:string -> unit -> (string * string) list +val set_param : + profile_id -> + ?password:string -> key:string -> value:(string option) -> unit -> unit +val get_param : + profile_id -> ?password:string -> key:string -> unit -> string +val set_password : + profile_id -> ?old_password:string -> string option -> unit +val set_permission : + profile_id -> + ?password:string -> [ `Admin | `Read | `Write ] -> bool -> unit +val get_permission : + profile_id -> ?password:string -> [ `Admin | `Read | `Write ] -> bool + diff --git a/daemons/uwobo/uwobo_styles.ml b/daemons/uwobo/uwobo_styles.ml new file mode 100644 index 000000000..7730857ac --- /dev/null +++ b/daemons/uwobo/uwobo_styles.ml @@ -0,0 +1,208 @@ +(* + * Copyright (C) 2003: + * Stefano Zacchiroli + * for the HELM Team http://helm.cs.unibo.it/ + * + * This file is part of HELM, an Hypertextual, Electronic + * Library of Mathematics, developed at the Computer Science + * Department, University of Bologna, Italy. + * + * HELM is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * HELM is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with HELM; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + * For details, see the HELM World-Wide-Web page, + * http://helm.cs.unibo.it/ + *) + +open Printf;; +open Uwobo_common;; + +exception Stylesheet_not_found of string ;; +exception Stylesheet_already_in of string ;; +exception Unsupported_property of string;; + +let xslNS = Gdome.domString "http://www.w3.org/1999/XSL/Transform" +let outputS = Gdome.domString "output" +let q_outputS = Gdome.domString "xsl:output" + +let default_properties = [] (* no default properties *) + + (** apply an output property to an xslt stylesheet *) +let apply_property logger (element: Gdome.element) (name, value) = + if Uwobo_common.is_supported_property name then begin + logger#log `Debug (sprintf "Setting property: %s = %s" name value); + element#setAttribute (Gdome.domString name) (Gdome.domString value) + end else + raise (Unsupported_property name) + + (** set a list of output properties in an xslt stylesheet, return a copy of + the given stylesheet modified as needed, given stylesheet wont be changed by + this operation. + Before applying "props" properties applies a set of default properties as + defined in "default_properties" *) +let apply_properties logger last_stylesheet props = + let last_stylesheet = + new Gdome.document_of_node (last_stylesheet#cloneNode ~deep:true) + in + let output_element = + let node_list = last_stylesheet#getElementsByTagNameNS xslNS outputS in + (match node_list#item 0 with + | None -> (* no xsl:output element, create it from scratch *) + logger#log `Debug "Creating xsl:output node ..."; + let elt = last_stylesheet#createElementNS (Some xslNS) q_outputS in + let root = last_stylesheet#get_documentElement in + ignore (root#appendChild (elt :> Gdome.node)); + elt + | Some node -> new Gdome.element_of_node node) + in + List.iter + (apply_property logger (output_element :> Gdome.element)) + (default_properties @ props); + last_stylesheet + +class styles = + object (self) + (* INVARIANT: 'stylesheets' and 'uris' are in sync *) + + (** association list: key * props -> I_gdome_xslt.processed_stylesheet + It is the cache of the processed stylesheets *) + val mutable p_stylesheets = [] + val mutable stylesheets = [] (** association list: key -> Gdome.document *) + val mutable uris = [] (** association list: key -> uri *) + + val domImpl = Gdome.domImplementation () + + (** process an XSLT stylesheet *) + method private process uri = + let dom = domImpl#createDocumentFromURI ~uri () in + dom, Gdome_xslt.processStylesheet dom (* produce libXSLT messages in + case of errors *) + + (* stylesheets management *) + + method add key uri = + if (List.mem_assoc key uris) then + raise (Stylesheet_already_in key) + else begin + uris <- (key, uri) :: uris; + let stylesheet, p_stylesheet = self#process uri in + stylesheets <- (key, stylesheet) :: stylesheets ; + p_stylesheets <- ((key,[]), p_stylesheet) :: p_stylesheets ; + end + + method remove key = + if not (List.mem_assoc key uris) then + raise (Stylesheet_not_found key) + else begin + uris <- List.remove_assoc key uris; + stylesheets <- List.remove_assoc key stylesheets ; + p_stylesheets <- + List.filter (function ((key',_),_) -> key = key') p_stylesheets + end + + method removeAll = + uris <- []; + stylesheets <- []; + p_stylesheets <- [] + + method reload key = + (try + let uri = List.assoc key uris in + let stylesheet,p_stylesheet = self#process uri in + stylesheets <- + (key, stylesheet) :: (List.remove_assoc key stylesheets) ; + (* we remove the processed stylesheet from the cache *) + p_stylesheets <- + List.filter (function ((key',_),_) -> key = key') p_stylesheets ; + p_stylesheets <- ((key,[]),p_stylesheet)::p_stylesheets + with Not_found -> + raise (Stylesheet_not_found key)) + + method reloadAll = + let (stylesheets',p_stylesheets') = + let processed = + List.map (fun (key, uri) -> (key, self#process uri)) uris + in + List.map (function (key,(stylesheet,_)) -> key,stylesheet) processed, + List.map + (function (key,(_,p_stylesheet)) -> (key,[]),p_stylesheet) processed + in + stylesheets <- stylesheets' ; + p_stylesheets <- p_stylesheets' + + (* stylesheets usage *) + + method keys = List.map fst uris + + method list = + List.map + (fun (key, uri) -> + sprintf "key = %s, uri = %s" key (List.assoc key uris)) + uris + + method get keys props (logger : Uwobo_logger.sysLogger) = + match List.rev keys with + [] -> assert false + | last_key::rev_keys -> + let last_stylesheet = + try + List.assoc last_key stylesheets + with Not_found -> raise (Stylesheet_not_found last_key) + in + let p_last_stylesheet = + try + List.assoc (last_key,props) p_stylesheets + with + Not_found -> + (* Cache miss *) + let last_stylesheet' = + try + apply_properties logger last_stylesheet props + with Unsupported_property prop -> + raise (Uwobo_failure (sprintf "Unsupported property: %s" prop)) + in + let p_last_stylesheet = + Gdome_xslt.processStylesheet last_stylesheet + in + p_stylesheets <- + ((last_key,props),p_last_stylesheet)::p_stylesheets ; + p_last_stylesheet + in + let p_stylesheets = + List.fold_left + (fun collected_styles key -> + let p_stylesheet = + try + List.assoc (key,[]) p_stylesheets + with + Not_found -> + (* Cache miss *) + let stylesheet = + try + List.assoc key stylesheets + with Not_found -> raise (Stylesheet_not_found key) + in + let p_stylesheet = + Gdome_xslt.processStylesheet stylesheet + in + p_stylesheets <- ((key,[]),p_stylesheet)::p_stylesheets ; + p_stylesheet + in + (key,p_stylesheet)::collected_styles) + [last_key,p_last_stylesheet] + rev_keys + in + p_stylesheets, last_stylesheet + end diff --git a/daemons/uwobo/uwobo_styles.mli b/daemons/uwobo/uwobo_styles.mli new file mode 100644 index 000000000..95af2a484 --- /dev/null +++ b/daemons/uwobo/uwobo_styles.mli @@ -0,0 +1,84 @@ +(* + * Copyright (C) 2003: + * Stefano Zacchiroli + * for the HELM Team http://helm.cs.unibo.it/ + * + * This file is part of HELM, an Hypertextual, Electronic + * Library of Mathematics, developed at the Computer Science + * Department, University of Bologna, Italy. + * + * HELM is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * HELM is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with HELM; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + * For details, see the HELM World-Wide-Web page, + * http://helm.cs.unibo.it/ + *) + +open Uwobo_common ;; + +exception Stylesheet_not_found of string ;; +exception Stylesheet_already_in of string ;; + + (** hold UWOBO styles at runtime *) +class styles: + object + + (** {2 Stylesheets management} *) + + (** add a stylesheet, bound to a given key, to the UWOBO loaded + stylesheets + @param key key to which the stylesheets will be bound + @param uri uri of the stylesheet to be loaded + @raise Stylesheet_already_in if key is already bound *) + method add: string -> string -> unit + + (** remove the stylesheet bound to a given key *) + method remove: string -> unit + + (** remove all loaded stylesheet *) + method removeAll: unit + + (** reload the stylesheet bound to a given key *) + method reload: string -> unit + + (** reload all stylesheets *) + method reloadAll: unit + + (** {2 Stylesheets usage} *) + + (** @return the list of currently loaded stylesheets' keys *) + method keys: string list + + (** @return a list of strings, each string is a textual representation of + information related to a loaded stylesheet. This representation includes + at least stylesheet's key and URI *) + method list: string list + + (** + @param key_list non empty list of keys + @param props list of prop + @param logger the logger to be used to report errors and warnings + @return a pair. The first argument of the pair is an association list + that maps given keys to gdome2-xslt processed stylesheets. The last + stylesheet xsl:output element is modified according to the given + properties. The second argument of the pair is the last unprocessed + stylesheet. + *) + method get: + string list -> (string * string) list -> Uwobo_logger.sysLogger -> + (string * I_gdome_xslt.processed_stylesheet) list * Gdome.document + + end + diff --git a/daemons/whelp/.cvsignore b/daemons/whelp/.cvsignore new file mode 100644 index 000000000..6ecb17c4d --- /dev/null +++ b/daemons/whelp/.cvsignore @@ -0,0 +1 @@ +*.cm[ioxa] *.o searchEngine searchEngine.opt diff --git a/daemons/whelp/.depend b/daemons/whelp/.depend new file mode 100644 index 000000000..8b6a29e08 --- /dev/null +++ b/daemons/whelp/.depend @@ -0,0 +1,4 @@ +mooglePp.cmo: mooglePp.cmi +mooglePp.cmx: mooglePp.cmi +searchEngine.cmo: mooglePp.cmi +searchEngine.cmx: mooglePp.cmx diff --git a/daemons/whelp/Makefile b/daemons/whelp/Makefile new file mode 100644 index 000000000..2ae59df91 --- /dev/null +++ b/daemons/whelp/Makefile @@ -0,0 +1,45 @@ +REQUIRES = http helm-cic_textual_parser2 helm-logger helm-tactics +OCAMLOPTIONS = -thread -package "$(REQUIRES)" -pp camlp4o +OCAMLC = ocamlfind ocamlc $(OCAMLOPTIONS) +OCAMLOPT = ocamlfind ocamlopt $(OCAMLOPTIONS) +OCAMLDEP = ocamlfind ocamldep -package "$(REQUIRES)" -pp camlp4o + +MODULES = mooglePp +SRCS = $(patsubst %,%.ml,$(MODULES)) $(patsubst %,%.mli,$(MODULES)) \ + searchEngine.ml +CMOS = $(patsubst %,%.cmo,$(MODULES)) +CMXS = $(patsubst %,%.cmx,$(MODULES)) + +all: byte html +world: byte opt +byte: searchEngine +opt: searchEngine.opt html + +.PHONY: html +html: + make -C html/ + +%.cmi: %.mli + $(OCAMLC) -c $< +%.cmo %.cmi: %.ml + $(OCAMLC) -c $< +%.cmx: %.ml + $(OCAMLOPT) -c $< + +searchEngine: $(CMOS) searchEngine.ml + $(OCAMLC) -linkpkg -o $@ $^ +searchEngine.opt: $(CMXS) searchEngine.ml + $(OCAMLOPT) -linkpkg -o $@ $^ + +clean: + make -C html/ clean + rm -f *.cm[aiox] *.o searchEngine{,.opt} + +.PHONY: depend +depend: + $(OCAMLDEP) $(SRCS) > .depend + +.PHONY: all opt clean + +include .depend + diff --git a/daemons/whelp/html/Makefile b/daemons/whelp/html/Makefile new file mode 100644 index 000000000..03a653f93 --- /dev/null +++ b/daemons/whelp/html/Makefile @@ -0,0 +1,7 @@ +INC_STYLESHEET = includes.xsl +TARGETS = moogle.html moogle_chat.html +all: $(TARGETS) +clean: + rm -f $(TARGETS) +%.html: %.html.src *.src + xsltproc $(INC_STYLESHEET) $< > $@ diff --git a/daemons/whelp/html/includes.xsl b/daemons/whelp/html/includes.xsl new file mode 100644 index 000000000..bc2497d23 --- /dev/null +++ b/daemons/whelp/html/includes.xsl @@ -0,0 +1,15 @@ + + + + + + + + + + + diff --git a/daemons/whelp/html/manual/alias.jpg b/daemons/whelp/html/manual/alias.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0f57638e26c7d3d5e5c872696d4de009c131567f GIT binary patch literal 29673 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 literal 0 HcmV?d00001 diff --git a/daemons/whelp/html/manual/ex1.jpg b/daemons/whelp/html/manual/ex1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8e75c08e255feec980d69f5eb89f9442c7f747eb GIT binary patch literal 23989 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 T{Rv*~d0FBQP=W%Fe^UPk8K0H| literal 0 HcmV?d00001 diff --git a/daemons/whelp/html/manual/frames.jpg b/daemons/whelp/html/manual/frames.jpg new file mode 100644 index 0000000000000000000000000000000000000000..994b7ae5e32a68ea7171071c4fb13adc1a13d222 GIT binary patch literal 44022 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 literal 0 HcmV?d00001 diff --git a/daemons/whelp/html/manual/index.html b/daemons/whelp/html/manual/index.html new file mode 100644 index 000000000..8efa276fc --- /dev/null +++ b/daemons/whelp/html/manual/index.html @@ -0,0 +1,40 @@ + + +Search Engine Interface Online Manual + + +

Search Engine Interface Online Manual

+

Index

+1.
Roles of the frames
+2. How to compose a low-level query
+3. How to compose a pre-defined query
+

1. Roles of the frames

+

+The interface is composed by five frames, as you can see below.

+

+Each frame has its own role, in particular:

    +
  • frame 1 contains the query as it is, the frame is refreshed whenever you modify the query.
    +
  • frame 2 contains all the available options for the composition of the query, it's where most of the interaction happens.
    +
  • frame 3 contains the form used for the submission of the query and various buttons to modify it.
    +
  • frame 4 contains the grammar.
    +
  • frame 5 contains online help.
    +
+

+

2. How to compose a low-level query

+

+In order to compose a low-level query, you must click the "compose a query" button in the main page. Here's what you'll get:

  • In frame 1, you have the query in its actual state, so at the beginning the frame is empty. Later, the frame will be updated automatically on every change of the query and will contain hypertextual links in this form: [?<production name><production number>]. Possible names are "set","val" and "bol" and they represent the main productions of MathQL grammar. By clicking on each of these links you'll obtain the visualization of possible options for the corresponding production in frame 2, allowing the sobstitution of the link with what will be selected.
  • Frame 2 contains, in order: the identifier of the production you are choosing (e.g. [?set1] or [?bol3]), an "undo" button, a "redo" button, the options list, a "compose" button to confirm your choice, a "get help" button to know the semantic meaning of the selected option. The options list is composed by various radio buttons, sometimes you'll have only to select one of them while sometimes you'll have to fill input areas with identifiers, paths or other things: anyway, whenever an input area gets the focus, a help about what you can write there will appear in frame 5.
    +
  • Frame 3 contains a textarea with the query, a "submit the query" button, a "restart" button (it will bring you to the main page, erasing you query) and an "apply changes" button to modify the query.
  • Frame 4 contains the MathQL grammar.
  • Frame 5 contains various help messages, whenever an object gets the focus a message will appear there.
+Being "set" the main production of MathQL, at the beginning frame 1 is empty and frame 2 contains the menu for "set". You should choose one option by clicking on its radio button and then press "compose". The interface will perform a syntax check of what you entered and should something be wrong a message will appear, otherwise the query will be updated. Afterwards, the query will appear in frame 1 and in frame 3, and frame 2 will display the menu of the first production found in the new query string. For example, in the picture below you see the interface after the selection of the 10th production inserting "positions" as the requested identifier. As you can see, frame 2 now displays the "val" menu.

+

+Now your options include following the instructions in frame 2, choosing a different production by clicking on a link in frame 1, or manually modifying the query by writing the changes in the textarea in frame 3 and then clicking "apply changes". Obviously "undo" and "redo" buttons will allow you to recover from mistakes; just DON'T use "back","forward" and "refresh" buttons on your browser since they will cause unpredictable errors. Once the query is completed, the "submit the query" button will display the results in frame 2.

+

3. How to compose a pre-defined query

+

+There are actually three pre-defined queries, Locate Object, Search Pattern and Match Conclusion. By clicking on "submit a pre-defined query" in the main page, a small menu with the three options will appear in frame 2.
+Locate Object is very simple, you must enter the name of the object to search in the text box and click "display results".
+Search Pattern, which takes a CIC term and finds theorems which have it as thesis, and Match Conclusion which takes a CIC term and finds theorems which have it as conclusion, have an identical interface, being the only difference in the output. +First thing to do is to insert a list of aliases (you may skip this step since the search engine will ask you later about ambiguous interpretations of your query if you don't know objects names, for example), then you must compose the CIC term. Composing a CIC term is pretty much the same thing as composing a MathQL query, except that the term is usually so short that there is no need for links, undo buttons and the like. While composing the term, you may modify your list of aliases (i.e. add or remove them) anytime by clicking "edit" in the frame 3. When the query is completed, the "submit" button will display the results in frame 2, and the server will ask you to solve ambiguities, thus adding aliases to your list. Once a result is displayed, you may want to submit a different query but keep your aliases; in this case, just click "new expression" in frame 3. The "edit" button will work even in this phase.

+

+

+ + + diff --git a/daemons/whelp/html/moogle.html.src b/daemons/whelp/html/moogle.html.src new file mode 100644 index 000000000..eca23d339 --- /dev/null +++ b/daemons/whelp/html/moogle.html.src @@ -0,0 +1,21 @@ + + + + + + + +
+ @RESULTS@ +
+ + + + + diff --git a/daemons/whelp/html/moogle.png b/daemons/whelp/html/moogle.png new file mode 100644 index 0000000000000000000000000000000000000000..07570d07a9f9771b3afbcc59b4d551e928e5b14a GIT binary patch literal 16808 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 literal 0 HcmV?d00001 diff --git a/daemons/whelp/html/moogle_chat.html.src b/daemons/whelp/html/moogle_chat.html.src new file mode 100644 index 000000000..bda0482d1 --- /dev/null +++ b/daemons/whelp/html/moogle_chat.html.src @@ -0,0 +1,39 @@ + + + + + + +
+

+ Ambiguous input: @EXPRESSION@ +

+

+ Please choose one of the following interpretations: +

+

+ + + + + + + + @INTERPRETATIONS@ +
+ +
+

+
+
+ +
+ + + diff --git a/daemons/whelp/html/moogle_form.html.src b/daemons/whelp/html/moogle_form.html.src new file mode 100644 index 000000000..05eba4cbc --- /dev/null +++ b/daemons/whelp/html/moogle_form.html.src @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + +
+ +
whelp   + + + + + + + +     + + Help
+ Input Syntax +
+
+
+
diff --git a/daemons/whelp/html/moogle_header.html.src b/daemons/whelp/html/moogle_header.html.src new file mode 100644 index 000000000..a788d1f6d --- /dev/null +++ b/daemons/whelp/html/moogle_header.html.src @@ -0,0 +1,45 @@ + + + + Whelp search + + + diff --git a/daemons/whelp/html/moogle_help.html b/daemons/whelp/html/moogle_help.html new file mode 100644 index 000000000..7b2a8bd05 --- /dev/null +++ b/daemons/whelp/html/moogle_help.html @@ -0,0 +1,25 @@ + + + + + + + + + + + + + +
+ whelp +
+

Coming soon!

+
+
+
+ In the meantime have a look at the + Input Syntax page + for syntax and examples. + + diff --git a/daemons/whelp/html/moogle_init.html b/daemons/whelp/html/moogle_init.html new file mode 100644 index 000000000..5260da7b8 --- /dev/null +++ b/daemons/whelp/html/moogle_init.html @@ -0,0 +1,106 @@ + + + +Whelp search + + + + + + + + +
+ + + + + + + + + + + + + + +HINT + +ELIM +LOCATE +PATTERN MATCHING +WOUNDERFUL + + +
+ whelp +
+
+ + + + + + + + + + +
+ +
+ + + + + +
+ + Help
+ Input Syntax +
+
+
+
+ +@RESULTS@ + + + + diff --git a/daemons/whelp/html/moogle_querybar.html.src b/daemons/whelp/html/moogle_querybar.html.src new file mode 100644 index 000000000..7a5110abe --- /dev/null +++ b/daemons/whelp/html/moogle_querybar.html.src @@ -0,0 +1,15 @@ + + +
+ + + + + +
@QUERY_KIND@@QUERY_SUMMARY@
+
+
+
diff --git a/daemons/whelp/html/moogle_small.png b/daemons/whelp/html/moogle_small.png new file mode 100644 index 0000000000000000000000000000000000000000..a387d9a937fcf72480f0ef245c530908f782a798 GIT binary patch literal 7599 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 RIQjqp002ovPDHLkV1oMj;e7xA literal 0 HcmV?d00001 diff --git a/daemons/whelp/html/moogle_syntax.html b/daemons/whelp/html/moogle_syntax.html new file mode 100644 index 000000000..7fa0fe380 --- /dev/null +++ b/daemons/whelp/html/moogle_syntax.html @@ -0,0 +1,98 @@ + + + + + + + + + + + + +
+ whelp +
+

Whelp Input Syntax

+
    +
  • + locate <pattern> +

    + <pattern> is a shell like pattern which could + include * (denoting any sequence of 0 or more characters) + and ? (denoting any single character).
    +

    +

    + Examples: +

      +
    • nat pattern matches + cic:/Coq/Init/Datatypes/nat.ind#xpointer(1/1) only +
    • +
    • n?t pattern matches + cic:/Coq/Init/Datatypes/nat.ind#xpointer(1/1) and + cic:/Coq/Init/Logic/not.con +
    • +
    • nat* pattern matches + cic:/Coq/Init/Datatypes/nat.ind#xpointer(1/1), + cic:/Coq/Init/Peano/nat_case.con and many more +
    • +
    +

    +
  • +
  • + match <term> +

    + Examples: +

      +
    • \forall x,y:nat.x+y=y+x + (commutativity of natural plus) +
    • +
    • \forall x,y,z:R.x*(y+z)=x*y+x*z + (distributivity of real times over real plus) +
    • +
    • nat \to nat \to nat + (all binary functions over naturals) +
    • +
    +

    +
  • +
  • + hint <term> +

    + Examples: +

      +
    • \forall n:nat. (fact n) = n * (fact (n - 1)) + (how could we prove n! = (n-1)! * n ?) +
    • +
    • \forall n:nat.n \lt n+5 + (how could we prove n < n + 5 ?) +
    • +
    • \forall x,y:nat. x*y \lt (S x)*(S y) + (how could we prove x*y < (x+1)*(y+1) ?) +
    • +
    +

    +
  • +
  • + elim <identifier> +

    + Examples: +

      +
    • nat + (induction/elimination principles over natural numbers) +
    • +
    • list + (induction/elimination principles over lists) +
    • +
    +

    +
  • +
+
+ + diff --git a/daemons/whelp/html/moogle_trailer.html.src b/daemons/whelp/html/moogle_trailer.html.src new file mode 100644 index 000000000..be349ba52 --- /dev/null +++ b/daemons/whelp/html/moogle_trailer.html.src @@ -0,0 +1,9 @@ + + +
+ @PAGES@: @PREV_LINK@ @PAGELIST@ @NEXT_LINK@ +
+
diff --git a/daemons/whelp/html/whelp.png b/daemons/whelp/html/whelp.png new file mode 100644 index 0000000000000000000000000000000000000000..8e36ced3f916bc4a11e8e991e781e35d56964727 GIT binary patch literal 12096 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 q*O`wR&=SD&C + + + + + + + + image/svg+xml + + + + + + + + h + + e + + l + + p + + W + + + diff --git a/daemons/whelp/html/whelp_small.png b/daemons/whelp/html/whelp_small.png new file mode 100644 index 0000000000000000000000000000000000000000..10c61589090731ec64cff94dd812a24c3c936a92 GIT binary patch literal 3092 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: %s
" title msg + +let paginate ~size ~page l = + let min = 1 + (page-1) * size in + let max = page * size in + let rec aux i l = + match (i, l) with + | _, [] -> [] + | i, hd :: tl when i < min -> aux (i+1) tl + | i, hd :: tl when i >= min && i <= max -> hd :: aux (i+1) tl + | i, hd :: tl -> [] + in + assert (size > 0 && page > 0); + aux 1 l + + (** pretty print a list of URIs to an HELM theory file *) +let theory_of_result page result = + let results_per_page = + Helm_registry.get_int "search_engine.results_per_page" + in + let results_no = List.length result in + let buffer = Buffer.create (200 * results_no) in + let result = paginate ~size:results_per_page ~page result in + if results_no > 0 then + let mode = "typeonly" in + let output_results () = + let idx = ref ((page - 1) * results_per_page) in + List.iter + (fun uri -> + incr idx; + Printf.bprintf buffer + " + %d. + %s + + + + + " + !idx uri uri mode) result ; + in + let summary = + sprintf "%d result%s found" + results_no (if results_no > 1 then "s" else "") + in + begin + Buffer.add_string buffer + ""; + output_results (); + Buffer.add_string buffer "
"; + (summary, Buffer.contents buffer) + end + else + ("no results found", "") + +let html_of_interpretations interps = + let choice_of_interp interp = + sprintf "\n%s\n
" + (String.concat "\n" + (List.map + (fun (k, v) -> + sprintf "%s%s" k v) + interp)) + in + let interp_no = ref ~-1 in + sprintf "\n%s\n
" + (String.concat "\n" + (List.map + (fun interp -> + sprintf " + + + + %s + " + (incr interp_no; !interp_no) + (choice_of_interp interp)) + interps)) + diff --git a/daemons/whelp/mooglePp.mli b/daemons/whelp/mooglePp.mli new file mode 100644 index 000000000..f3e2e5952 --- /dev/null +++ b/daemons/whelp/mooglePp.mli @@ -0,0 +1,35 @@ +(* Copyright (C) 2002-2005, HELM Team. + * + * This file is part of HELM, an Hypertextual, Electronic + * Library of Mathematics, developed at the Computer Science + * Department, University of Bologna, Italy. + * + * HELM is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * HELM is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with HELM; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + * For details, see the HELM World-Wide-Web page, + * http://cs.unibo.it/helm/. + *) + +val pp_error : string -> string -> string + +(** @param page page number + * @param results query results + * @return a pair of suitable instantiations for + * QUERY_SUMMARY and QUERY_RESULTS tag in moogle's main template *) +val theory_of_result : int -> string list -> string * string + +val html_of_interpretations: (string * string) list list -> string + diff --git a/daemons/whelp/preloaded_uris.txt b/daemons/whelp/preloaded_uris.txt new file mode 100644 index 000000000..be1cea194 --- /dev/null +++ b/daemons/whelp/preloaded_uris.txt @@ -0,0 +1,4130 @@ +cic:/Coq/Arith/Between/P_nth_ind.con +cic:/Coq/Arith/Between/bet_eq.con +cic:/Coq/Arith/Between/between_Sk_l.con +cic:/Coq/Arith/Between/between_in_int.con +cic:/Coq/Arith/Between/between_ind.con +cic:/Coq/Arith/Between/between_le.con +cic:/Coq/Arith/Between/between_not_exists.con +cic:/Coq/Arith/Between/between_or_exists.con +cic:/Coq/Arith/Between/between_restr.con +cic:/Coq/Arith/Between/event_O.con +cic:/Coq/Arith/Between/eventually.con +cic:/Coq/Arith/Between/exists_S_le.con +cic:/Coq/Arith/Between/exists_between_ind.con +cic:/Coq/Arith/Between/exists_in_int.con +cic:/Coq/Arith/Between/exists_le_S.con +cic:/Coq/Arith/Between/exists_lt.con +cic:/Coq/Arith/Between/in_int.con +cic:/Coq/Arith/Between/in_int_S.con +cic:/Coq/Arith/Between/in_int_Sp_q.con +cic:/Coq/Arith/Between/in_int_between.con +cic:/Coq/Arith/Between/in_int_exists.con +cic:/Coq/Arith/Between/in_int_intro.con +cic:/Coq/Arith/Between/in_int_lt.con +cic:/Coq/Arith/Between/in_int_p_Sq.con +cic:/Coq/Arith/Between/nth_le.con +cic:/Coq/Arith/Bool_nat/lt_ge_dec.con +cic:/Coq/Arith/Bool_nat/nat_eq_bool.con +cic:/Coq/Arith/Bool_nat/nat_ge_lt_bool.con +cic:/Coq/Arith/Bool_nat/nat_gt_le_bool.con +cic:/Coq/Arith/Bool_nat/nat_le_gt_bool.con +cic:/Coq/Arith/Bool_nat/nat_lt_ge_bool.con +cic:/Coq/Arith/Bool_nat/nat_noteq_bool.con +cic:/Coq/Arith/Bool_nat/notzerop.con +cic:/Coq/Arith/Bool_nat/notzerop_bool.con +cic:/Coq/Arith/Bool_nat/zerop_bool.con +cic:/Coq/Arith/Compare/Pcompare.con +cic:/Coq/Arith/Compare/discrete_nat.con +cic:/Coq/Arith/Compare/le_dec.con +cic:/Coq/Arith/Compare/le_decide.con +cic:/Coq/Arith/Compare/le_le_S_eq.con +cic:/Coq/Arith/Compare/le_or_le_S.con +cic:/Coq/Arith/Compare/lt_or_eq.con +cic:/Coq/Arith/Compare_dec/dec_ge.con +cic:/Coq/Arith/Compare_dec/dec_gt.con +cic:/Coq/Arith/Compare_dec/dec_le.con +cic:/Coq/Arith/Compare_dec/dec_lt.con +cic:/Coq/Arith/Compare_dec/gt_eq_gt_dec.con +cic:/Coq/Arith/Compare_dec/le_ge_dec.con +cic:/Coq/Arith/Compare_dec/le_gt_dec.con +cic:/Coq/Arith/Compare_dec/le_le_S_dec.con +cic:/Coq/Arith/Compare_dec/le_lt_dec.con +cic:/Coq/Arith/Compare_dec/le_lt_eq_dec.con +cic:/Coq/Arith/Compare_dec/lt_eq_lt_dec.con +cic:/Coq/Arith/Compare_dec/not_eq.con +cic:/Coq/Arith/Compare_dec/not_ge.con +cic:/Coq/Arith/Compare_dec/not_gt.con +cic:/Coq/Arith/Compare_dec/not_le.con +cic:/Coq/Arith/Compare_dec/not_lt.con +cic:/Coq/Arith/Compare_dec/zerop.con +cic:/Coq/Arith/Div2/div2.con +cic:/Coq/Arith/Div2/div2_even.con +cic:/Coq/Arith/Div2/div2_odd.con +cic:/Coq/Arith/Div2/double.con +cic:/Coq/Arith/Div2/double_S.con +cic:/Coq/Arith/Div2/double_even.con +cic:/Coq/Arith/Div2/double_odd.con +cic:/Coq/Arith/Div2/double_plus.con +cic:/Coq/Arith/Div2/even_2n.con +cic:/Coq/Arith/Div2/even_div2.con +cic:/Coq/Arith/Div2/even_double.con +cic:/Coq/Arith/Div2/even_odd_div2.con +cic:/Coq/Arith/Div2/even_odd_double.con +cic:/Coq/Arith/Div2/ind_0_1_SS.con +cic:/Coq/Arith/Div2/lt_div2.con +cic:/Coq/Arith/Div2/odd_S2n.con +cic:/Coq/Arith/Div2/odd_div2.con +cic:/Coq/Arith/Div2/odd_double.con +cic:/Coq/Arith/EqNat/beq_nat.con +cic:/Coq/Arith/EqNat/beq_nat_eq.con +cic:/Coq/Arith/EqNat/beq_nat_refl.con +cic:/Coq/Arith/EqNat/eq_eq_nat.con +cic:/Coq/Arith/EqNat/eq_nat.con +cic:/Coq/Arith/EqNat/eq_nat_decide.con +cic:/Coq/Arith/EqNat/eq_nat_elim.con +cic:/Coq/Arith/EqNat/eq_nat_eq.con +cic:/Coq/Arith/EqNat/eq_nat_refl.con +cic:/Coq/Arith/Euclid/diveucl_ind.con +cic:/Coq/Arith/Euclid/diveucl_rec.con +cic:/Coq/Arith/Euclid/diveucl_rect.con +cic:/Coq/Arith/Euclid/eucl_dev.con +cic:/Coq/Arith/Euclid/modulo.con +cic:/Coq/Arith/Euclid/quotient.con +cic:/Coq/Arith/Even/even_even_plus.con +cic:/Coq/Arith/Even/even_ind.con +cic:/Coq/Arith/Even/even_mult_aux.con +cic:/Coq/Arith/Even/even_mult_inv_l.con +cic:/Coq/Arith/Even/even_mult_inv_r.con +cic:/Coq/Arith/Even/even_mult_l.con +cic:/Coq/Arith/Even/even_mult_r.con +cic:/Coq/Arith/Even/even_odd_dec.con +cic:/Coq/Arith/Even/even_or_odd.con +cic:/Coq/Arith/Even/even_plus_aux.con +cic:/Coq/Arith/Even/even_plus_even_inv_l.con +cic:/Coq/Arith/Even/even_plus_even_inv_r.con +cic:/Coq/Arith/Even/even_plus_odd_inv_l.con +cic:/Coq/Arith/Even/even_plus_odd_inv_r.con +cic:/Coq/Arith/Even/not_even_and_odd.con +cic:/Coq/Arith/Even/odd_even_plus.con +cic:/Coq/Arith/Even/odd_ind.con +cic:/Coq/Arith/Even/odd_mult.con +cic:/Coq/Arith/Even/odd_mult_inv_l.con +cic:/Coq/Arith/Even/odd_mult_inv_r.con +cic:/Coq/Arith/Even/odd_plus_even_inv_l.con +cic:/Coq/Arith/Even/odd_plus_even_inv_r.con +cic:/Coq/Arith/Even/odd_plus_l.con +cic:/Coq/Arith/Even/odd_plus_odd_inv_l.con +cic:/Coq/Arith/Even/odd_plus_odd_inv_r.con +cic:/Coq/Arith/Even/odd_plus_r.con +cic:/Coq/Arith/Factorial/fact.con +cic:/Coq/Arith/Factorial/fact_le.con +cic:/Coq/Arith/Factorial/fact_neq_0.con +cic:/Coq/Arith/Factorial/lt_O_fact.con +cic:/Coq/Arith/Gt/gt_O_eq.con +cic:/Coq/Arith/Gt/gt_S.con +cic:/Coq/Arith/Gt/gt_S_le.con +cic:/Coq/Arith/Gt/gt_S_n.con +cic:/Coq/Arith/Gt/gt_Sn_O.con +cic:/Coq/Arith/Gt/gt_Sn_n.con +cic:/Coq/Arith/Gt/gt_asym.con +cic:/Coq/Arith/Gt/gt_irrefl.con +cic:/Coq/Arith/Gt/gt_le_S.con +cic:/Coq/Arith/Gt/gt_le_trans.con +cic:/Coq/Arith/Gt/gt_n_S.con +cic:/Coq/Arith/Gt/gt_not_le.con +cic:/Coq/Arith/Gt/gt_pred.con +cic:/Coq/Arith/Gt/gt_trans.con +cic:/Coq/Arith/Gt/gt_trans_S.con +cic:/Coq/Arith/Gt/le_S_gt.con +cic:/Coq/Arith/Gt/le_gt_S.con +cic:/Coq/Arith/Gt/le_gt_trans.con +cic:/Coq/Arith/Gt/le_not_gt.con +cic:/Coq/Arith/Gt/plus_gt_compat_l.con +cic:/Coq/Arith/Gt/plus_gt_reg_l.con +cic:/Coq/Arith/Le/le_O_n.con +cic:/Coq/Arith/Le/le_S_n.con +cic:/Coq/Arith/Le/le_Sn_O.con +cic:/Coq/Arith/Le/le_Sn_le.con +cic:/Coq/Arith/Le/le_Sn_n.con +cic:/Coq/Arith/Le/le_antisym.con +cic:/Coq/Arith/Le/le_elim_rel.con +cic:/Coq/Arith/Le/le_n_O_eq.con +cic:/Coq/Arith/Le/le_n_S.con +cic:/Coq/Arith/Le/le_n_Sn.con +cic:/Coq/Arith/Le/le_pred.con +cic:/Coq/Arith/Le/le_pred_n.con +cic:/Coq/Arith/Le/le_refl.con +cic:/Coq/Arith/Le/le_trans.con +cic:/Coq/Arith/Lt/S_pred.con +cic:/Coq/Arith/Lt/le_lt_n_Sm.con +cic:/Coq/Arith/Lt/le_lt_or_eq.con +cic:/Coq/Arith/Lt/le_lt_trans.con +cic:/Coq/Arith/Lt/le_not_lt.con +cic:/Coq/Arith/Lt/le_or_lt.con +cic:/Coq/Arith/Lt/lt_O_Sn.con +cic:/Coq/Arith/Lt/lt_O_neq.con +cic:/Coq/Arith/Lt/lt_S.con +cic:/Coq/Arith/Lt/lt_S_n.con +cic:/Coq/Arith/Lt/lt_asym.con +cic:/Coq/Arith/Lt/lt_irrefl.con +cic:/Coq/Arith/Lt/lt_le_S.con +cic:/Coq/Arith/Lt/lt_le_trans.con +cic:/Coq/Arith/Lt/lt_le_weak.con +cic:/Coq/Arith/Lt/lt_n_O.con +cic:/Coq/Arith/Lt/lt_n_S.con +cic:/Coq/Arith/Lt/lt_n_Sm_le.con +cic:/Coq/Arith/Lt/lt_n_Sn.con +cic:/Coq/Arith/Lt/lt_not_le.con +cic:/Coq/Arith/Lt/lt_pred.con +cic:/Coq/Arith/Lt/lt_pred_n_n.con +cic:/Coq/Arith/Lt/lt_trans.con +cic:/Coq/Arith/Lt/nat_total_order.con +cic:/Coq/Arith/Lt/neq_O_lt.con +cic:/Coq/Arith/Max/le_max_l.con +cic:/Coq/Arith/Max/le_max_r.con +cic:/Coq/Arith/Max/max.con +cic:/Coq/Arith/Max/max_SS.con +cic:/Coq/Arith/Max/max_case.con +cic:/Coq/Arith/Max/max_case2.con +cic:/Coq/Arith/Max/max_comm.con +cic:/Coq/Arith/Max/max_dec.con +cic:/Coq/Arith/Max/max_l.con +cic:/Coq/Arith/Max/max_r.con +cic:/Coq/Arith/Min/le_min_l.con +cic:/Coq/Arith/Min/le_min_r.con +cic:/Coq/Arith/Min/min.con +cic:/Coq/Arith/Min/min_SS.con +cic:/Coq/Arith/Min/min_case.con +cic:/Coq/Arith/Min/min_case2.con +cic:/Coq/Arith/Min/min_comm.con +cic:/Coq/Arith/Min/min_dec.con +cic:/Coq/Arith/Min/min_l.con +cic:/Coq/Arith/Min/min_r.con +cic:/Coq/Arith/Minus/le_minus.con +cic:/Coq/Arith/Minus/le_plus_minus.con +cic:/Coq/Arith/Minus/le_plus_minus_r.con +cic:/Coq/Arith/Minus/lt_O_minus_lt.con +cic:/Coq/Arith/Minus/lt_minus.con +cic:/Coq/Arith/Minus/minus_Sn_m.con +cic:/Coq/Arith/Minus/minus_n_O.con +cic:/Coq/Arith/Minus/minus_n_n.con +cic:/Coq/Arith/Minus/minus_plus.con +cic:/Coq/Arith/Minus/minus_plus_simpl_l_reverse.con +cic:/Coq/Arith/Minus/not_le_minus_0.con +cic:/Coq/Arith/Minus/plus_minus.con +cic:/Coq/Arith/Minus/pred_of_minus.con +cic:/Coq/Arith/Mult/mult_0_l.con +cic:/Coq/Arith/Mult/mult_0_r.con +cic:/Coq/Arith/Mult/mult_1_l.con +cic:/Coq/Arith/Mult/mult_1_r.con +cic:/Coq/Arith/Mult/mult_O_le.con +cic:/Coq/Arith/Mult/mult_S_le_reg_l.con +cic:/Coq/Arith/Mult/mult_S_lt_compat_l.con +cic:/Coq/Arith/Mult/mult_acc.con +cic:/Coq/Arith/Mult/mult_acc_aux.con +cic:/Coq/Arith/Mult/mult_assoc.con +cic:/Coq/Arith/Mult/mult_assoc_reverse.con +cic:/Coq/Arith/Mult/mult_comm.con +cic:/Coq/Arith/Mult/mult_le_compat.con +cic:/Coq/Arith/Mult/mult_le_compat_l.con +cic:/Coq/Arith/Mult/mult_le_compat_r.con +cic:/Coq/Arith/Mult/mult_lt_compat_r.con +cic:/Coq/Arith/Mult/mult_minus_distr_r.con +cic:/Coq/Arith/Mult/mult_plus_distr_l.con +cic:/Coq/Arith/Mult/mult_plus_distr_r.con +cic:/Coq/Arith/Mult/mult_tail_mult.con +cic:/Coq/Arith/Mult/odd_even_lem.con +cic:/Coq/Arith/Mult/tail_mult.con +cic:/Coq/Arith/Peano_dec/O_or_S.con +cic:/Coq/Arith/Peano_dec/dec_eq_nat.con +cic:/Coq/Arith/Peano_dec/eq_nat_dec.con +cic:/Coq/Arith/Plus/le_plus_l.con +cic:/Coq/Arith/Plus/le_plus_r.con +cic:/Coq/Arith/Plus/le_plus_trans.con +cic:/Coq/Arith/Plus/lt_plus_trans.con +cic:/Coq/Arith/Plus/plus_0_l.con +cic:/Coq/Arith/Plus/plus_0_r.con +cic:/Coq/Arith/Plus/plus_Snm_nSm.con +cic:/Coq/Arith/Plus/plus_acc.con +cic:/Coq/Arith/Plus/plus_assoc.con +cic:/Coq/Arith/Plus/plus_assoc_reverse.con +cic:/Coq/Arith/Plus/plus_comm.con +cic:/Coq/Arith/Plus/plus_is_O.con +cic:/Coq/Arith/Plus/plus_is_one.con +cic:/Coq/Arith/Plus/plus_le_compat.con +cic:/Coq/Arith/Plus/plus_le_compat_l.con +cic:/Coq/Arith/Plus/plus_le_compat_r.con +cic:/Coq/Arith/Plus/plus_le_lt_compat.con +cic:/Coq/Arith/Plus/plus_le_reg_l.con +cic:/Coq/Arith/Plus/plus_lt_compat.con +cic:/Coq/Arith/Plus/plus_lt_compat_l.con +cic:/Coq/Arith/Plus/plus_lt_compat_r.con +cic:/Coq/Arith/Plus/plus_lt_le_compat.con +cic:/Coq/Arith/Plus/plus_lt_reg_l.con +cic:/Coq/Arith/Plus/plus_permute.con +cic:/Coq/Arith/Plus/plus_permute_2_in_4.con +cic:/Coq/Arith/Plus/plus_reg_l.con +cic:/Coq/Arith/Plus/plus_tail_plus.con +cic:/Coq/Arith/Plus/tail_plus.con +cic:/Coq/Arith/Wf_nat/acc_lt_rel.con +cic:/Coq/Arith/Wf_nat/gt_wf_ind.con +cic:/Coq/Arith/Wf_nat/gt_wf_rec.con +cic:/Coq/Arith/Wf_nat/gtof.con +cic:/Coq/Arith/Wf_nat/induction_gtof1.con +cic:/Coq/Arith/Wf_nat/induction_gtof2.con +cic:/Coq/Arith/Wf_nat/induction_ltof1.con +cic:/Coq/Arith/Wf_nat/induction_ltof2.con +cic:/Coq/Arith/Wf_nat/inv_lt_rel.con +cic:/Coq/Arith/Wf_nat/lt_wf.con +cic:/Coq/Arith/Wf_nat/lt_wf_double_ind.con +cic:/Coq/Arith/Wf_nat/lt_wf_double_rec.con +cic:/Coq/Arith/Wf_nat/lt_wf_ind.con +cic:/Coq/Arith/Wf_nat/lt_wf_rec.con +cic:/Coq/Arith/Wf_nat/lt_wf_rec1.con +cic:/Coq/Arith/Wf_nat/ltof.con +cic:/Coq/Arith/Wf_nat/well_founded_gtof.con +cic:/Coq/Arith/Wf_nat/well_founded_inv_lt_rel_compat.con +cic:/Coq/Arith/Wf_nat/well_founded_inv_rel_inv_lt_rel.con +cic:/Coq/Arith/Wf_nat/well_founded_lt_compat.con +cic:/Coq/Arith/Wf_nat/well_founded_ltof.con +cic:/Coq/Bool/Bool/Is_true.con +cic:/Coq/Bool/Bool/Is_true_eq_left.con +cic:/Coq/Bool/Bool/Is_true_eq_right.con +cic:/Coq/Bool/Bool/Is_true_eq_true.con +cic:/Coq/Bool/Bool/Is_true_eq_true2.con +cic:/Coq/Bool/Bool/absoption_andb.con +cic:/Coq/Bool/Bool/absoption_orb.con +cic:/Coq/Bool/Bool/andb.con +cic:/Coq/Bool/Bool/andb_assoc.con +cic:/Coq/Bool/Bool/andb_b_false.con +cic:/Coq/Bool/Bool/andb_b_true.con +cic:/Coq/Bool/Bool/andb_comm.con +cic:/Coq/Bool/Bool/andb_false_b.con +cic:/Coq/Bool/Bool/andb_false_elim.con +cic:/Coq/Bool/Bool/andb_false_intro1.con +cic:/Coq/Bool/Bool/andb_false_intro2.con +cic:/Coq/Bool/Bool/andb_neg_b.con +cic:/Coq/Bool/Bool/andb_prop.con +cic:/Coq/Bool/Bool/andb_prop2.con +cic:/Coq/Bool/Bool/andb_true_b.con +cic:/Coq/Bool/Bool/andb_true_eq.con +cic:/Coq/Bool/Bool/andb_true_intro.con +cic:/Coq/Bool/Bool/andb_true_intro2.con +cic:/Coq/Bool/Bool/bool_1.con +cic:/Coq/Bool/Bool/bool_2.con +cic:/Coq/Bool/Bool/bool_3.con +cic:/Coq/Bool/Bool/bool_4.con +cic:/Coq/Bool/Bool/bool_5.con +cic:/Coq/Bool/Bool/bool_6.con +cic:/Coq/Bool/Bool/demorgan1.con +cic:/Coq/Bool/Bool/demorgan2.con +cic:/Coq/Bool/Bool/demorgan3.con +cic:/Coq/Bool/Bool/demorgan4.con +cic:/Coq/Bool/Bool/diff_false_true.con +cic:/Coq/Bool/Bool/diff_true_false.con +cic:/Coq/Bool/Bool/eq_true_false_abs.con +cic:/Coq/Bool/Bool/eqb.con +cic:/Coq/Bool/Bool/eqb_eq.con +cic:/Coq/Bool/Bool/eqb_negb1.con +cic:/Coq/Bool/Bool/eqb_negb2.con +cic:/Coq/Bool/Bool/eqb_prop.con +cic:/Coq/Bool/Bool/eqb_refl.con +cic:/Coq/Bool/Bool/eqb_reflx.con +cic:/Coq/Bool/Bool/eqb_subst.con +cic:/Coq/Bool/Bool/false_xorb.con +cic:/Coq/Bool/Bool/if_negb.con +cic:/Coq/Bool/Bool/ifb.con +cic:/Coq/Bool/Bool/implb.con +cic:/Coq/Bool/Bool/leb.con +cic:/Coq/Bool/Bool/negb.con +cic:/Coq/Bool/Bool/negb_andb.con +cic:/Coq/Bool/Bool/negb_elim.con +cic:/Coq/Bool/Bool/negb_intro.con +cic:/Coq/Bool/Bool/negb_orb.con +cic:/Coq/Bool/Bool/negb_sym.con +cic:/Coq/Bool/Bool/no_fixpoint_negb.con +cic:/Coq/Bool/Bool/not_false_is_true.con +cic:/Coq/Bool/Bool/not_true_is_false.con +cic:/Coq/Bool/Bool/orb.con +cic:/Coq/Bool/Bool/orb_assoc.con +cic:/Coq/Bool/Bool/orb_b_false.con +cic:/Coq/Bool/Bool/orb_b_true.con +cic:/Coq/Bool/Bool/orb_comm.con +cic:/Coq/Bool/Bool/orb_false_b.con +cic:/Coq/Bool/Bool/orb_false_elim.con +cic:/Coq/Bool/Bool/orb_false_intro.con +cic:/Coq/Bool/Bool/orb_neg_b.con +cic:/Coq/Bool/Bool/orb_prop.con +cic:/Coq/Bool/Bool/orb_prop2.con +cic:/Coq/Bool/Bool/orb_true_b.con +cic:/Coq/Bool/Bool/orb_true_elim.con +cic:/Coq/Bool/Bool/orb_true_intro.con +cic:/Coq/Bool/Bool/true_xorb.con +cic:/Coq/Bool/Bool/xorb.con +cic:/Coq/Bool/Bool/xorb_assoc.con +cic:/Coq/Bool/Bool/xorb_comm.con +cic:/Coq/Bool/Bool/xorb_eq.con +cic:/Coq/Bool/Bool/xorb_false.con +cic:/Coq/Bool/Bool/xorb_move_l_r_1.con +cic:/Coq/Bool/Bool/xorb_move_l_r_2.con +cic:/Coq/Bool/Bool/xorb_move_r_l_1.con +cic:/Coq/Bool/Bool/xorb_move_r_l_2.con +cic:/Coq/Bool/Bool/xorb_nilpotent.con +cic:/Coq/Bool/Bool/xorb_true.con +cic:/Coq/Bool/BoolEq/beq_eq_not_false.con +cic:/Coq/Bool/BoolEq/beq_eq_true.con +cic:/Coq/Bool/BoolEq/beq_false_not_eq.con +cic:/Coq/Bool/BoolEq/eq_dec.con +cic:/Coq/Bool/BoolEq/exists_beq_eq.con +cic:/Coq/Bool/BoolEq/not_eq_false_beq.con +cic:/Coq/Bool/Bvector/BVand.con +cic:/Coq/Bool/Bvector/BVor.con +cic:/Coq/Bool/Bvector/BVxor.con +cic:/Coq/Bool/Bvector/Bcons.con +cic:/Coq/Bool/Bvector/Bhigh.con +cic:/Coq/Bool/Bvector/Blow.con +cic:/Coq/Bool/Bvector/Bneg.con +cic:/Coq/Bool/Bvector/Bnil.con +cic:/Coq/Bool/Bvector/BshiftL.con +cic:/Coq/Bool/Bvector/BshiftL_iter.con +cic:/Coq/Bool/Bvector/BshiftRa.con +cic:/Coq/Bool/Bvector/BshiftRa_iter.con +cic:/Coq/Bool/Bvector/BshiftRl.con +cic:/Coq/Bool/Bvector/BshiftRl_iter.con +cic:/Coq/Bool/Bvector/Bsign.con +cic:/Coq/Bool/Bvector/Bvect_false.con +cic:/Coq/Bool/Bvector/Bvect_true.con +cic:/Coq/Bool/Bvector/Bvector.con +cic:/Coq/Bool/Bvector/Vbinary.con +cic:/Coq/Bool/Bvector/Vconst.con +cic:/Coq/Bool/Bvector/Vextend.con +cic:/Coq/Bool/Bvector/Vhead.con +cic:/Coq/Bool/Bvector/Vlast.con +cic:/Coq/Bool/Bvector/Vshiftin.con +cic:/Coq/Bool/Bvector/Vshiftout.con +cic:/Coq/Bool/Bvector/Vshiftrepeat.con +cic:/Coq/Bool/Bvector/Vtail.con +cic:/Coq/Bool/Bvector/Vtrunc.con +cic:/Coq/Bool/Bvector/Vunary.con +cic:/Coq/Bool/Bvector/vector_ind.con +cic:/Coq/Bool/Bvector/vector_rec.con +cic:/Coq/Bool/Bvector/vector_rect.con +cic:/Coq/Bool/DecBool/ifdec.con +cic:/Coq/Bool/DecBool/ifdec_left.con +cic:/Coq/Bool/DecBool/ifdec_right.con +cic:/Coq/Bool/IfProp/IfProp_false.con +cic:/Coq/Bool/IfProp/IfProp_ind.con +cic:/Coq/Bool/IfProp/IfProp_or.con +cic:/Coq/Bool/IfProp/IfProp_sum.con +cic:/Coq/Bool/IfProp/IfProp_true.con +cic:/Coq/Bool/IfProp/Iffalse_inv.con +cic:/Coq/Bool/IfProp/Iftrue_inv.con +cic:/Coq/Bool/Sumbool/bool_eq_ind.con +cic:/Coq/Bool/Sumbool/bool_eq_rec.con +cic:/Coq/Bool/Sumbool/bool_of_sumbool.con +cic:/Coq/Bool/Sumbool/sumbool_and.con +cic:/Coq/Bool/Sumbool/sumbool_not.con +cic:/Coq/Bool/Sumbool/sumbool_of_bool.con +cic:/Coq/Bool/Sumbool/sumbool_or.con +cic:/Coq/Bool/Zerob/zerob.con +cic:/Coq/Bool/Zerob/zerob_false_elim.con +cic:/Coq/Bool/Zerob/zerob_false_intro.con +cic:/Coq/Bool/Zerob/zerob_true_elim.con +cic:/Coq/Bool/Zerob/zerob_true_intro.con +cic:/Coq/Init/Datatypes/CompOpp.con +cic:/Coq/Init/Datatypes/Empty_set_ind.con +cic:/Coq/Init/Datatypes/Empty_set_rec.con +cic:/Coq/Init/Datatypes/Empty_set_rect.con +cic:/Coq/Init/Datatypes/bool_ind.con +cic:/Coq/Init/Datatypes/bool_rec.con +cic:/Coq/Init/Datatypes/bool_rect.con +cic:/Coq/Init/Datatypes/comparison_ind.con +cic:/Coq/Init/Datatypes/comparison_rec.con +cic:/Coq/Init/Datatypes/comparison_rect.con +cic:/Coq/Init/Datatypes/fst.con +cic:/Coq/Init/Datatypes/identity_ind.con +cic:/Coq/Init/Datatypes/identity_rec.con +cic:/Coq/Init/Datatypes/identity_rect.con +cic:/Coq/Init/Datatypes/injective_projections.con +cic:/Coq/Init/Datatypes/nat_ind.con +cic:/Coq/Init/Datatypes/nat_rec.con +cic:/Coq/Init/Datatypes/nat_rect.con +cic:/Coq/Init/Datatypes/option_ind.con +cic:/Coq/Init/Datatypes/option_rec.con +cic:/Coq/Init/Datatypes/option_rect.con +cic:/Coq/Init/Datatypes/prod_ind.con +cic:/Coq/Init/Datatypes/prod_rec.con +cic:/Coq/Init/Datatypes/prod_rect.con +cic:/Coq/Init/Datatypes/snd.con +cic:/Coq/Init/Datatypes/sum_ind.con +cic:/Coq/Init/Datatypes/sum_rec.con +cic:/Coq/Init/Datatypes/sum_rect.con +cic:/Coq/Init/Datatypes/surjective_pairing.con +cic:/Coq/Init/Datatypes/unit_ind.con +cic:/Coq/Init/Datatypes/unit_rec.con +cic:/Coq/Init/Datatypes/unit_rect.con +cic:/Coq/Init/Logic/False_ind.con +cic:/Coq/Init/Logic/False_rec.con +cic:/Coq/Init/Logic/False_rect.con +cic:/Coq/Init/Logic/IF_then_else.con +cic:/Coq/Init/Logic/True_ind.con +cic:/Coq/Init/Logic/True_rec.con +cic:/Coq/Init/Logic/True_rect.con +cic:/Coq/Init/Logic/absurd.con +cic:/Coq/Init/Logic/all.con +cic:/Coq/Init/Logic/and_ind.con +cic:/Coq/Init/Logic/and_rec.con +cic:/Coq/Init/Logic/and_rect.con +cic:/Coq/Init/Logic/eq_ind.con +cic:/Coq/Init/Logic/eq_ind_r.con +cic:/Coq/Init/Logic/eq_rec.con +cic:/Coq/Init/Logic/eq_rec_r.con +cic:/Coq/Init/Logic/eq_rect.con +cic:/Coq/Init/Logic/eq_rect_r.con +cic:/Coq/Init/Logic/ex2_ind.con +cic:/Coq/Init/Logic/ex_ind.con +cic:/Coq/Init/Logic/f_equal.con +cic:/Coq/Init/Logic/f_equal2.con +cic:/Coq/Init/Logic/f_equal3.con +cic:/Coq/Init/Logic/f_equal4.con +cic:/Coq/Init/Logic/f_equal5.con +cic:/Coq/Init/Logic/gen.con +cic:/Coq/Init/Logic/iff.con +cic:/Coq/Init/Logic/iff_refl.con +cic:/Coq/Init/Logic/iff_sym.con +cic:/Coq/Init/Logic/iff_trans.con +cic:/Coq/Init/Logic/inst.con +cic:/Coq/Init/Logic/not.con +cic:/Coq/Init/Logic/or_ind.con +cic:/Coq/Init/Logic/proj1.con +cic:/Coq/Init/Logic/proj2.con +cic:/Coq/Init/Logic/sym_eq.con +cic:/Coq/Init/Logic/sym_equal.con +cic:/Coq/Init/Logic/sym_not_eq.con +cic:/Coq/Init/Logic/sym_not_equal.con +cic:/Coq/Init/Logic/trans_eq.con +cic:/Coq/Init/Logic/trans_equal.con +cic:/Coq/Init/Logic_Type/congr_id.con +cic:/Coq/Init/Logic_Type/fstT.con +cic:/Coq/Init/Logic_Type/identity_ind_r.con +cic:/Coq/Init/Logic_Type/identity_rec_r.con +cic:/Coq/Init/Logic_Type/identity_rect_r.con +cic:/Coq/Init/Logic_Type/notT.con +cic:/Coq/Init/Logic_Type/prodT_curry.con +cic:/Coq/Init/Logic_Type/prodT_ind.con +cic:/Coq/Init/Logic_Type/prodT_rec.con +cic:/Coq/Init/Logic_Type/prodT_rect.con +cic:/Coq/Init/Logic_Type/prodT_uncurry.con +cic:/Coq/Init/Logic_Type/sndT.con +cic:/Coq/Init/Logic_Type/sym_id.con +cic:/Coq/Init/Logic_Type/sym_not_id.con +cic:/Coq/Init/Logic_Type/trans_id.con +cic:/Coq/Init/Peano/IsSucc.con +cic:/Coq/Init/Peano/O_S.con +cic:/Coq/Init/Peano/eq_S.con +cic:/Coq/Init/Peano/eq_add_S.con +cic:/Coq/Init/Peano/ge.con +cic:/Coq/Init/Peano/gt.con +cic:/Coq/Init/Peano/le_ind.con +cic:/Coq/Init/Peano/lt.con +cic:/Coq/Init/Peano/minus.con +cic:/Coq/Init/Peano/mult.con +cic:/Coq/Init/Peano/mult_n_O.con +cic:/Coq/Init/Peano/mult_n_Sm.con +cic:/Coq/Init/Peano/n_Sn.con +cic:/Coq/Init/Peano/nat_case.con +cic:/Coq/Init/Peano/nat_double_ind.con +cic:/Coq/Init/Peano/not_eq_S.con +cic:/Coq/Init/Peano/plus.con +cic:/Coq/Init/Peano/plus_O_n.con +cic:/Coq/Init/Peano/plus_Sn_m.con +cic:/Coq/Init/Peano/plus_n_O.con +cic:/Coq/Init/Peano/plus_n_Sm.con +cic:/Coq/Init/Peano/pred.con +cic:/Coq/Init/Peano/pred_Sn.con +cic:/Coq/Init/Specif/Choice.con +cic:/Coq/Init/Specif/Choice2.con +cic:/Coq/Init/Specif/Exc.con +cic:/Coq/Init/Specif/absurd_set.con +cic:/Coq/Init/Specif/bool_choice.con +cic:/Coq/Init/Specif/error.con +cic:/Coq/Init/Specif/except.con +cic:/Coq/Init/Specif/proj1_sig.con +cic:/Coq/Init/Specif/proj2_sig.con +cic:/Coq/Init/Specif/projS1.con +cic:/Coq/Init/Specif/projS2.con +cic:/Coq/Init/Specif/projT1.con +cic:/Coq/Init/Specif/projT2.con +cic:/Coq/Init/Specif/sig2_ind.con +cic:/Coq/Init/Specif/sig2_rec.con +cic:/Coq/Init/Specif/sig2_rect.con +cic:/Coq/Init/Specif/sigS2_ind.con +cic:/Coq/Init/Specif/sigS2_rec.con +cic:/Coq/Init/Specif/sigS2_rect.con +cic:/Coq/Init/Specif/sigS_ind.con +cic:/Coq/Init/Specif/sigS_rec.con +cic:/Coq/Init/Specif/sigS_rect.con +cic:/Coq/Init/Specif/sigT_ind.con +cic:/Coq/Init/Specif/sigT_rec.con +cic:/Coq/Init/Specif/sigT_rect.con +cic:/Coq/Init/Specif/sig_ind.con +cic:/Coq/Init/Specif/sig_rec.con +cic:/Coq/Init/Specif/sig_rect.con +cic:/Coq/Init/Specif/sumbool_ind.con +cic:/Coq/Init/Specif/sumbool_rec.con +cic:/Coq/Init/Specif/sumbool_rect.con +cic:/Coq/Init/Specif/sumor_ind.con +cic:/Coq/Init/Specif/sumor_rec.con +cic:/Coq/Init/Specif/sumor_rect.con +cic:/Coq/Init/Specif/value.con +cic:/Coq/Init/Wf/Acc_ind.con +cic:/Coq/Init/Wf/Acc_inv.con +cic:/Coq/Init/Wf/Acc_inv_dep.con +cic:/Coq/Init/Wf/Acc_iter.con +cic:/Coq/Init/Wf/Acc_iter_2.con +cic:/Coq/Init/Wf/Acc_rec.con +cic:/Coq/Init/Wf/Acc_rect.con +cic:/Coq/Init/Wf/Fix.con +cic:/Coq/Init/Wf/Fix_F.con +cic:/Coq/Init/Wf/Fix_F_eq.con +cic:/Coq/Init/Wf/Fix_F_inv.con +cic:/Coq/Init/Wf/Fix_eq.con +cic:/Coq/Init/Wf/well_founded.con +cic:/Coq/Init/Wf/well_founded_ind.con +cic:/Coq/Init/Wf/well_founded_induction.con +cic:/Coq/Init/Wf/well_founded_induction_type.con +cic:/Coq/Init/Wf/well_founded_induction_type_2.con +cic:/Coq/Lists/List/In.con +cic:/Coq/Lists/List/In_dec.con +cic:/Coq/Lists/List/app.con +cic:/Coq/Lists/List/app_ass.con +cic:/Coq/Lists/List/app_comm_cons.con +cic:/Coq/Lists/List/app_cons_not_nil.con +cic:/Coq/Lists/List/app_eq_nil.con +cic:/Coq/Lists/List/app_eq_unit.con +cic:/Coq/Lists/List/app_inj_tail.con +cic:/Coq/Lists/List/app_nil_end.con +cic:/Coq/Lists/List/ass_app.con +cic:/Coq/Lists/List/distr_rev.con +cic:/Coq/Lists/List/flat_map.con +cic:/Coq/Lists/List/fold_left.con +cic:/Coq/Lists/List/fold_right.con +cic:/Coq/Lists/List/fold_symmetric.con +cic:/Coq/Lists/List/head.con +cic:/Coq/Lists/List/in_app_or.con +cic:/Coq/Lists/List/in_cons.con +cic:/Coq/Lists/List/in_eq.con +cic:/Coq/Lists/List/in_inv.con +cic:/Coq/Lists/List/in_map.con +cic:/Coq/Lists/List/in_nil.con +cic:/Coq/Lists/List/in_or_app.con +cic:/Coq/Lists/List/in_prod.con +cic:/Coq/Lists/List/in_prod_aux.con +cic:/Coq/Lists/List/incl.con +cic:/Coq/Lists/List/incl_app.con +cic:/Coq/Lists/List/incl_appl.con +cic:/Coq/Lists/List/incl_appr.con +cic:/Coq/Lists/List/incl_cons.con +cic:/Coq/Lists/List/incl_refl.con +cic:/Coq/Lists/List/incl_tl.con +cic:/Coq/Lists/List/incl_tran.con +cic:/Coq/Lists/List/lel.con +cic:/Coq/Lists/List/lel_cons.con +cic:/Coq/Lists/List/lel_cons_cons.con +cic:/Coq/Lists/List/lel_nil.con +cic:/Coq/Lists/List/lel_refl.con +cic:/Coq/Lists/List/lel_tail.con +cic:/Coq/Lists/List/lel_trans.con +cic:/Coq/Lists/List/length.con +cic:/Coq/Lists/List/list_eq_dec.con +cic:/Coq/Lists/List/list_ind.con +cic:/Coq/Lists/List/list_power.con +cic:/Coq/Lists/List/list_prod.con +cic:/Coq/Lists/List/list_rec.con +cic:/Coq/Lists/List/list_rect.con +cic:/Coq/Lists/List/map.con +cic:/Coq/Lists/List/nil_cons.con +cic:/Coq/Lists/List/nth.con +cic:/Coq/Lists/List/nth_In.con +cic:/Coq/Lists/List/nth_S_cons.con +cic:/Coq/Lists/List/nth_default.con +cic:/Coq/Lists/List/nth_error.con +cic:/Coq/Lists/List/nth_in_or_default.con +cic:/Coq/Lists/List/nth_ok.con +cic:/Coq/Lists/List/rev.con +cic:/Coq/Lists/List/rev_ind.con +cic:/Coq/Lists/List/rev_involutive.con +cic:/Coq/Lists/List/rev_list_ind.con +cic:/Coq/Lists/List/rev_unit.con +cic:/Coq/Lists/List/tail.con +cic:/Coq/Lists/ListSet/empty_set.con +cic:/Coq/Lists/ListSet/set.con +cic:/Coq/Lists/ListSet/set_In.con +cic:/Coq/Lists/ListSet/set_In_dec.con +cic:/Coq/Lists/ListSet/set_add.con +cic:/Coq/Lists/ListSet/set_add_elim.con +cic:/Coq/Lists/ListSet/set_add_elim2.con +cic:/Coq/Lists/ListSet/set_add_intro.con +cic:/Coq/Lists/ListSet/set_add_intro1.con +cic:/Coq/Lists/ListSet/set_add_intro2.con +cic:/Coq/Lists/ListSet/set_add_not_empty.con +cic:/Coq/Lists/ListSet/set_diff.con +cic:/Coq/Lists/ListSet/set_diff_elim1.con +cic:/Coq/Lists/ListSet/set_diff_elim2.con +cic:/Coq/Lists/ListSet/set_diff_intro.con +cic:/Coq/Lists/ListSet/set_diff_trivial.con +cic:/Coq/Lists/ListSet/set_fold_left.con +cic:/Coq/Lists/ListSet/set_fold_right.con +cic:/Coq/Lists/ListSet/set_inter.con +cic:/Coq/Lists/ListSet/set_inter_elim.con +cic:/Coq/Lists/ListSet/set_inter_elim1.con +cic:/Coq/Lists/ListSet/set_inter_elim2.con +cic:/Coq/Lists/ListSet/set_inter_intro.con +cic:/Coq/Lists/ListSet/set_map.con +cic:/Coq/Lists/ListSet/set_mem.con +cic:/Coq/Lists/ListSet/set_mem_complete1.con +cic:/Coq/Lists/ListSet/set_mem_complete2.con +cic:/Coq/Lists/ListSet/set_mem_correct1.con +cic:/Coq/Lists/ListSet/set_mem_correct2.con +cic:/Coq/Lists/ListSet/set_mem_ind.con +cic:/Coq/Lists/ListSet/set_mem_ind2.con +cic:/Coq/Lists/ListSet/set_power.con +cic:/Coq/Lists/ListSet/set_prod.con +cic:/Coq/Lists/ListSet/set_remove.con +cic:/Coq/Lists/ListSet/set_union.con +cic:/Coq/Lists/ListSet/set_union_elim.con +cic:/Coq/Lists/ListSet/set_union_emptyL.con +cic:/Coq/Lists/ListSet/set_union_emptyR.con +cic:/Coq/Lists/ListSet/set_union_intro.con +cic:/Coq/Lists/ListSet/set_union_intro1.con +cic:/Coq/Lists/ListSet/set_union_intro2.con +cic:/Coq/Lists/MonoList/A.con +cic:/Coq/Lists/MonoList/In.con +cic:/Coq/Lists/MonoList/List_Dom.con +cic:/Coq/Lists/MonoList/app.con +cic:/Coq/Lists/MonoList/app_ass.con +cic:/Coq/Lists/MonoList/app_nil_end.con +cic:/Coq/Lists/MonoList/ass_app.con +cic:/Coq/Lists/MonoList/in_app_or.con +cic:/Coq/Lists/MonoList/in_cons.con +cic:/Coq/Lists/MonoList/in_eq.con +cic:/Coq/Lists/MonoList/in_or_app.con +cic:/Coq/Lists/MonoList/incl.con +cic:/Coq/Lists/MonoList/incl_app.con +cic:/Coq/Lists/MonoList/incl_appl.con +cic:/Coq/Lists/MonoList/incl_appr.con +cic:/Coq/Lists/MonoList/incl_cons.con +cic:/Coq/Lists/MonoList/incl_refl.con +cic:/Coq/Lists/MonoList/incl_tl.con +cic:/Coq/Lists/MonoList/incl_tran.con +cic:/Coq/Lists/MonoList/lel.con +cic:/Coq/Lists/MonoList/lel_cons.con +cic:/Coq/Lists/MonoList/lel_cons_cons.con +cic:/Coq/Lists/MonoList/lel_nil.con +cic:/Coq/Lists/MonoList/lel_refl.con +cic:/Coq/Lists/MonoList/lel_tail.con +cic:/Coq/Lists/MonoList/lel_trans.con +cic:/Coq/Lists/MonoList/length.con +cic:/Coq/Lists/MonoList/list_ind.con +cic:/Coq/Lists/MonoList/list_rec.con +cic:/Coq/Lists/MonoList/list_rect.con +cic:/Coq/Lists/MonoList/nil_cons.con +cic:/Coq/Lists/MonoList/tail.con +cic:/Coq/Lists/Streams/EqSt_reflex.con +cic:/Coq/Lists/Streams/Exists_ind.con +cic:/Coq/Lists/Streams/ForAll_coind.con +cic:/Coq/Lists/Streams/Str_nth.con +cic:/Coq/Lists/Streams/Str_nth_plus.con +cic:/Coq/Lists/Streams/Str_nth_tl.con +cic:/Coq/Lists/Streams/Str_nth_tl_plus.con +cic:/Coq/Lists/Streams/const.con +cic:/Coq/Lists/Streams/eqst_ntheq.con +cic:/Coq/Lists/Streams/hd.con +cic:/Coq/Lists/Streams/map.con +cic:/Coq/Lists/Streams/ntheq_eqst.con +cic:/Coq/Lists/Streams/sym_EqSt.con +cic:/Coq/Lists/Streams/tl.con +cic:/Coq/Lists/Streams/tl_nth_tl.con +cic:/Coq/Lists/Streams/trans_EqSt.con +cic:/Coq/Lists/Streams/unfold_Stream.con +cic:/Coq/Lists/TheoryList/AllS_assoc_ind.con +cic:/Coq/Lists/TheoryList/AllS_ind.con +cic:/Coq/Lists/TheoryList/Assoc.con +cic:/Coq/Lists/TheoryList/Find.con +cic:/Coq/Lists/TheoryList/Hd.con +cic:/Coq/Lists/TheoryList/InR_INV.con +cic:/Coq/Lists/TheoryList/InR_app_or.con +cic:/Coq/Lists/TheoryList/InR_cons_inv.con +cic:/Coq/Lists/TheoryList/InR_ind.con +cic:/Coq/Lists/TheoryList/InR_inv.con +cic:/Coq/Lists/TheoryList/InR_or_app.con +cic:/Coq/Lists/TheoryList/In_In_spec.con +cic:/Coq/Lists/TheoryList/In_spec_ind.con +cic:/Coq/Lists/TheoryList/Index.con +cic:/Coq/Lists/TheoryList/Index_p.con +cic:/Coq/Lists/TheoryList/Isnil.con +cic:/Coq/Lists/TheoryList/Isnil_dec.con +cic:/Coq/Lists/TheoryList/Isnil_nil.con +cic:/Coq/Lists/TheoryList/Item.con +cic:/Coq/Lists/TheoryList/Length.con +cic:/Coq/Lists/TheoryList/Length_l.con +cic:/Coq/Lists/TheoryList/Length_l_pf.con +cic:/Coq/Lists/TheoryList/Mem.con +cic:/Coq/Lists/TheoryList/Nth.con +cic:/Coq/Lists/TheoryList/Nth_func.con +cic:/Coq/Lists/TheoryList/Tl.con +cic:/Coq/Lists/TheoryList/Try_find.con +cic:/Coq/Lists/TheoryList/Uncons.con +cic:/Coq/Lists/TheoryList/assoc.con +cic:/Coq/Lists/TheoryList/find.con +cic:/Coq/Lists/TheoryList/fst_nth_nth.con +cic:/Coq/Lists/TheoryList/fst_nth_spec_ind.con +cic:/Coq/Lists/TheoryList/index_p.con +cic:/Coq/Lists/TheoryList/mem.con +cic:/Coq/Lists/TheoryList/not_Isnil_cons.con +cic:/Coq/Lists/TheoryList/nth_le_length.con +cic:/Coq/Lists/TheoryList/nth_lt_O.con +cic:/Coq/Lists/TheoryList/nth_spec_ind.con +cic:/Coq/Lists/TheoryList/try_find.con +cic:/Coq/Logic/Berardi/AC.con +cic:/Coq/Logic/Berardi/AC_IF.con +cic:/Coq/Logic/Berardi/IFProp.con +cic:/Coq/Logic/Berardi/L1.con +cic:/Coq/Logic/Berardi/Not_b.con +cic:/Coq/Logic/Berardi/R.con +cic:/Coq/Logic/Berardi/U.con +cic:/Coq/Logic/Berardi/classical_proof_irrelevence.con +cic:/Coq/Logic/Berardi/f.con +cic:/Coq/Logic/Berardi/g.con +cic:/Coq/Logic/Berardi/i.con +cic:/Coq/Logic/Berardi/i2.con +cic:/Coq/Logic/Berardi/inv.con +cic:/Coq/Logic/Berardi/inv2.con +cic:/Coq/Logic/Berardi/j.con +cic:/Coq/Logic/Berardi/j2.con +cic:/Coq/Logic/Berardi/not_has_fixpoint.con +cic:/Coq/Logic/Berardi/pow.con +cic:/Coq/Logic/Berardi/retract_cond_ind.con +cic:/Coq/Logic/Berardi/retract_cond_rec.con +cic:/Coq/Logic/Berardi/retract_cond_rect.con +cic:/Coq/Logic/Berardi/retract_ind.con +cic:/Coq/Logic/Berardi/retract_pow_U_U.con +cic:/Coq/Logic/Berardi/retract_rec.con +cic:/Coq/Logic/Berardi/retract_rect.con +cic:/Coq/Logic/ChoiceFacts/FunChoice_Equiv_RelChoice_and_ParamDefinDescr.con +cic:/Coq/Logic/ChoiceFacts/FunctionalChoice.con +cic:/Coq/Logic/ChoiceFacts/GuardedRelationalChoice.con +cic:/Coq/Logic/ChoiceFacts/IndependenceOfPremises.con +cic:/Coq/Logic/ChoiceFacts/ParamDefiniteDescription.con +cic:/Coq/Logic/ChoiceFacts/ProofIrrelevance.con +cic:/Coq/Logic/ChoiceFacts/RelationalChoice.con +cic:/Coq/Logic/ChoiceFacts/description_rel_choice_imp_funct_choice.con +cic:/Coq/Logic/ChoiceFacts/funct_choice_imp_description.con +cic:/Coq/Logic/ChoiceFacts/funct_choice_imp_rel_choice.con +cic:/Coq/Logic/ChoiceFacts/rel_choice_and_proof_irrel_imp_guarded_rel_choice.con +cic:/Coq/Logic/ChoiceFacts/rel_choice_indep_of_premises_imp_guarded_rel_choice.con +cic:/Coq/Logic/ClassicalChoice/choice.con +cic:/Coq/Logic/ClassicalDescription/classic_set.con +cic:/Coq/Logic/ClassicalDescription/dependent_description.con +cic:/Coq/Logic/ClassicalDescription/description.con +cic:/Coq/Logic/ClassicalFacts/BoolP.con +cic:/Coq/Logic/ClassicalFacts/BoolP_dep_induction.con +cic:/Coq/Logic/ClassicalFacts/BoolP_elim.con +cic:/Coq/Logic/ClassicalFacts/BoolP_elim_redl.con +cic:/Coq/Logic/ClassicalFacts/BoolP_elim_redr.con +cic:/Coq/Logic/ClassicalFacts/F.con +cic:/Coq/Logic/ClassicalFacts/FalseP.con +cic:/Coq/Logic/ClassicalFacts/Fix.con +cic:/Coq/Logic/ClassicalFacts/TrueP.con +cic:/Coq/Logic/ClassicalFacts/aux.con +cic:/Coq/Logic/ClassicalFacts/boolP_elim_redl.con +cic:/Coq/Logic/ClassicalFacts/boolP_elim_redr.con +cic:/Coq/Logic/ClassicalFacts/boolP_ind.con +cic:/Coq/Logic/ClassicalFacts/boolP_indd.con +cic:/Coq/Logic/ClassicalFacts/excluded_middle.con +cic:/Coq/Logic/ClassicalFacts/ext_prop_dep_proof_irrel_cc.con +cic:/Coq/Logic/ClassicalFacts/ext_prop_dep_proof_irrel_cic.con +cic:/Coq/Logic/ClassicalFacts/ext_prop_dep_proof_irrel_gen.con +cic:/Coq/Logic/ClassicalFacts/ext_prop_fixpoint.con +cic:/Coq/Logic/ClassicalFacts/f1.con +cic:/Coq/Logic/ClassicalFacts/f1_o_f2.con +cic:/Coq/Logic/ClassicalFacts/f2.con +cic:/Coq/Logic/ClassicalFacts/has_fixpoint_ind.con +cic:/Coq/Logic/ClassicalFacts/has_fixpoint_rec.con +cic:/Coq/Logic/ClassicalFacts/has_fixpoint_rect.con +cic:/Coq/Logic/ClassicalFacts/inhabited.con +cic:/Coq/Logic/ClassicalFacts/proof_irrelevance.con +cic:/Coq/Logic/ClassicalFacts/prop_degen_em.con +cic:/Coq/Logic/ClassicalFacts/prop_degen_ext.con +cic:/Coq/Logic/ClassicalFacts/prop_degeneracy.con +cic:/Coq/Logic/ClassicalFacts/prop_ext_A_eq_A_imp_A.con +cic:/Coq/Logic/ClassicalFacts/prop_ext_em_degen.con +cic:/Coq/Logic/ClassicalFacts/prop_ext_retract_A_A_imp_A.con +cic:/Coq/Logic/ClassicalFacts/prop_extensionality.con +cic:/Coq/Logic/ClassicalFacts/retract_ind.con +cic:/Coq/Logic/ClassicalFacts/retract_rec.con +cic:/Coq/Logic/ClassicalFacts/retract_rect.con +cic:/Coq/Logic/Classical_Pred_Set/all_not_not_ex.con +cic:/Coq/Logic/Classical_Pred_Set/ex_not_not_all.con +cic:/Coq/Logic/Classical_Pred_Set/not_all_ex_not.con +cic:/Coq/Logic/Classical_Pred_Set/not_all_not_ex.con +cic:/Coq/Logic/Classical_Pred_Set/not_ex_all_not.con +cic:/Coq/Logic/Classical_Pred_Set/not_ex_not_all.con +cic:/Coq/Logic/Classical_Pred_Type/all_not_not_ex.con +cic:/Coq/Logic/Classical_Pred_Type/ex_not_not_all.con +cic:/Coq/Logic/Classical_Pred_Type/not_all_ex_not.con +cic:/Coq/Logic/Classical_Pred_Type/not_all_not_ex.con +cic:/Coq/Logic/Classical_Pred_Type/not_ex_all_not.con +cic:/Coq/Logic/Classical_Pred_Type/not_ex_not_all.con +cic:/Coq/Logic/Classical_Prop/NNPP.con +cic:/Coq/Logic/Classical_Prop/and_not_or.con +cic:/Coq/Logic/Classical_Prop/classic.con +cic:/Coq/Logic/Classical_Prop/imply_and_or.con +cic:/Coq/Logic/Classical_Prop/imply_and_or2.con +cic:/Coq/Logic/Classical_Prop/imply_to_and.con +cic:/Coq/Logic/Classical_Prop/imply_to_or.con +cic:/Coq/Logic/Classical_Prop/not_and_or.con +cic:/Coq/Logic/Classical_Prop/not_imply_elim.con +cic:/Coq/Logic/Classical_Prop/not_imply_elim2.con +cic:/Coq/Logic/Classical_Prop/not_or_and.con +cic:/Coq/Logic/Classical_Prop/or_not_and.con +cic:/Coq/Logic/Classical_Prop/or_to_imply.con +cic:/Coq/Logic/Classical_Prop/proof_irrelevance.con +cic:/Coq/Logic/Decidable/dec_False.con +cic:/Coq/Logic/Decidable/dec_True.con +cic:/Coq/Logic/Decidable/dec_and.con +cic:/Coq/Logic/Decidable/dec_imp.con +cic:/Coq/Logic/Decidable/dec_not.con +cic:/Coq/Logic/Decidable/dec_not_not.con +cic:/Coq/Logic/Decidable/dec_or.con +cic:/Coq/Logic/Decidable/decidable.con +cic:/Coq/Logic/Decidable/imp_simp.con +cic:/Coq/Logic/Decidable/not_and.con +cic:/Coq/Logic/Decidable/not_imp.con +cic:/Coq/Logic/Decidable/not_not.con +cic:/Coq/Logic/Decidable/not_or.con +cic:/Coq/Logic/Diaconescu/AC.con +cic:/Coq/Logic/Diaconescu/PredicateExtensionality.con +cic:/Coq/Logic/Diaconescu/guarded_rel_choice.con +cic:/Coq/Logic/Diaconescu/pred_ext_and_rel_choice_imp_EM.con +cic:/Coq/Logic/Diaconescu/proof_irrel.con +cic:/Coq/Logic/Diaconescu/prop_ext.con +cic:/Coq/Logic/Eqdep/Streicher_K.con +cic:/Coq/Logic/Eqdep/UIP.con +cic:/Coq/Logic/Eqdep/UIP_refl.con +cic:/Coq/Logic/Eqdep/eq_dep1_dep.con +cic:/Coq/Logic/Eqdep/eq_dep1_eq.con +cic:/Coq/Logic/Eqdep/eq_dep1_ind.con +cic:/Coq/Logic/Eqdep/eq_dep1_rec.con +cic:/Coq/Logic/Eqdep/eq_dep1_rect.con +cic:/Coq/Logic/Eqdep/eq_dep_dep1.con +cic:/Coq/Logic/Eqdep/eq_dep_eq.con +cic:/Coq/Logic/Eqdep/eq_dep_ind.con +cic:/Coq/Logic/Eqdep/eq_dep_rec.con +cic:/Coq/Logic/Eqdep/eq_dep_rect.con +cic:/Coq/Logic/Eqdep/eq_dep_sym.con +cic:/Coq/Logic/Eqdep/eq_dep_trans.con +cic:/Coq/Logic/Eqdep/eq_indd.con +cic:/Coq/Logic/Eqdep/eq_rec_eq.con +cic:/Coq/Logic/Eqdep/eq_rect_eq.con +cic:/Coq/Logic/Eqdep/equiv_eqex_eqdep.con +cic:/Coq/Logic/Eqdep/inj_pair2.con +cic:/Coq/Logic/Eqdep/inj_pairT2.con +cic:/Coq/Logic/Eqdep_dec/K_dec.con +cic:/Coq/Logic/Eqdep_dec/K_dec_set.con +cic:/Coq/Logic/Eqdep_dec/eq2eqT.con +cic:/Coq/Logic/Eqdep_dec/eqT2eq.con +cic:/Coq/Logic/Eqdep_dec/eqT_eq_bij.con +cic:/Coq/Logic/Eqdep_dec/eq_eqT_bij.con +cic:/Coq/Logic/Eqdep_dec/eq_proofs_unicity.con +cic:/Coq/Logic/Eqdep_dec/inj_right_pair.con +cic:/Coq/Logic/Eqdep_dec/nu_left_inv.con +cic:/Coq/Logic/Eqdep_dec/trans_sym_eqT.con +cic:/Coq/Logic/Hurkens/I.con +cic:/Coq/Logic/Hurkens/Omega.con +cic:/Coq/Logic/Hurkens/U.con +cic:/Coq/Logic/Hurkens/V.con +cic:/Coq/Logic/Hurkens/WF.con +cic:/Coq/Logic/Hurkens/induct.con +cic:/Coq/Logic/Hurkens/le.con +cic:/Coq/Logic/Hurkens/lemma1.con +cic:/Coq/Logic/Hurkens/lemma2.con +cic:/Coq/Logic/Hurkens/paradox.con +cic:/Coq/Logic/Hurkens/sb.con +cic:/Coq/Logic/JMeq/JMeq_eq.con +cic:/Coq/Logic/JMeq/JMeq_eq_dep.con +cic:/Coq/Logic/JMeq/JMeq_ind.con +cic:/Coq/Logic/JMeq/JMeq_ind_r.con +cic:/Coq/Logic/JMeq/JMeq_rec.con +cic:/Coq/Logic/JMeq/JMeq_rec_r.con +cic:/Coq/Logic/JMeq/JMeq_rect.con +cic:/Coq/Logic/JMeq/eq_dep_JMeq.con +cic:/Coq/Logic/JMeq/sym_JMeq.con +cic:/Coq/Logic/JMeq/trans_JMeq.con +cic:/Coq/Logic/ProofIrrelevance/b2p.con +cic:/Coq/Logic/ProofIrrelevance/or_elim_redl.con +cic:/Coq/Logic/ProofIrrelevance/or_elim_redr.con +cic:/Coq/Logic/ProofIrrelevance/or_indd.con +cic:/Coq/Logic/ProofIrrelevance/p2b.con +cic:/Coq/Logic/ProofIrrelevance/p2p1.con +cic:/Coq/Logic/ProofIrrelevance/p2p2.con +cic:/Coq/Logic/ProofIrrelevance/proof_irrelevance_cc.con +cic:/Coq/Logic/ProofIrrelevance/proof_irrelevance_cci.con +cic:/Coq/Logic/RelationalChoice/relational_choice.con +cic:/Coq/NArith/BinNat/N_ind.con +cic:/Coq/NArith/BinNat/N_rec.con +cic:/Coq/NArith/BinNat/N_rect.con +cic:/Coq/NArith/BinNat/Ncompare.con +cic:/Coq/NArith/BinNat/Ncompare_Eq_eq.con +cic:/Coq/NArith/BinNat/Ndouble.con +cic:/Coq/NArith/BinNat/Ndouble_plus_one.con +cic:/Coq/NArith/BinNat/Nind.con +cic:/Coq/NArith/BinNat/Nmult.con +cic:/Coq/NArith/BinNat/Nmult_0_l.con +cic:/Coq/NArith/BinNat/Nmult_1_l.con +cic:/Coq/NArith/BinNat/Nmult_1_r.con +cic:/Coq/NArith/BinNat/Nmult_assoc.con +cic:/Coq/NArith/BinNat/Nmult_comm.con +cic:/Coq/NArith/BinNat/Nmult_plus_distr_r.con +cic:/Coq/NArith/BinNat/Nmult_reg_r.con +cic:/Coq/NArith/BinNat/Nplus.con +cic:/Coq/NArith/BinNat/Nplus_0_l.con +cic:/Coq/NArith/BinNat/Nplus_0_r.con +cic:/Coq/NArith/BinNat/Nplus_assoc.con +cic:/Coq/NArith/BinNat/Nplus_comm.con +cic:/Coq/NArith/BinNat/Nplus_reg_l.con +cic:/Coq/NArith/BinNat/Nplus_succ.con +cic:/Coq/NArith/BinNat/Nsucc.con +cic:/Coq/NArith/BinNat/Nsucc_inj.con +cic:/Coq/NArith/BinPos/Dcompare.con +cic:/Coq/NArith/BinPos/P_of_succ_nat.con +cic:/Coq/NArith/BinPos/Pcase.con +cic:/Coq/NArith/BinPos/Pcompare.con +cic:/Coq/NArith/BinPos/Pcompare_Eq_eq.con +cic:/Coq/NArith/BinPos/Pcompare_Gt_Gt.con +cic:/Coq/NArith/BinPos/Pcompare_Gt_Lt.con +cic:/Coq/NArith/BinPos/Pcompare_Lt_Gt.con +cic:/Coq/NArith/BinPos/Pcompare_Lt_Lt.con +cic:/Coq/NArith/BinPos/Pcompare_antisym.con +cic:/Coq/NArith/BinPos/Pcompare_not_Eq.con +cic:/Coq/NArith/BinPos/Pcompare_refl.con +cic:/Coq/NArith/BinPos/Pdiv2.con +cic:/Coq/NArith/BinPos/Pdouble_mask.con +cic:/Coq/NArith/BinPos/Pdouble_minus_one.con +cic:/Coq/NArith/BinPos/Pdouble_minus_one_o_succ_eq_xI.con +cic:/Coq/NArith/BinPos/Pdouble_minus_two.con +cic:/Coq/NArith/BinPos/Pdouble_plus_one_mask.con +cic:/Coq/NArith/BinPos/Pind.con +cic:/Coq/NArith/BinPos/Pminus.con +cic:/Coq/NArith/BinPos/Pminus_mask.con +cic:/Coq/NArith/BinPos/Pminus_mask_Gt.con +cic:/Coq/NArith/BinPos/Pminus_mask_carry.con +cic:/Coq/NArith/BinPos/Pminus_mask_diag.con +cic:/Coq/NArith/BinPos/Pmult.con +cic:/Coq/NArith/BinPos/Pmult_1_inversion_l.con +cic:/Coq/NArith/BinPos/Pmult_1_r.con +cic:/Coq/NArith/BinPos/Pmult_assoc.con +cic:/Coq/NArith/BinPos/Pmult_comm.con +cic:/Coq/NArith/BinPos/Pmult_nat.con +cic:/Coq/NArith/BinPos/Pmult_plus_distr_l.con +cic:/Coq/NArith/BinPos/Pmult_plus_distr_r.con +cic:/Coq/NArith/BinPos/Pmult_reg_l.con +cic:/Coq/NArith/BinPos/Pmult_reg_r.con +cic:/Coq/NArith/BinPos/Pmult_xI_mult_xO_discr.con +cic:/Coq/NArith/BinPos/Pmult_xI_permute_r.con +cic:/Coq/NArith/BinPos/Pmult_xO_discr.con +cic:/Coq/NArith/BinPos/Pmult_xO_permute_r.con +cic:/Coq/NArith/BinPos/Pplus.con +cic:/Coq/NArith/BinPos/Pplus_assoc.con +cic:/Coq/NArith/BinPos/Pplus_carry.con +cic:/Coq/NArith/BinPos/Pplus_carry_no_neutral.con +cic:/Coq/NArith/BinPos/Pplus_carry_plus.con +cic:/Coq/NArith/BinPos/Pplus_carry_pred_eq_plus.con +cic:/Coq/NArith/BinPos/Pplus_carry_reg_l.con +cic:/Coq/NArith/BinPos/Pplus_carry_reg_r.con +cic:/Coq/NArith/BinPos/Pplus_carry_spec.con +cic:/Coq/NArith/BinPos/Pplus_comm.con +cic:/Coq/NArith/BinPos/Pplus_diag.con +cic:/Coq/NArith/BinPos/Pplus_minus.con +cic:/Coq/NArith/BinPos/Pplus_no_neutral.con +cic:/Coq/NArith/BinPos/Pplus_one_succ_l.con +cic:/Coq/NArith/BinPos/Pplus_one_succ_r.con +cic:/Coq/NArith/BinPos/Pplus_reg_l.con +cic:/Coq/NArith/BinPos/Pplus_reg_r.con +cic:/Coq/NArith/BinPos/Pplus_succ_permute_l.con +cic:/Coq/NArith/BinPos/Pplus_succ_permute_r.con +cic:/Coq/NArith/BinPos/Pplus_xI_double_minus_one.con +cic:/Coq/NArith/BinPos/Pplus_xO_double_minus_one.con +cic:/Coq/NArith/BinPos/Ppred.con +cic:/Coq/NArith/BinPos/Ppred_succ.con +cic:/Coq/NArith/BinPos/Prec.con +cic:/Coq/NArith/BinPos/Psucc.con +cic:/Coq/NArith/BinPos/Psucc_discr.con +cic:/Coq/NArith/BinPos/Psucc_inj.con +cic:/Coq/NArith/BinPos/Psucc_not_one.con +cic:/Coq/NArith/BinPos/Psucc_o_double_minus_one_eq_xO.con +cic:/Coq/NArith/BinPos/Psucc_pred.con +cic:/Coq/NArith/BinPos/ZC1.con +cic:/Coq/NArith/BinPos/ZC2.con +cic:/Coq/NArith/BinPos/ZC3.con +cic:/Coq/NArith/BinPos/ZC4.con +cic:/Coq/NArith/BinPos/ZL10.con +cic:/Coq/NArith/BinPos/ZL11.con +cic:/Coq/NArith/BinPos/double_eq_one_discr.con +cic:/Coq/NArith/BinPos/double_eq_zero_inversion.con +cic:/Coq/NArith/BinPos/double_moins_un_xO_discr.con +cic:/Coq/NArith/BinPos/double_plus_one_eq_one_inversion.con +cic:/Coq/NArith/BinPos/double_plus_one_zero_discr.con +cic:/Coq/NArith/BinPos/iterate_add.con +cic:/Coq/NArith/BinPos/nat_of_P.con +cic:/Coq/NArith/BinPos/plus_iter.con +cic:/Coq/NArith/BinPos/plus_iter_eq_plus.con +cic:/Coq/NArith/BinPos/plus_iter_xI.con +cic:/Coq/NArith/BinPos/plus_iter_xO.con +cic:/Coq/NArith/BinPos/positive_ind.con +cic:/Coq/NArith/BinPos/positive_mask_ind.con +cic:/Coq/NArith/BinPos/positive_mask_rec.con +cic:/Coq/NArith/BinPos/positive_mask_rect.con +cic:/Coq/NArith/BinPos/positive_rec.con +cic:/Coq/NArith/BinPos/positive_rect.con +cic:/Coq/NArith/BinPos/xI_succ_xO.con +cic:/Coq/NArith/BinPos/xO_succ_permute.con +cic:/Coq/NArith/Pnat/P_of_succ_nat_o_nat_of_P_eq_succ.con +cic:/Coq/NArith/Pnat/Pcompare_minus_l.con +cic:/Coq/NArith/Pnat/Pcompare_minus_r.con +cic:/Coq/NArith/Pnat/Pmult_minus_distr_l.con +cic:/Coq/NArith/Pnat/Pmult_nat_2_mult_2_permute.con +cic:/Coq/NArith/Pnat/Pmult_nat_4_mult_2_permute.con +cic:/Coq/NArith/Pnat/Pmult_nat_l_plus_morphism.con +cic:/Coq/NArith/Pnat/Pmult_nat_mult_permute.con +cic:/Coq/NArith/Pnat/Pmult_nat_plus_carry_morphism.con +cic:/Coq/NArith/Pnat/Pmult_nat_r_plus_morphism.con +cic:/Coq/NArith/Pnat/Pmult_nat_succ_morphism.con +cic:/Coq/NArith/Pnat/ZL16.con +cic:/Coq/NArith/Pnat/ZL17.con +cic:/Coq/NArith/Pnat/ZL3.con +cic:/Coq/NArith/Pnat/ZL4.con +cic:/Coq/NArith/Pnat/ZL5.con +cic:/Coq/NArith/Pnat/ZL6.con +cic:/Coq/NArith/Pnat/ZL7.con +cic:/Coq/NArith/Pnat/ZL8.con +cic:/Coq/NArith/Pnat/le_Pmult_nat.con +cic:/Coq/NArith/Pnat/lt_O_nat_of_P.con +cic:/Coq/NArith/Pnat/nat_of_P_gt_Gt_compare_complement_morphism.con +cic:/Coq/NArith/Pnat/nat_of_P_gt_Gt_compare_morphism.con +cic:/Coq/NArith/Pnat/nat_of_P_inj.con +cic:/Coq/NArith/Pnat/nat_of_P_lt_Lt_compare_complement_morphism.con +cic:/Coq/NArith/Pnat/nat_of_P_lt_Lt_compare_morphism.con +cic:/Coq/NArith/Pnat/nat_of_P_minus_morphism.con +cic:/Coq/NArith/Pnat/nat_of_P_mult_morphism.con +cic:/Coq/NArith/Pnat/nat_of_P_o_P_of_succ_nat_eq_succ.con +cic:/Coq/NArith/Pnat/nat_of_P_plus_carry_morphism.con +cic:/Coq/NArith/Pnat/nat_of_P_plus_morphism.con +cic:/Coq/NArith/Pnat/nat_of_P_succ_morphism.con +cic:/Coq/NArith/Pnat/nat_of_P_xH.con +cic:/Coq/NArith/Pnat/nat_of_P_xI.con +cic:/Coq/NArith/Pnat/nat_of_P_xO.con +cic:/Coq/NArith/Pnat/pred_o_P_of_succ_nat_o_nat_of_P_eq_id.con +cic:/Coq/Reals/ArithProp/euclidian_division.con +cic:/Coq/Reals/ArithProp/even_odd_cor.con +cic:/Coq/Reals/ArithProp/le_double.con +cic:/Coq/Reals/ArithProp/le_minusni_n.con +cic:/Coq/Reals/ArithProp/lt_minus_O_lt.con +cic:/Coq/Reals/ArithProp/minus_neq_O.con +cic:/Coq/Reals/ArithProp/tech8.con +cic:/Coq/Reals/Binomial/C.con +cic:/Coq/Reals/Binomial/binomial.con +cic:/Coq/Reals/Binomial/pascal.con +cic:/Coq/Reals/Binomial/pascal_step1.con +cic:/Coq/Reals/Binomial/pascal_step2.con +cic:/Coq/Reals/Binomial/pascal_step3.con +cic:/Coq/Reals/Cauchy_prod/cauchy_finite.con +cic:/Coq/Reals/Cauchy_prod/sum_N_predN.con +cic:/Coq/Reals/Cauchy_prod/sum_plus.con +cic:/Coq/Reals/Cos_plus/Majxy.con +cic:/Coq/Reals/Cos_plus/Majxy_cv_R0.con +cic:/Coq/Reals/Cos_plus/cos_plus.con +cic:/Coq/Reals/Cos_plus/reste1_cv_R0.con +cic:/Coq/Reals/Cos_plus/reste1_maj.con +cic:/Coq/Reals/Cos_plus/reste2_cv_R0.con +cic:/Coq/Reals/Cos_plus/reste2_maj.con +cic:/Coq/Reals/Cos_plus/reste_cv_R0.con +cic:/Coq/Reals/Cos_rel/A1.con +cic:/Coq/Reals/Cos_rel/A1_cvg.con +cic:/Coq/Reals/Cos_rel/B1.con +cic:/Coq/Reals/Cos_rel/B1_cvg.con +cic:/Coq/Reals/Cos_rel/C1.con +cic:/Coq/Reals/Cos_rel/C1_cvg.con +cic:/Coq/Reals/Cos_rel/Reste.con +cic:/Coq/Reals/Cos_rel/Reste1.con +cic:/Coq/Reals/Cos_rel/Reste2.con +cic:/Coq/Reals/Cos_rel/cos_plus_form.con +cic:/Coq/Reals/Cos_rel/pow_sqr.con +cic:/Coq/Reals/DiscrR/IZR_eq.con +cic:/Coq/Reals/DiscrR/IZR_neq.con +cic:/Coq/Reals/DiscrR/Rlt_R0_R2.con +cic:/Coq/Reals/DiscrR/Rplus_lt_pos.con +cic:/Coq/Reals/Exp_prop/E1.con +cic:/Coq/Reals/Exp_prop/E1_cvg.con +cic:/Coq/Reals/Exp_prop/Reste_E.con +cic:/Coq/Reals/Exp_prop/Reste_E_cv.con +cic:/Coq/Reals/Exp_prop/Reste_E_maj.con +cic:/Coq/Reals/Exp_prop/Rle_Rinv.con +cic:/Coq/Reals/Exp_prop/derivable_pt_lim_exp_0.con +cic:/Coq/Reals/Exp_prop/div2_S_double.con +cic:/Coq/Reals/Exp_prop/div2_double.con +cic:/Coq/Reals/Exp_prop/div2_not_R0.con +cic:/Coq/Reals/Exp_prop/exp_form.con +cic:/Coq/Reals/Exp_prop/exp_plus.con +cic:/Coq/Reals/Exp_prop/exp_pos.con +cic:/Coq/Reals/Exp_prop/exp_pos_pos.con +cic:/Coq/Reals/Exp_prop/maj_Reste_E.con +cic:/Coq/Reals/Exp_prop/maj_Reste_cv_R0.con +cic:/Coq/Reals/MVT/IAF.con +cic:/Coq/Reals/MVT/IAF_var.con +cic:/Coq/Reals/MVT/MVT.con +cic:/Coq/Reals/MVT/MVT_cor1.con +cic:/Coq/Reals/MVT/MVT_cor2.con +cic:/Coq/Reals/MVT/MVT_cor3.con +cic:/Coq/Reals/MVT/Rolle.con +cic:/Coq/Reals/MVT/antiderivative_Ucte.con +cic:/Coq/Reals/MVT/derive_increasing_interv.con +cic:/Coq/Reals/MVT/derive_increasing_interv_ax.con +cic:/Coq/Reals/MVT/derive_increasing_interv_var.con +cic:/Coq/Reals/MVT/increasing_decreasing.con +cic:/Coq/Reals/MVT/increasing_decreasing_opp.con +cic:/Coq/Reals/MVT/negative_derivative.con +cic:/Coq/Reals/MVT/nonneg_derivative_1.con +cic:/Coq/Reals/MVT/nonpos_derivative_0.con +cic:/Coq/Reals/MVT/nonpos_derivative_1.con +cic:/Coq/Reals/MVT/null_derivative_0.con +cic:/Coq/Reals/MVT/null_derivative_1.con +cic:/Coq/Reals/MVT/null_derivative_loc.con +cic:/Coq/Reals/MVT/positive_derivative.con +cic:/Coq/Reals/MVT/strictincreasing_strictdecreasing_opp.con +cic:/Coq/Reals/NewtonInt/FTCN_step1.con +cic:/Coq/Reals/NewtonInt/FTC_Newton.con +cic:/Coq/Reals/NewtonInt/NewtonInt.con +cic:/Coq/Reals/NewtonInt/NewtonInt_P1.con +cic:/Coq/Reals/NewtonInt/NewtonInt_P2.con +cic:/Coq/Reals/NewtonInt/NewtonInt_P3.con +cic:/Coq/Reals/NewtonInt/NewtonInt_P4.con +cic:/Coq/Reals/NewtonInt/NewtonInt_P5.con +cic:/Coq/Reals/NewtonInt/NewtonInt_P6.con +cic:/Coq/Reals/NewtonInt/NewtonInt_P7.con +cic:/Coq/Reals/NewtonInt/NewtonInt_P8.con +cic:/Coq/Reals/NewtonInt/NewtonInt_P9.con +cic:/Coq/Reals/NewtonInt/Newton_integrable.con +cic:/Coq/Reals/NewtonInt/antiderivative_P1.con +cic:/Coq/Reals/NewtonInt/antiderivative_P2.con +cic:/Coq/Reals/NewtonInt/antiderivative_P3.con +cic:/Coq/Reals/NewtonInt/antiderivative_P4.con +cic:/Coq/Reals/PartSum/Cauchy_crit_series.con +cic:/Coq/Reals/PartSum/Rabs_triang_gen.con +cic:/Coq/Reals/PartSum/Rsum_abs.con +cic:/Coq/Reals/PartSum/SP.con +cic:/Coq/Reals/PartSum/cauchy_abs.con +cic:/Coq/Reals/PartSum/cond_pos_sum.con +cic:/Coq/Reals/PartSum/cv_cauchy_1.con +cic:/Coq/Reals/PartSum/cv_cauchy_2.con +cic:/Coq/Reals/PartSum/decomp_sum.con +cic:/Coq/Reals/PartSum/minus_sum.con +cic:/Coq/Reals/PartSum/plus_sum.con +cic:/Coq/Reals/PartSum/scal_sum.con +cic:/Coq/Reals/PartSum/sum_Rle.con +cic:/Coq/Reals/PartSum/sum_cte.con +cic:/Coq/Reals/PartSum/sum_cv_maj.con +cic:/Coq/Reals/PartSum/sum_decomposition.con +cic:/Coq/Reals/PartSum/sum_eq.con +cic:/Coq/Reals/PartSum/sum_eq_R0.con +cic:/Coq/Reals/PartSum/sum_growing.con +cic:/Coq/Reals/PartSum/sum_incr.con +cic:/Coq/Reals/PartSum/tech1.con +cic:/Coq/Reals/PartSum/tech11.con +cic:/Coq/Reals/PartSum/tech12.con +cic:/Coq/Reals/PartSum/tech2.con +cic:/Coq/Reals/PartSum/tech3.con +cic:/Coq/Reals/PartSum/tech4.con +cic:/Coq/Reals/PartSum/tech5.con +cic:/Coq/Reals/PartSum/tech6.con +cic:/Coq/Reals/PartSum/tech7.con +cic:/Coq/Reals/PartSum/uniqueness_sum.con +cic:/Coq/Reals/RIneq/INR_IZR_INZ.con +cic:/Coq/Reals/RIneq/INR_eq.con +cic:/Coq/Reals/RIneq/INR_le.con +cic:/Coq/Reals/RIneq/INR_lt.con +cic:/Coq/Reals/RIneq/INR_lt_1.con +cic:/Coq/Reals/RIneq/INR_pos.con +cic:/Coq/Reals/RIneq/IZN.con +cic:/Coq/Reals/RIneq/IZR_ge.con +cic:/Coq/Reals/RIneq/IZR_le.con +cic:/Coq/Reals/RIneq/IZR_lt.con +cic:/Coq/Reals/RIneq/RTheory.con +cic:/Coq/Reals/RIneq/Rdichotomy.con +cic:/Coq/Reals/RIneq/Req_dec.con +cic:/Coq/Reals/RIneq/Req_ge.con +cic:/Coq/Reals/RIneq/Req_ge_sym.con +cic:/Coq/Reals/RIneq/Req_le.con +cic:/Coq/Reals/RIneq/Req_le_sym.con +cic:/Coq/Reals/RIneq/Rge_antisym.con +cic:/Coq/Reals/RIneq/Rge_dec.con +cic:/Coq/Reals/RIneq/Rge_gt_trans.con +cic:/Coq/Reals/RIneq/Rge_le.con +cic:/Coq/Reals/RIneq/Rge_minus.con +cic:/Coq/Reals/RIneq/Rge_trans.con +cic:/Coq/Reals/RIneq/Rgt_dec.con +cic:/Coq/Reals/RIneq/Rgt_ge.con +cic:/Coq/Reals/RIneq/Rgt_ge_trans.con +cic:/Coq/Reals/RIneq/Rgt_minus.con +cic:/Coq/Reals/RIneq/Rgt_not_eq.con +cic:/Coq/Reals/RIneq/Rgt_not_le.con +cic:/Coq/Reals/RIneq/Rgt_trans.con +cic:/Coq/Reals/RIneq/Rinv_0_lt_compat.con +cic:/Coq/Reals/RIneq/Rinv_1.con +cic:/Coq/Reals/RIneq/Rinv_1_lt_contravar.con +cic:/Coq/Reals/RIneq/Rinv_involutive.con +cic:/Coq/Reals/RIneq/Rinv_l_sym.con +cic:/Coq/Reals/RIneq/Rinv_lt_0_compat.con +cic:/Coq/Reals/RIneq/Rinv_lt_contravar.con +cic:/Coq/Reals/RIneq/Rinv_mult_distr.con +cic:/Coq/Reals/RIneq/Rinv_mult_simpl.con +cic:/Coq/Reals/RIneq/Rinv_neq_0_compat.con +cic:/Coq/Reals/RIneq/Rinv_r.con +cic:/Coq/Reals/RIneq/Rinv_r_simpl_l.con +cic:/Coq/Reals/RIneq/Rinv_r_simpl_m.con +cic:/Coq/Reals/RIneq/Rinv_r_simpl_r.con +cic:/Coq/Reals/RIneq/Rinv_r_sym.con +cic:/Coq/Reals/RIneq/Rle_0_1.con +cic:/Coq/Reals/RIneq/Rle_0_sqr.con +cic:/Coq/Reals/RIneq/Rle_antisym.con +cic:/Coq/Reals/RIneq/Rle_dec.con +cic:/Coq/Reals/RIneq/Rle_ge.con +cic:/Coq/Reals/RIneq/Rle_le_eq.con +cic:/Coq/Reals/RIneq/Rle_lt_0_plus_1.con +cic:/Coq/Reals/RIneq/Rle_lt_or_eq_dec.con +cic:/Coq/Reals/RIneq/Rle_lt_trans.con +cic:/Coq/Reals/RIneq/Rle_minus.con +cic:/Coq/Reals/RIneq/Rle_not_lt.con +cic:/Coq/Reals/RIneq/Rle_or_lt.con +cic:/Coq/Reals/RIneq/Rle_refl.con +cic:/Coq/Reals/RIneq/Rle_trans.con +cic:/Coq/Reals/RIneq/Rlt_0_1.con +cic:/Coq/Reals/RIneq/Rlt_0_sqr.con +cic:/Coq/Reals/RIneq/Rlt_dec.con +cic:/Coq/Reals/RIneq/Rlt_dichotomy_converse.con +cic:/Coq/Reals/RIneq/Rlt_eq_compat.con +cic:/Coq/Reals/RIneq/Rlt_irrefl.con +cic:/Coq/Reals/RIneq/Rlt_le.con +cic:/Coq/Reals/RIneq/Rlt_le_dec.con +cic:/Coq/Reals/RIneq/Rlt_le_trans.con +cic:/Coq/Reals/RIneq/Rlt_minus.con +cic:/Coq/Reals/RIneq/Rlt_not_eq.con +cic:/Coq/Reals/RIneq/Rlt_not_ge.con +cic:/Coq/Reals/RIneq/Rlt_not_le.con +cic:/Coq/Reals/RIneq/Rlt_plus_1.con +cic:/Coq/Reals/RIneq/Rminus_0_l.con +cic:/Coq/Reals/RIneq/Rminus_0_r.con +cic:/Coq/Reals/RIneq/Rminus_diag_eq.con +cic:/Coq/Reals/RIneq/Rminus_diag_uniq.con +cic:/Coq/Reals/RIneq/Rminus_diag_uniq_sym.con +cic:/Coq/Reals/RIneq/Rminus_eq_contra.con +cic:/Coq/Reals/RIneq/Rminus_le.con +cic:/Coq/Reals/RIneq/Rminus_lt.con +cic:/Coq/Reals/RIneq/Rminus_not_eq.con +cic:/Coq/Reals/RIneq/Rminus_not_eq_right.con +cic:/Coq/Reals/RIneq/Rmult_0_l.con +cic:/Coq/Reals/RIneq/Rmult_0_r.con +cic:/Coq/Reals/RIneq/Rmult_1_r.con +cic:/Coq/Reals/RIneq/Rmult_eq_0_compat.con +cic:/Coq/Reals/RIneq/Rmult_eq_0_compat_l.con +cic:/Coq/Reals/RIneq/Rmult_eq_0_compat_r.con +cic:/Coq/Reals/RIneq/Rmult_eq_compat_l.con +cic:/Coq/Reals/RIneq/Rmult_eq_reg_l.con +cic:/Coq/Reals/RIneq/Rmult_ge_0_gt_0_lt_compat.con +cic:/Coq/Reals/RIneq/Rmult_ge_compat_r.con +cic:/Coq/Reals/RIneq/Rmult_gt_0_compat.con +cic:/Coq/Reals/RIneq/Rmult_gt_0_lt_compat.con +cic:/Coq/Reals/RIneq/Rmult_integral.con +cic:/Coq/Reals/RIneq/Rmult_integral_contrapositive.con +cic:/Coq/Reals/RIneq/Rmult_le_0_lt_compat.con +cic:/Coq/Reals/RIneq/Rmult_le_compat.con +cic:/Coq/Reals/RIneq/Rmult_le_compat_l.con +cic:/Coq/Reals/RIneq/Rmult_le_compat_neg_l.con +cic:/Coq/Reals/RIneq/Rmult_le_compat_r.con +cic:/Coq/Reals/RIneq/Rmult_le_ge_compat_neg_l.con +cic:/Coq/Reals/RIneq/Rmult_le_pos.con +cic:/Coq/Reals/RIneq/Rmult_le_reg_l.con +cic:/Coq/Reals/RIneq/Rmult_lt_0_compat.con +cic:/Coq/Reals/RIneq/Rmult_lt_compat_r.con +cic:/Coq/Reals/RIneq/Rmult_lt_gt_compat_neg_l.con +cic:/Coq/Reals/RIneq/Rmult_lt_reg_l.con +cic:/Coq/Reals/RIneq/Rmult_minus_distr_l.con +cic:/Coq/Reals/RIneq/Rmult_ne.con +cic:/Coq/Reals/RIneq/Rmult_neq_0_reg.con +cic:/Coq/Reals/RIneq/Rmult_opp_opp.con +cic:/Coq/Reals/RIneq/Rmult_plus_distr_r.con +cic:/Coq/Reals/RIneq/Rnot_ge_lt.con +cic:/Coq/Reals/RIneq/Rnot_gt_le.con +cic:/Coq/Reals/RIneq/Rnot_le_lt.con +cic:/Coq/Reals/RIneq/Rnot_lt_ge.con +cic:/Coq/Reals/RIneq/Rnot_lt_le.con +cic:/Coq/Reals/RIneq/Ropp_0.con +cic:/Coq/Reals/RIneq/Ropp_0_ge_le_contravar.con +cic:/Coq/Reals/RIneq/Ropp_0_gt_lt_contravar.con +cic:/Coq/Reals/RIneq/Ropp_0_le_ge_contravar.con +cic:/Coq/Reals/RIneq/Ropp_0_lt_gt_contravar.con +cic:/Coq/Reals/RIneq/Ropp_Ropp_IZR.con +cic:/Coq/Reals/RIneq/Ropp_eq_0_compat.con +cic:/Coq/Reals/RIneq/Ropp_eq_compat.con +cic:/Coq/Reals/RIneq/Ropp_ge_le_contravar.con +cic:/Coq/Reals/RIneq/Ropp_gt_lt_0_contravar.con +cic:/Coq/Reals/RIneq/Ropp_gt_lt_contravar.con +cic:/Coq/Reals/RIneq/Ropp_inv_permute.con +cic:/Coq/Reals/RIneq/Ropp_involutive.con +cic:/Coq/Reals/RIneq/Ropp_le_cancel.con +cic:/Coq/Reals/RIneq/Ropp_le_contravar.con +cic:/Coq/Reals/RIneq/Ropp_le_ge_contravar.con +cic:/Coq/Reals/RIneq/Ropp_lt_cancel.con +cic:/Coq/Reals/RIneq/Ropp_lt_contravar.con +cic:/Coq/Reals/RIneq/Ropp_lt_gt_0_contravar.con +cic:/Coq/Reals/RIneq/Ropp_lt_gt_contravar.con +cic:/Coq/Reals/RIneq/Ropp_minus_distr'.con +cic:/Coq/Reals/RIneq/Ropp_minus_distr.con +cic:/Coq/Reals/RIneq/Ropp_mult_distr_l_reverse.con +cic:/Coq/Reals/RIneq/Ropp_mult_distr_r_reverse.con +cic:/Coq/Reals/RIneq/Ropp_neq_0_compat.con +cic:/Coq/Reals/RIneq/Ropp_plus_distr.con +cic:/Coq/Reals/RIneq/Rplus_0_r.con +cic:/Coq/Reals/RIneq/Rplus_0_r_uniq.con +cic:/Coq/Reals/RIneq/Rplus_eq_0_l.con +cic:/Coq/Reals/RIneq/Rplus_eq_R0.con +cic:/Coq/Reals/RIneq/Rplus_eq_compat_l.con +cic:/Coq/Reals/RIneq/Rplus_eq_reg_l.con +cic:/Coq/Reals/RIneq/Rplus_ge_compat_l.con +cic:/Coq/Reals/RIneq/Rplus_ge_reg_l.con +cic:/Coq/Reals/RIneq/Rplus_gt_compat_l.con +cic:/Coq/Reals/RIneq/Rplus_gt_reg_l.con +cic:/Coq/Reals/RIneq/Rplus_le_compat.con +cic:/Coq/Reals/RIneq/Rplus_le_compat_l.con +cic:/Coq/Reals/RIneq/Rplus_le_compat_r.con +cic:/Coq/Reals/RIneq/Rplus_le_le_0_compat.con +cic:/Coq/Reals/RIneq/Rplus_le_lt_0_compat.con +cic:/Coq/Reals/RIneq/Rplus_le_lt_compat.con +cic:/Coq/Reals/RIneq/Rplus_le_reg_l.con +cic:/Coq/Reals/RIneq/Rplus_lt_0_compat.con +cic:/Coq/Reals/RIneq/Rplus_lt_compat.con +cic:/Coq/Reals/RIneq/Rplus_lt_compat_r.con +cic:/Coq/Reals/RIneq/Rplus_lt_le_0_compat.con +cic:/Coq/Reals/RIneq/Rplus_lt_le_compat.con +cic:/Coq/Reals/RIneq/Rplus_lt_reg_r.con +cic:/Coq/Reals/RIneq/Rplus_minus.con +cic:/Coq/Reals/RIneq/Rplus_ne.con +cic:/Coq/Reals/RIneq/Rplus_opp_l.con +cic:/Coq/Reals/RIneq/Rplus_opp_r_uniq.con +cic:/Coq/Reals/RIneq/Rplus_sqr_eq_0.con +cic:/Coq/Reals/RIneq/Rplus_sqr_eq_0_l.con +cic:/Coq/Reals/RIneq/Rsqr.con +cic:/Coq/Reals/RIneq/Rsqr_0.con +cic:/Coq/Reals/RIneq/Rsqr_0_uniq.con +cic:/Coq/Reals/RIneq/Rtotal_order.con +cic:/Coq/Reals/RIneq/S_INR.con +cic:/Coq/Reals/RIneq/S_O_plus_INR.con +cic:/Coq/Reals/RIneq/Z_R_minus.con +cic:/Coq/Reals/RIneq/completeness_weak.con +cic:/Coq/Reals/RIneq/cond_neg.con +cic:/Coq/Reals/RIneq/cond_nonneg.con +cic:/Coq/Reals/RIneq/cond_nonpos.con +cic:/Coq/Reals/RIneq/cond_nonzero.con +cic:/Coq/Reals/RIneq/cond_pos.con +cic:/Coq/Reals/RIneq/double.con +cic:/Coq/Reals/RIneq/double_var.con +cic:/Coq/Reals/RIneq/eq_IZR.con +cic:/Coq/Reals/RIneq/eq_IZR_R0.con +cic:/Coq/Reals/RIneq/inser_trans_R.con +cic:/Coq/Reals/RIneq/le_INR.con +cic:/Coq/Reals/RIneq/le_IZR.con +cic:/Coq/Reals/RIneq/le_IZR_R1.con +cic:/Coq/Reals/RIneq/le_O_IZR.con +cic:/Coq/Reals/RIneq/le_epsilon.con +cic:/Coq/Reals/RIneq/lt_INR.con +cic:/Coq/Reals/RIneq/lt_INR_0.con +cic:/Coq/Reals/RIneq/lt_IZR.con +cic:/Coq/Reals/RIneq/lt_O_IZR.con +cic:/Coq/Reals/RIneq/minus_INR.con +cic:/Coq/Reals/RIneq/minus_Rge.con +cic:/Coq/Reals/RIneq/minus_Rgt.con +cic:/Coq/Reals/RIneq/mult_INR.con +cic:/Coq/Reals/RIneq/mult_IZR.con +cic:/Coq/Reals/RIneq/neg.con +cic:/Coq/Reals/RIneq/negreal_ind.con +cic:/Coq/Reals/RIneq/negreal_rec.con +cic:/Coq/Reals/RIneq/negreal_rect.con +cic:/Coq/Reals/RIneq/nonneg.con +cic:/Coq/Reals/RIneq/nonnegreal_ind.con +cic:/Coq/Reals/RIneq/nonnegreal_rec.con +cic:/Coq/Reals/RIneq/nonnegreal_rect.con +cic:/Coq/Reals/RIneq/nonpos.con +cic:/Coq/Reals/RIneq/nonposreal_ind.con +cic:/Coq/Reals/RIneq/nonposreal_rec.con +cic:/Coq/Reals/RIneq/nonposreal_rect.con +cic:/Coq/Reals/RIneq/nonzero.con +cic:/Coq/Reals/RIneq/nonzeroreal_ind.con +cic:/Coq/Reals/RIneq/nonzeroreal_rec.con +cic:/Coq/Reals/RIneq/nonzeroreal_rect.con +cic:/Coq/Reals/RIneq/not_1_INR.con +cic:/Coq/Reals/RIneq/not_INR_O.con +cic:/Coq/Reals/RIneq/not_O_INR.con +cic:/Coq/Reals/RIneq/not_O_IZR.con +cic:/Coq/Reals/RIneq/not_nm_INR.con +cic:/Coq/Reals/RIneq/one_IZR_lt1.con +cic:/Coq/Reals/RIneq/one_IZR_r_R1.con +cic:/Coq/Reals/RIneq/one_IZR_r_R1_subproof.con +cic:/Coq/Reals/RIneq/plus_INR.con +cic:/Coq/Reals/RIneq/plus_IZR.con +cic:/Coq/Reals/RIneq/plus_IZR_NEG_POS.con +cic:/Coq/Reals/RIneq/plus_le_is_le.con +cic:/Coq/Reals/RIneq/plus_lt_is_lt.con +cic:/Coq/Reals/RIneq/pos.con +cic:/Coq/Reals/RIneq/pos_INR.con +cic:/Coq/Reals/RIneq/posreal_ind.con +cic:/Coq/Reals/RIneq/posreal_rec.con +cic:/Coq/Reals/RIneq/posreal_rect.con +cic:/Coq/Reals/RIneq/prod_neq_R0.con +cic:/Coq/Reals/RIneq/single_z_r_R1.con +cic:/Coq/Reals/RIneq/sum_inequa_Rle_lt.con +cic:/Coq/Reals/RIneq/tech_Rgt_minus.con +cic:/Coq/Reals/RIneq/tech_Rplus.con +cic:/Coq/Reals/RIneq/tech_single_z_r_R1.con +cic:/Coq/Reals/RList/AbsList.con +cic:/Coq/Reals/RList/AbsList_P1.con +cic:/Coq/Reals/RList/AbsList_P2.con +cic:/Coq/Reals/RList/FF.con +cic:/Coq/Reals/RList/In.con +cic:/Coq/Reals/RList/MaxRlist.con +cic:/Coq/Reals/RList/MaxRlist_P1.con +cic:/Coq/Reals/RList/MaxRlist_P2.con +cic:/Coq/Reals/RList/MinRlist.con +cic:/Coq/Reals/RList/MinRlist_P1.con +cic:/Coq/Reals/RList/MinRlist_P2.con +cic:/Coq/Reals/RList/RList_P0.con +cic:/Coq/Reals/RList/RList_P1.con +cic:/Coq/Reals/RList/RList_P10.con +cic:/Coq/Reals/RList/RList_P11.con +cic:/Coq/Reals/RList/RList_P12.con +cic:/Coq/Reals/RList/RList_P13.con +cic:/Coq/Reals/RList/RList_P14.con +cic:/Coq/Reals/RList/RList_P15.con +cic:/Coq/Reals/RList/RList_P16.con +cic:/Coq/Reals/RList/RList_P17.con +cic:/Coq/Reals/RList/RList_P18.con +cic:/Coq/Reals/RList/RList_P19.con +cic:/Coq/Reals/RList/RList_P2.con +cic:/Coq/Reals/RList/RList_P20.con +cic:/Coq/Reals/RList/RList_P21.con +cic:/Coq/Reals/RList/RList_P22.con +cic:/Coq/Reals/RList/RList_P23.con +cic:/Coq/Reals/RList/RList_P24.con +cic:/Coq/Reals/RList/RList_P25.con +cic:/Coq/Reals/RList/RList_P26.con +cic:/Coq/Reals/RList/RList_P27.con +cic:/Coq/Reals/RList/RList_P28.con +cic:/Coq/Reals/RList/RList_P29.con +cic:/Coq/Reals/RList/RList_P3.con +cic:/Coq/Reals/RList/RList_P4.con +cic:/Coq/Reals/RList/RList_P5.con +cic:/Coq/Reals/RList/RList_P6.con +cic:/Coq/Reals/RList/RList_P7.con +cic:/Coq/Reals/RList/RList_P8.con +cic:/Coq/Reals/RList/RList_P9.con +cic:/Coq/Reals/RList/Rlength.con +cic:/Coq/Reals/RList/Rlist_P1.con +cic:/Coq/Reals/RList/Rlist_ind.con +cic:/Coq/Reals/RList/Rlist_rec.con +cic:/Coq/Reals/RList/Rlist_rect.con +cic:/Coq/Reals/RList/Rtail.con +cic:/Coq/Reals/RList/app_Rlist.con +cic:/Coq/Reals/RList/cons_ORlist.con +cic:/Coq/Reals/RList/cons_Rlist.con +cic:/Coq/Reals/RList/insert.con +cic:/Coq/Reals/RList/mid_Rlist.con +cic:/Coq/Reals/RList/ordered_Rlist.con +cic:/Coq/Reals/RList/pos_Rl.con +cic:/Coq/Reals/RList/pos_Rl_P1.con +cic:/Coq/Reals/RList/pos_Rl_P2.con +cic:/Coq/Reals/R_Ifp/Int_part.con +cic:/Coq/Reals/R_Ifp/Int_part_INR.con +cic:/Coq/Reals/R_Ifp/R0_fp_O.con +cic:/Coq/Reals/R_Ifp/Rminus_Int_part1.con +cic:/Coq/Reals/R_Ifp/Rminus_Int_part2.con +cic:/Coq/Reals/R_Ifp/Rminus_fp1.con +cic:/Coq/Reals/R_Ifp/Rminus_fp2.con +cic:/Coq/Reals/R_Ifp/base_Int_part.con +cic:/Coq/Reals/R_Ifp/base_fp.con +cic:/Coq/Reals/R_Ifp/for_base_fp.con +cic:/Coq/Reals/R_Ifp/fp_R0.con +cic:/Coq/Reals/R_Ifp/fp_nat.con +cic:/Coq/Reals/R_Ifp/frac_part.con +cic:/Coq/Reals/R_Ifp/plus_Int_part1.con +cic:/Coq/Reals/R_Ifp/plus_Int_part2.con +cic:/Coq/Reals/R_Ifp/plus_frac_part1.con +cic:/Coq/Reals/R_Ifp/plus_frac_part2.con +cic:/Coq/Reals/R_Ifp/tech_up.con +cic:/Coq/Reals/R_Ifp/up_tech.con +cic:/Coq/Reals/R_sqr/Rsqr_1.con +cic:/Coq/Reals/R_sqr/Rsqr_abs.con +cic:/Coq/Reals/R_sqr/Rsqr_div.con +cic:/Coq/Reals/R_sqr/Rsqr_eq.con +cic:/Coq/Reals/R_sqr/Rsqr_eq_0.con +cic:/Coq/Reals/R_sqr/Rsqr_eq_abs_0.con +cic:/Coq/Reals/R_sqr/Rsqr_eq_asb_1.con +cic:/Coq/Reals/R_sqr/Rsqr_gt_0_0.con +cic:/Coq/Reals/R_sqr/Rsqr_incr_0.con +cic:/Coq/Reals/R_sqr/Rsqr_incr_0_var.con +cic:/Coq/Reals/R_sqr/Rsqr_incr_1.con +cic:/Coq/Reals/R_sqr/Rsqr_incrst_0.con +cic:/Coq/Reals/R_sqr/Rsqr_incrst_1.con +cic:/Coq/Reals/R_sqr/Rsqr_inj.con +cic:/Coq/Reals/R_sqr/Rsqr_inv.con +cic:/Coq/Reals/R_sqr/Rsqr_le_abs_0.con +cic:/Coq/Reals/R_sqr/Rsqr_le_abs_1.con +cic:/Coq/Reals/R_sqr/Rsqr_lt_abs_0.con +cic:/Coq/Reals/R_sqr/Rsqr_lt_abs_1.con +cic:/Coq/Reals/R_sqr/Rsqr_minus.con +cic:/Coq/Reals/R_sqr/Rsqr_minus_plus.con +cic:/Coq/Reals/R_sqr/Rsqr_mult.con +cic:/Coq/Reals/R_sqr/Rsqr_neg.con +cic:/Coq/Reals/R_sqr/Rsqr_neg_minus.con +cic:/Coq/Reals/R_sqr/Rsqr_neg_pos_le_0.con +cic:/Coq/Reals/R_sqr/Rsqr_neg_pos_le_1.con +cic:/Coq/Reals/R_sqr/Rsqr_plus.con +cic:/Coq/Reals/R_sqr/Rsqr_plus_minus.con +cic:/Coq/Reals/R_sqr/Rsqr_pos_lt.con +cic:/Coq/Reals/R_sqr/canonical_Rsqr.con +cic:/Coq/Reals/R_sqr/neg_pos_Rsqr_le.con +cic:/Coq/Reals/R_sqr/triangle_rectangle.con +cic:/Coq/Reals/R_sqr/triangle_rectangle_le.con +cic:/Coq/Reals/R_sqr/triangle_rectangle_lt.con +cic:/Coq/Reals/R_sqrt/Delta.con +cic:/Coq/Reals/R_sqrt/Delta_is_pos.con +cic:/Coq/Reals/R_sqrt/Rsqr_sol_eq_0_0.con +cic:/Coq/Reals/R_sqrt/Rsqr_sol_eq_0_1.con +cic:/Coq/Reals/R_sqrt/Rsqr_sqrt.con +cic:/Coq/Reals/R_sqrt/sol_x1.con +cic:/Coq/Reals/R_sqrt/sol_x2.con +cic:/Coq/Reals/R_sqrt/sqrt.con +cic:/Coq/Reals/R_sqrt/sqrt_0.con +cic:/Coq/Reals/R_sqrt/sqrt_1.con +cic:/Coq/Reals/R_sqrt/sqrt_Rsqr.con +cic:/Coq/Reals/R_sqrt/sqrt_Rsqr_abs.con +cic:/Coq/Reals/R_sqrt/sqrt_cauchy.con +cic:/Coq/Reals/R_sqrt/sqrt_def.con +cic:/Coq/Reals/R_sqrt/sqrt_div.con +cic:/Coq/Reals/R_sqrt/sqrt_eq_0.con +cic:/Coq/Reals/R_sqrt/sqrt_inj.con +cic:/Coq/Reals/R_sqrt/sqrt_le_0.con +cic:/Coq/Reals/R_sqrt/sqrt_le_1.con +cic:/Coq/Reals/R_sqrt/sqrt_lem_0.con +cic:/Coq/Reals/R_sqrt/sqrt_less.con +cic:/Coq/Reals/R_sqrt/sqrt_lt_0.con +cic:/Coq/Reals/R_sqrt/sqrt_lt_1.con +cic:/Coq/Reals/R_sqrt/sqrt_lt_R0.con +cic:/Coq/Reals/R_sqrt/sqrt_more.con +cic:/Coq/Reals/R_sqrt/sqrt_mult.con +cic:/Coq/Reals/R_sqrt/sqrt_positivity.con +cic:/Coq/Reals/R_sqrt/sqrt_sqrt.con +cic:/Coq/Reals/R_sqrt/sqrt_square.con +cic:/Coq/Reals/R_sqrt/sqtr_lem_1.con +cic:/Coq/Reals/Raxioms/INR.con +cic:/Coq/Reals/Raxioms/IZR.con +cic:/Coq/Reals/Raxioms/R1_neq_R0.con +cic:/Coq/Reals/Raxioms/Rinv_l.con +cic:/Coq/Reals/Raxioms/Rlt_asym.con +cic:/Coq/Reals/Raxioms/Rlt_trans.con +cic:/Coq/Reals/Raxioms/Rmult_1_l.con +cic:/Coq/Reals/Raxioms/Rmult_assoc.con +cic:/Coq/Reals/Raxioms/Rmult_comm.con +cic:/Coq/Reals/Raxioms/Rmult_lt_compat_l.con +cic:/Coq/Reals/Raxioms/Rmult_plus_distr_l.con +cic:/Coq/Reals/Raxioms/Rplus_0_l.con +cic:/Coq/Reals/Raxioms/Rplus_assoc.con +cic:/Coq/Reals/Raxioms/Rplus_comm.con +cic:/Coq/Reals/Raxioms/Rplus_lt_compat_l.con +cic:/Coq/Reals/Raxioms/Rplus_opp_r.con +cic:/Coq/Reals/Raxioms/archimed.con +cic:/Coq/Reals/Raxioms/bound.con +cic:/Coq/Reals/Raxioms/completeness.con +cic:/Coq/Reals/Raxioms/is_lub.con +cic:/Coq/Reals/Raxioms/is_upper_bound.con +cic:/Coq/Reals/Raxioms/total_order_T.con +cic:/Coq/Reals/Rbasic_fun/RRle_abs.con +cic:/Coq/Reals/Rbasic_fun/RRle_abs_subproof.con +cic:/Coq/Reals/Rbasic_fun/RRle_abs_subproof0.con +cic:/Coq/Reals/Rbasic_fun/Rabs.con +cic:/Coq/Reals/Rbasic_fun/Rabs_R0.con +cic:/Coq/Reals/Rbasic_fun/Rabs_R1.con +cic:/Coq/Reals/Rbasic_fun/Rabs_Rabsolu.con +cic:/Coq/Reals/Rbasic_fun/Rabs_Rinv.con +cic:/Coq/Reals/Rbasic_fun/Rabs_Ropp.con +cic:/Coq/Reals/Rbasic_fun/Rabs_Zabs.con +cic:/Coq/Reals/Rbasic_fun/Rabs_def1.con +cic:/Coq/Reals/Rbasic_fun/Rabs_def2.con +cic:/Coq/Reals/Rbasic_fun/Rabs_left.con +cic:/Coq/Reals/Rbasic_fun/Rabs_left1.con +cic:/Coq/Reals/Rbasic_fun/Rabs_minus_sym.con +cic:/Coq/Reals/Rbasic_fun/Rabs_mult.con +cic:/Coq/Reals/Rbasic_fun/Rabs_no_R0.con +cic:/Coq/Reals/Rbasic_fun/Rabs_pos.con +cic:/Coq/Reals/Rbasic_fun/Rabs_pos_eq.con +cic:/Coq/Reals/Rbasic_fun/Rabs_pos_lt.con +cic:/Coq/Reals/Rbasic_fun/Rabs_right.con +cic:/Coq/Reals/Rbasic_fun/Rabs_triang.con +cic:/Coq/Reals/Rbasic_fun/Rabs_triang_inv.con +cic:/Coq/Reals/Rbasic_fun/Rabs_triang_inv2.con +cic:/Coq/Reals/Rbasic_fun/Rcase_abs.con +cic:/Coq/Reals/Rbasic_fun/Rmax.con +cic:/Coq/Reals/Rbasic_fun/RmaxAbs.con +cic:/Coq/Reals/Rbasic_fun/RmaxLess1.con +cic:/Coq/Reals/Rbasic_fun/RmaxLess2.con +cic:/Coq/Reals/Rbasic_fun/RmaxRmult.con +cic:/Coq/Reals/Rbasic_fun/RmaxSym.con +cic:/Coq/Reals/Rbasic_fun/Rmax_Rle.con +cic:/Coq/Reals/Rbasic_fun/Rmax_stable_in_negreal.con +cic:/Coq/Reals/Rbasic_fun/Rmin.con +cic:/Coq/Reals/Rbasic_fun/Rmin_Rgt.con +cic:/Coq/Reals/Rbasic_fun/Rmin_Rgt_l.con +cic:/Coq/Reals/Rbasic_fun/Rmin_Rgt_r.con +cic:/Coq/Reals/Rbasic_fun/Rmin_comm.con +cic:/Coq/Reals/Rbasic_fun/Rmin_l.con +cic:/Coq/Reals/Rbasic_fun/Rmin_r.con +cic:/Coq/Reals/Rbasic_fun/Rmin_stable_in_posreal.con +cic:/Coq/Reals/Rcomplete/R_complete.con +cic:/Coq/Reals/Rdefinitions/R.con +cic:/Coq/Reals/Rdefinitions/R0.con +cic:/Coq/Reals/Rdefinitions/R1.con +cic:/Coq/Reals/Rdefinitions/Rdiv.con +cic:/Coq/Reals/Rdefinitions/Rge.con +cic:/Coq/Reals/Rdefinitions/Rgt.con +cic:/Coq/Reals/Rdefinitions/Rinv.con +cic:/Coq/Reals/Rdefinitions/Rle.con +cic:/Coq/Reals/Rdefinitions/Rlt.con +cic:/Coq/Reals/Rdefinitions/Rminus.con +cic:/Coq/Reals/Rdefinitions/Rmult.con +cic:/Coq/Reals/Rdefinitions/Ropp.con +cic:/Coq/Reals/Rdefinitions/Rplus.con +cic:/Coq/Reals/Rdefinitions/up.con +cic:/Coq/Reals/Rderiv/D_in.con +cic:/Coq/Reals/Rderiv/D_pow_n.con +cic:/Coq/Reals/Rderiv/D_x.con +cic:/Coq/Reals/Rderiv/Dadd.con +cic:/Coq/Reals/Rderiv/Dcomp.con +cic:/Coq/Reals/Rderiv/Dconst.con +cic:/Coq/Reals/Rderiv/Dminus.con +cic:/Coq/Reals/Rderiv/Dmult.con +cic:/Coq/Reals/Rderiv/Dmult_const.con +cic:/Coq/Reals/Rderiv/Dopp.con +cic:/Coq/Reals/Rderiv/Dx.con +cic:/Coq/Reals/Rderiv/Dx_pow_n.con +cic:/Coq/Reals/Rderiv/cont_deriv.con +cic:/Coq/Reals/Rderiv/cont_deriv_subproof.con +cic:/Coq/Reals/Rderiv/cont_deriv_subproof0.con +cic:/Coq/Reals/Rderiv/continue_in.con +cic:/Coq/Reals/Rfunctions/GP_finite.con +cic:/Coq/Reals/Rfunctions/INR_fact_neq_0.con +cic:/Coq/Reals/Rfunctions/Pow_x_infinity.con +cic:/Coq/Reals/Rfunctions/Power_monotonic.con +cic:/Coq/Reals/Rfunctions/RPow_abs.con +cic:/Coq/Reals/Rfunctions/R_dist.con +cic:/Coq/Reals/Rfunctions/R_dist_eq.con +cic:/Coq/Reals/Rfunctions/R_dist_plus.con +cic:/Coq/Reals/Rfunctions/R_dist_pos.con +cic:/Coq/Reals/Rfunctions/R_dist_refl.con +cic:/Coq/Reals/Rfunctions/R_dist_sym.con +cic:/Coq/Reals/Rfunctions/R_dist_tri.con +cic:/Coq/Reals/Rfunctions/Rinv_pow.con +cic:/Coq/Reals/Rfunctions/Rle_pow.con +cic:/Coq/Reals/Rfunctions/Rlt_pow.con +cic:/Coq/Reals/Rfunctions/Rlt_pow_R1.con +cic:/Coq/Reals/Rfunctions/Zpower_NR0.con +cic:/Coq/Reals/Rfunctions/Zpower_nat_powerRZ.con +cic:/Coq/Reals/Rfunctions/Zpower_nat_powerRZ_absolu.con +cic:/Coq/Reals/Rfunctions/decimal_exp.con +cic:/Coq/Reals/Rfunctions/fact_simpl.con +cic:/Coq/Reals/Rfunctions/infinit_sum.con +cic:/Coq/Reals/Rfunctions/poly.con +cic:/Coq/Reals/Rfunctions/pow.con +cic:/Coq/Reals/Rfunctions/pow1.con +cic:/Coq/Reals/Rfunctions/pow_1.con +cic:/Coq/Reals/Rfunctions/pow_1_abs.con +cic:/Coq/Reals/Rfunctions/pow_1_even.con +cic:/Coq/Reals/Rfunctions/pow_1_odd.con +cic:/Coq/Reals/Rfunctions/pow_O.con +cic:/Coq/Reals/Rfunctions/pow_R1.con +cic:/Coq/Reals/Rfunctions/pow_R1_Rle.con +cic:/Coq/Reals/Rfunctions/pow_RN_plus.con +cic:/Coq/Reals/Rfunctions/pow_Rabs.con +cic:/Coq/Reals/Rfunctions/pow_Rsqr.con +cic:/Coq/Reals/Rfunctions/pow_add.con +cic:/Coq/Reals/Rfunctions/pow_incr.con +cic:/Coq/Reals/Rfunctions/pow_le.con +cic:/Coq/Reals/Rfunctions/pow_lt.con +cic:/Coq/Reals/Rfunctions/pow_lt_1_zero.con +cic:/Coq/Reals/Rfunctions/pow_maj_Rabs.con +cic:/Coq/Reals/Rfunctions/pow_mult.con +cic:/Coq/Reals/Rfunctions/pow_ne_zero.con +cic:/Coq/Reals/Rfunctions/pow_nonzero.con +cic:/Coq/Reals/Rfunctions/powerRZ.con +cic:/Coq/Reals/Rfunctions/powerRZ_1.con +cic:/Coq/Reals/Rfunctions/powerRZ_NOR.con +cic:/Coq/Reals/Rfunctions/powerRZ_O.con +cic:/Coq/Reals/Rfunctions/powerRZ_R1.con +cic:/Coq/Reals/Rfunctions/powerRZ_add.con +cic:/Coq/Reals/Rfunctions/powerRZ_le.con +cic:/Coq/Reals/Rfunctions/powerRZ_lt.con +cic:/Coq/Reals/Rfunctions/simpl_fact.con +cic:/Coq/Reals/Rfunctions/sum_f.con +cic:/Coq/Reals/Rfunctions/sum_f_R0.con +cic:/Coq/Reals/Rfunctions/sum_f_R0_triangle.con +cic:/Coq/Reals/Rfunctions/sum_nat.con +cic:/Coq/Reals/Rfunctions/sum_nat_O.con +cic:/Coq/Reals/Rfunctions/sum_nat_f.con +cic:/Coq/Reals/Rfunctions/sum_nat_f_O.con +cic:/Coq/Reals/Rfunctions/tech_pow_Rmult.con +cic:/Coq/Reals/Rfunctions/tech_pow_Rplus.con +cic:/Coq/Reals/Rlimit/Base.con +cic:/Coq/Reals/Rlimit/Dgf.con +cic:/Coq/Reals/Rlimit/Metric_Space_ind.con +cic:/Coq/Reals/Rlimit/Metric_Space_rec.con +cic:/Coq/Reals/Rlimit/Metric_Space_rect.con +cic:/Coq/Reals/Rlimit/R_met.con +cic:/Coq/Reals/Rlimit/Rlt_eps2_eps.con +cic:/Coq/Reals/Rlimit/Rlt_eps2_eps_subproof.con +cic:/Coq/Reals/Rlimit/Rlt_eps2_eps_subproof0.con +cic:/Coq/Reals/Rlimit/Rlt_eps4_eps.con +cic:/Coq/Reals/Rlimit/Rlt_eps4_eps_subproof.con +cic:/Coq/Reals/Rlimit/Rlt_eps4_eps_subproof0.con +cic:/Coq/Reals/Rlimit/Rlt_eps4_eps_subproof1.con +cic:/Coq/Reals/Rlimit/adhDa.con +cic:/Coq/Reals/Rlimit/dist.con +cic:/Coq/Reals/Rlimit/dist_pos.con +cic:/Coq/Reals/Rlimit/dist_refl.con +cic:/Coq/Reals/Rlimit/dist_sym.con +cic:/Coq/Reals/Rlimit/dist_tri.con +cic:/Coq/Reals/Rlimit/eps2.con +cic:/Coq/Reals/Rlimit/eps2_Rgt_R0.con +cic:/Coq/Reals/Rlimit/eps2_Rgt_R0_subproof.con +cic:/Coq/Reals/Rlimit/eps4.con +cic:/Coq/Reals/Rlimit/lim_x.con +cic:/Coq/Reals/Rlimit/limit1_in.con +cic:/Coq/Reals/Rlimit/limit_Ropp.con +cic:/Coq/Reals/Rlimit/limit_comp.con +cic:/Coq/Reals/Rlimit/limit_free.con +cic:/Coq/Reals/Rlimit/limit_in.con +cic:/Coq/Reals/Rlimit/limit_inv.con +cic:/Coq/Reals/Rlimit/limit_minus.con +cic:/Coq/Reals/Rlimit/limit_mul.con +cic:/Coq/Reals/Rlimit/limit_plus.con +cic:/Coq/Reals/Rlimit/mul_factor.con +cic:/Coq/Reals/Rlimit/mul_factor_gt.con +cic:/Coq/Reals/Rlimit/mul_factor_gt_f.con +cic:/Coq/Reals/Rlimit/mul_factor_wd.con +cic:/Coq/Reals/Rlimit/prop_eps.con +cic:/Coq/Reals/Rlimit/single_limit.con +cic:/Coq/Reals/Rlimit/tech_limit.con +cic:/Coq/Reals/Rlimit/tech_limit_contr.con +cic:/Coq/Reals/Rpower/D_in_ext.con +cic:/Coq/Reals/Rpower/D_in_imp.con +cic:/Coq/Reals/Rpower/P_Rmin.con +cic:/Coq/Reals/Rpower/Rinv_Rdiv.con +cic:/Coq/Reals/Rpower/Rle_Rpower.con +cic:/Coq/Reals/Rpower/Rln.con +cic:/Coq/Reals/Rpower/Rpower.con +cic:/Coq/Reals/Rpower/Rpower_1.con +cic:/Coq/Reals/Rpower/Rpower_O.con +cic:/Coq/Reals/Rpower/Rpower_Ropp.con +cic:/Coq/Reals/Rpower/Rpower_lt.con +cic:/Coq/Reals/Rpower/Rpower_plus.con +cic:/Coq/Reals/Rpower/derivable_pt_lim_ln.con +cic:/Coq/Reals/Rpower/exp_Ropp.con +cic:/Coq/Reals/Rpower/exp_increasing.con +cic:/Coq/Reals/Rpower/exp_ineq1.con +cic:/Coq/Reals/Rpower/exp_inv.con +cic:/Coq/Reals/Rpower/exp_le_3.con +cic:/Coq/Reals/Rpower/exp_ln.con +cic:/Coq/Reals/Rpower/exp_lt_inv.con +cic:/Coq/Reals/Rpower/limit1_ext.con +cic:/Coq/Reals/Rpower/limit1_imp.con +cic:/Coq/Reals/Rpower/ln.con +cic:/Coq/Reals/Rpower/ln_1.con +cic:/Coq/Reals/Rpower/ln_Rinv.con +cic:/Coq/Reals/Rpower/ln_continue.con +cic:/Coq/Reals/Rpower/ln_exists.con +cic:/Coq/Reals/Rpower/ln_exists1.con +cic:/Coq/Reals/Rpower/ln_exp.con +cic:/Coq/Reals/Rpower/ln_increasing.con +cic:/Coq/Reals/Rpower/ln_inv.con +cic:/Coq/Reals/Rpower/ln_lt_2.con +cic:/Coq/Reals/Rpower/ln_lt_inv.con +cic:/Coq/Reals/Rpower/ln_mult.con +cic:/Coq/Reals/Rprod/C_maj.con +cic:/Coq/Reals/Rprod/INR_fact_lt_0.con +cic:/Coq/Reals/Rprod/RfactN_fact2N_factk.con +cic:/Coq/Reals/Rprod/fact_prodSO.con +cic:/Coq/Reals/Rprod/le_n_2n.con +cic:/Coq/Reals/Rprod/prod_SO_Rle.con +cic:/Coq/Reals/Rprod/prod_SO_pos.con +cic:/Coq/Reals/Rprod/prod_SO_split.con +cic:/Coq/Reals/Rprod/prod_f_SO.con +cic:/Coq/Reals/Rseries/Cauchy_crit.con +cic:/Coq/Reals/Rseries/EUn.con +cic:/Coq/Reals/Rseries/EUn_noempty.con +cic:/Coq/Reals/Rseries/GP_infinite.con +cic:/Coq/Reals/Rseries/Pser.con +cic:/Coq/Reals/Rseries/Rmax_N.con +cic:/Coq/Reals/Rseries/Un_bound_imp.con +cic:/Coq/Reals/Rseries/Un_cv.con +cic:/Coq/Reals/Rseries/Un_cv_crit.con +cic:/Coq/Reals/Rseries/Un_growing.con +cic:/Coq/Reals/Rseries/Un_in_EUn.con +cic:/Coq/Reals/Rseries/cauchy_bound.con +cic:/Coq/Reals/Rseries/finite_greater.con +cic:/Coq/Reals/Rseries/growing_prop.con +cic:/Coq/Reals/Rsigma/sigma.con +cic:/Coq/Reals/Rsigma/sigma_diff.con +cic:/Coq/Reals/Rsigma/sigma_diff_neg.con +cic:/Coq/Reals/Rsigma/sigma_eq_arg.con +cic:/Coq/Reals/Rsigma/sigma_first.con +cic:/Coq/Reals/Rsigma/sigma_last.con +cic:/Coq/Reals/Rsigma/sigma_split.con +cic:/Coq/Reals/Rsqrt_def/Dichotomy_lb.con +cic:/Coq/Reals/Rsqrt_def/Dichotomy_ub.con +cic:/Coq/Reals/Rsqrt_def/IVT.con +cic:/Coq/Reals/Rsqrt_def/IVT_cor.con +cic:/Coq/Reals/Rsqrt_def/Rsqrt.con +cic:/Coq/Reals/Rsqrt_def/Rsqrt_Rsqrt.con +cic:/Coq/Reals/Rsqrt_def/Rsqrt_exists.con +cic:/Coq/Reals/Rsqrt_def/Rsqrt_positivity.con +cic:/Coq/Reals/Rsqrt_def/cond_positivity.con +cic:/Coq/Reals/Rsqrt_def/continuity_seq.con +cic:/Coq/Reals/Rsqrt_def/cv_dicho.con +cic:/Coq/Reals/Rsqrt_def/dicho_comp.con +cic:/Coq/Reals/Rsqrt_def/dicho_lb.con +cic:/Coq/Reals/Rsqrt_def/dicho_lb_car.con +cic:/Coq/Reals/Rsqrt_def/dicho_lb_cv.con +cic:/Coq/Reals/Rsqrt_def/dicho_lb_dicho_up.con +cic:/Coq/Reals/Rsqrt_def/dicho_lb_growing.con +cic:/Coq/Reals/Rsqrt_def/dicho_lb_maj.con +cic:/Coq/Reals/Rsqrt_def/dicho_lb_maj_y.con +cic:/Coq/Reals/Rsqrt_def/dicho_up.con +cic:/Coq/Reals/Rsqrt_def/dicho_up_car.con +cic:/Coq/Reals/Rsqrt_def/dicho_up_cv.con +cic:/Coq/Reals/Rsqrt_def/dicho_up_decreasing.con +cic:/Coq/Reals/Rsqrt_def/dicho_up_min.con +cic:/Coq/Reals/Rsqrt_def/dicho_up_min_x.con +cic:/Coq/Reals/Rsqrt_def/pow_2_n.con +cic:/Coq/Reals/Rsqrt_def/pow_2_n_growing.con +cic:/Coq/Reals/Rsqrt_def/pow_2_n_infty.con +cic:/Coq/Reals/Rsqrt_def/pow_2_n_neq_R0.con +cic:/Coq/Reals/Rtopology/Bolzano_Weierstrass.con +cic:/Coq/Reals/Rtopology/Heine.con +cic:/Coq/Reals/Rtopology/Rlt_Rminus.con +cic:/Coq/Reals/Rtopology/Rsepare.con +cic:/Coq/Reals/Rtopology/ValAdh.con +cic:/Coq/Reals/Rtopology/ValAdh_un.con +cic:/Coq/Reals/Rtopology/ValAdh_un_exists.con +cic:/Coq/Reals/Rtopology/ValAdh_un_prop.con +cic:/Coq/Reals/Rtopology/adherence.con +cic:/Coq/Reals/Rtopology/adherence_P1.con +cic:/Coq/Reals/Rtopology/adherence_P2.con +cic:/Coq/Reals/Rtopology/adherence_P3.con +cic:/Coq/Reals/Rtopology/adherence_P4.con +cic:/Coq/Reals/Rtopology/bounded.con +cic:/Coq/Reals/Rtopology/closed_set.con +cic:/Coq/Reals/Rtopology/closed_set_P1.con +cic:/Coq/Reals/Rtopology/compact.con +cic:/Coq/Reals/Rtopology/compact_EMP.con +cic:/Coq/Reals/Rtopology/compact_P1.con +cic:/Coq/Reals/Rtopology/compact_P2.con +cic:/Coq/Reals/Rtopology/compact_P3.con +cic:/Coq/Reals/Rtopology/compact_P4.con +cic:/Coq/Reals/Rtopology/compact_P5.con +cic:/Coq/Reals/Rtopology/compact_P6.con +cic:/Coq/Reals/Rtopology/compact_carac.con +cic:/Coq/Reals/Rtopology/compact_eqDom.con +cic:/Coq/Reals/Rtopology/complementary.con +cic:/Coq/Reals/Rtopology/complementary_P1.con +cic:/Coq/Reals/Rtopology/cond_fam.con +cic:/Coq/Reals/Rtopology/continuity_P1.con +cic:/Coq/Reals/Rtopology/continuity_P2.con +cic:/Coq/Reals/Rtopology/continuity_P3.con +cic:/Coq/Reals/Rtopology/continuity_ab_maj.con +cic:/Coq/Reals/Rtopology/continuity_ab_min.con +cic:/Coq/Reals/Rtopology/continuity_compact.con +cic:/Coq/Reals/Rtopology/covering.con +cic:/Coq/Reals/Rtopology/covering_finite.con +cic:/Coq/Reals/Rtopology/covering_open_set.con +cic:/Coq/Reals/Rtopology/disc.con +cic:/Coq/Reals/Rtopology/disc_P1.con +cic:/Coq/Reals/Rtopology/domain_P1.con +cic:/Coq/Reals/Rtopology/domain_finite.con +cic:/Coq/Reals/Rtopology/eq_Dom.con +cic:/Coq/Reals/Rtopology/f.con +cic:/Coq/Reals/Rtopology/family_P1.con +cic:/Coq/Reals/Rtopology/family_closed_set.con +cic:/Coq/Reals/Rtopology/family_finite.con +cic:/Coq/Reals/Rtopology/family_ind.con +cic:/Coq/Reals/Rtopology/family_open_set.con +cic:/Coq/Reals/Rtopology/family_rec.con +cic:/Coq/Reals/Rtopology/family_rect.con +cic:/Coq/Reals/Rtopology/image_dir.con +cic:/Coq/Reals/Rtopology/image_rec.con +cic:/Coq/Reals/Rtopology/included.con +cic:/Coq/Reals/Rtopology/included_trans.con +cic:/Coq/Reals/Rtopology/ind.con +cic:/Coq/Reals/Rtopology/interior.con +cic:/Coq/Reals/Rtopology/interior_P1.con +cic:/Coq/Reals/Rtopology/interior_P2.con +cic:/Coq/Reals/Rtopology/interior_P3.con +cic:/Coq/Reals/Rtopology/intersection_domain.con +cic:/Coq/Reals/Rtopology/intersection_family.con +cic:/Coq/Reals/Rtopology/intersection_vide_finite_in.con +cic:/Coq/Reals/Rtopology/intersection_vide_in.con +cic:/Coq/Reals/Rtopology/is_lub_u.con +cic:/Coq/Reals/Rtopology/neighbourhood.con +cic:/Coq/Reals/Rtopology/neighbourhood_P1.con +cic:/Coq/Reals/Rtopology/open_set.con +cic:/Coq/Reals/Rtopology/open_set_P1.con +cic:/Coq/Reals/Rtopology/open_set_P2.con +cic:/Coq/Reals/Rtopology/open_set_P3.con +cic:/Coq/Reals/Rtopology/open_set_P4.con +cic:/Coq/Reals/Rtopology/open_set_P5.con +cic:/Coq/Reals/Rtopology/open_set_P6.con +cic:/Coq/Reals/Rtopology/point_adherent.con +cic:/Coq/Reals/Rtopology/prolongement_C0.con +cic:/Coq/Reals/Rtopology/restriction_family.con +cic:/Coq/Reals/Rtopology/subfamily.con +cic:/Coq/Reals/Rtopology/uniform_continuity.con +cic:/Coq/Reals/Rtopology/union_domain.con +cic:/Coq/Reals/Rtrigo/COS.con +cic:/Coq/Reals/Rtrigo/COS_bound.con +cic:/Coq/Reals/Rtrigo/PI2_RGT_0.con +cic:/Coq/Reals/Rtrigo/PI2_Rlt_PI.con +cic:/Coq/Reals/Rtrigo/PI4_RLT_PI2.con +cic:/Coq/Reals/Rtrigo/PI_neq0.con +cic:/Coq/Reals/Rtrigo/SIN.con +cic:/Coq/Reals/Rtrigo/SIN_bound.con +cic:/Coq/Reals/Rtrigo/_PI2_RLT_0.con +cic:/Coq/Reals/Rtrigo/cos2.con +cic:/Coq/Reals/Rtrigo/cos_2PI.con +cic:/Coq/Reals/Rtrigo/cos_2a.con +cic:/Coq/Reals/Rtrigo/cos_2a_cos.con +cic:/Coq/Reals/Rtrigo/cos_2a_sin.con +cic:/Coq/Reals/Rtrigo/cos_3PI2.con +cic:/Coq/Reals/Rtrigo/cos_PI.con +cic:/Coq/Reals/Rtrigo/cos_PI2.con +cic:/Coq/Reals/Rtrigo/cos_decr_0.con +cic:/Coq/Reals/Rtrigo/cos_decr_1.con +cic:/Coq/Reals/Rtrigo/cos_decreasing_0.con +cic:/Coq/Reals/Rtrigo/cos_decreasing_1.con +cic:/Coq/Reals/Rtrigo/cos_eq_0_1.con +cic:/Coq/Reals/Rtrigo/cos_eq_0_2PI_0.con +cic:/Coq/Reals/Rtrigo/cos_eq_0_2PI_1.con +cic:/Coq/Reals/Rtrigo/cos_ge_0.con +cic:/Coq/Reals/Rtrigo/cos_gt_0.con +cic:/Coq/Reals/Rtrigo/cos_incr_0.con +cic:/Coq/Reals/Rtrigo/cos_incr_1.con +cic:/Coq/Reals/Rtrigo/cos_increasing_0.con +cic:/Coq/Reals/Rtrigo/cos_increasing_1.con +cic:/Coq/Reals/Rtrigo/cos_lb.con +cic:/Coq/Reals/Rtrigo/cos_le_0.con +cic:/Coq/Reals/Rtrigo/cos_lt_0.con +cic:/Coq/Reals/Rtrigo/cos_minus.con +cic:/Coq/Reals/Rtrigo/cos_neg.con +cic:/Coq/Reals/Rtrigo/cos_period.con +cic:/Coq/Reals/Rtrigo/cos_shift.con +cic:/Coq/Reals/Rtrigo/cos_sin.con +cic:/Coq/Reals/Rtrigo/cos_sin_0.con +cic:/Coq/Reals/Rtrigo/cos_sin_0_var.con +cic:/Coq/Reals/Rtrigo/cos_ub.con +cic:/Coq/Reals/Rtrigo/form1.con +cic:/Coq/Reals/Rtrigo/form2.con +cic:/Coq/Reals/Rtrigo/form3.con +cic:/Coq/Reals/Rtrigo/form4.con +cic:/Coq/Reals/Rtrigo/neg_cos.con +cic:/Coq/Reals/Rtrigo/neg_sin.con +cic:/Coq/Reals/Rtrigo/sin2.con +cic:/Coq/Reals/Rtrigo/sin2_cos2.con +cic:/Coq/Reals/Rtrigo/sin_2PI.con +cic:/Coq/Reals/Rtrigo/sin_2a.con +cic:/Coq/Reals/Rtrigo/sin_PI.con +cic:/Coq/Reals/Rtrigo/sin_PI2.con +cic:/Coq/Reals/Rtrigo/sin_PI_x.con +cic:/Coq/Reals/Rtrigo/sin_cos.con +cic:/Coq/Reals/Rtrigo/sin_decr_0.con +cic:/Coq/Reals/Rtrigo/sin_decr_1.con +cic:/Coq/Reals/Rtrigo/sin_decreasing_0.con +cic:/Coq/Reals/Rtrigo/sin_decreasing_1.con +cic:/Coq/Reals/Rtrigo/sin_eq_0_0.con +cic:/Coq/Reals/Rtrigo/sin_eq_0_1.con +cic:/Coq/Reals/Rtrigo/sin_eq_O_2PI_0.con +cic:/Coq/Reals/Rtrigo/sin_eq_O_2PI_1.con +cic:/Coq/Reals/Rtrigo/sin_ge_0.con +cic:/Coq/Reals/Rtrigo/sin_gt_0.con +cic:/Coq/Reals/Rtrigo/sin_incr_0.con +cic:/Coq/Reals/Rtrigo/sin_incr_1.con +cic:/Coq/Reals/Rtrigo/sin_increasing_0.con +cic:/Coq/Reals/Rtrigo/sin_increasing_1.con +cic:/Coq/Reals/Rtrigo/sin_lb.con +cic:/Coq/Reals/Rtrigo/sin_lb_gt_0.con +cic:/Coq/Reals/Rtrigo/sin_le_0.con +cic:/Coq/Reals/Rtrigo/sin_lt_0.con +cic:/Coq/Reals/Rtrigo/sin_minus.con +cic:/Coq/Reals/Rtrigo/sin_neg.con +cic:/Coq/Reals/Rtrigo/sin_period.con +cic:/Coq/Reals/Rtrigo/sin_plus.con +cic:/Coq/Reals/Rtrigo/sin_shift.con +cic:/Coq/Reals/Rtrigo/sin_ub.con +cic:/Coq/Reals/Rtrigo/tan.con +cic:/Coq/Reals/Rtrigo/tan_0.con +cic:/Coq/Reals/Rtrigo/tan_2a.con +cic:/Coq/Reals/Rtrigo/tan_diff.con +cic:/Coq/Reals/Rtrigo/tan_gt_0.con +cic:/Coq/Reals/Rtrigo/tan_incr_0.con +cic:/Coq/Reals/Rtrigo/tan_incr_1.con +cic:/Coq/Reals/Rtrigo/tan_increasing_0.con +cic:/Coq/Reals/Rtrigo/tan_increasing_1.con +cic:/Coq/Reals/Rtrigo/tan_lt_0.con +cic:/Coq/Reals/Rtrigo/tan_minus.con +cic:/Coq/Reals/Rtrigo/tan_neg.con +cic:/Coq/Reals/Rtrigo/tan_plus.con +cic:/Coq/Reals/Rtrigo_alt/PI_4.con +cic:/Coq/Reals/Rtrigo_alt/cos_approx.con +cic:/Coq/Reals/Rtrigo_alt/cos_bound.con +cic:/Coq/Reals/Rtrigo_alt/cos_term.con +cic:/Coq/Reals/Rtrigo_alt/sin_approx.con +cic:/Coq/Reals/Rtrigo_alt/sin_bound.con +cic:/Coq/Reals/Rtrigo_alt/sin_term.con +cic:/Coq/Reals/Rtrigo_calc/PI4_RGT_0.con +cic:/Coq/Reals/Rtrigo_calc/PI6_RGT_0.con +cic:/Coq/Reals/Rtrigo_calc/PI6_RLT_PI2.con +cic:/Coq/Reals/Rtrigo_calc/R1_sqrt2_neq_0.con +cic:/Coq/Reals/Rtrigo_calc/Rgt_2PI_0.con +cic:/Coq/Reals/Rtrigo_calc/Rgt_3PI2_0.con +cic:/Coq/Reals/Rtrigo_calc/Rlt_3PI2_2PI.con +cic:/Coq/Reals/Rtrigo_calc/Rlt_PI_3PI2.con +cic:/Coq/Reals/Rtrigo_calc/Rlt_sqrt2_0.con +cic:/Coq/Reals/Rtrigo_calc/Rlt_sqrt3_0.con +cic:/Coq/Reals/Rtrigo_calc/Rsqr_sin_cos_d_one.con +cic:/Coq/Reals/Rtrigo_calc/cos3PI4.con +cic:/Coq/Reals/Rtrigo_calc/cos_2PI3.con +cic:/Coq/Reals/Rtrigo_calc/cos_5PI4.con +cic:/Coq/Reals/Rtrigo_calc/cos_PI3.con +cic:/Coq/Reals/Rtrigo_calc/cos_PI4.con +cic:/Coq/Reals/Rtrigo_calc/cos_PI6.con +cic:/Coq/Reals/Rtrigo_calc/cosd.con +cic:/Coq/Reals/Rtrigo_calc/deg_rad.con +cic:/Coq/Reals/Rtrigo_calc/plat.con +cic:/Coq/Reals/Rtrigo_calc/rad_deg.con +cic:/Coq/Reals/Rtrigo_calc/sin3PI4.con +cic:/Coq/Reals/Rtrigo_calc/sin_2PI3.con +cic:/Coq/Reals/Rtrigo_calc/sin_3PI2.con +cic:/Coq/Reals/Rtrigo_calc/sin_5PI4.con +cic:/Coq/Reals/Rtrigo_calc/sin_PI3.con +cic:/Coq/Reals/Rtrigo_calc/sin_PI3_cos_PI6.con +cic:/Coq/Reals/Rtrigo_calc/sin_PI4.con +cic:/Coq/Reals/Rtrigo_calc/sin_PI6.con +cic:/Coq/Reals/Rtrigo_calc/sin_PI6_cos_PI3.con +cic:/Coq/Reals/Rtrigo_calc/sin_cos5PI4.con +cic:/Coq/Reals/Rtrigo_calc/sin_cos_PI4.con +cic:/Coq/Reals/Rtrigo_calc/sin_lb_ge_0.con +cic:/Coq/Reals/Rtrigo_calc/sind.con +cic:/Coq/Reals/Rtrigo_calc/sqrt2_neq_0.con +cic:/Coq/Reals/Rtrigo_calc/sqrt3_2_neq_0.con +cic:/Coq/Reals/Rtrigo_calc/tan_2PI.con +cic:/Coq/Reals/Rtrigo_calc/tan_2PI3.con +cic:/Coq/Reals/Rtrigo_calc/tan_PI.con +cic:/Coq/Reals/Rtrigo_calc/tan_PI3.con +cic:/Coq/Reals/Rtrigo_calc/tan_PI6.con +cic:/Coq/Reals/Rtrigo_calc/tand.con +cic:/Coq/Reals/Rtrigo_calc/toDeg.con +cic:/Coq/Reals/Rtrigo_calc/toRad.con +cic:/Coq/Reals/Rtrigo_calc/toRad_inj.con +cic:/Coq/Reals/Rtrigo_def/Alembert_cos.con +cic:/Coq/Reals/Rtrigo_def/Alembert_sin.con +cic:/Coq/Reals/Rtrigo_def/archimed_cor1.con +cic:/Coq/Reals/Rtrigo_def/cos.con +cic:/Coq/Reals/Rtrigo_def/cos_0.con +cic:/Coq/Reals/Rtrigo_def/cos_in.con +cic:/Coq/Reals/Rtrigo_def/cos_n.con +cic:/Coq/Reals/Rtrigo_def/cos_sym.con +cic:/Coq/Reals/Rtrigo_def/cosh.con +cic:/Coq/Reals/Rtrigo_def/cosh_0.con +cic:/Coq/Reals/Rtrigo_def/cosn_no_R0.con +cic:/Coq/Reals/Rtrigo_def/exist_cos.con +cic:/Coq/Reals/Rtrigo_def/exist_cos0.con +cic:/Coq/Reals/Rtrigo_def/exist_exp.con +cic:/Coq/Reals/Rtrigo_def/exist_exp0.con +cic:/Coq/Reals/Rtrigo_def/exist_sin.con +cic:/Coq/Reals/Rtrigo_def/exp.con +cic:/Coq/Reals/Rtrigo_def/exp_0.con +cic:/Coq/Reals/Rtrigo_def/exp_cof_no_R0.con +cic:/Coq/Reals/Rtrigo_def/exp_in.con +cic:/Coq/Reals/Rtrigo_def/pow_i.con +cic:/Coq/Reals/Rtrigo_def/simpl_cos_n.con +cic:/Coq/Reals/Rtrigo_def/simpl_sin_n.con +cic:/Coq/Reals/Rtrigo_def/sin.con +cic:/Coq/Reals/Rtrigo_def/sin_0.con +cic:/Coq/Reals/Rtrigo_def/sin_antisym.con +cic:/Coq/Reals/Rtrigo_def/sin_in.con +cic:/Coq/Reals/Rtrigo_def/sin_n.con +cic:/Coq/Reals/Rtrigo_def/sin_no_R0.con +cic:/Coq/Reals/Rtrigo_def/sinh.con +cic:/Coq/Reals/Rtrigo_def/sinh_0.con +cic:/Coq/Reals/Rtrigo_def/tanh.con +cic:/Coq/Reals/Rtrigo_fun/Alembert_exp.con +cic:/Coq/Reals/Rtrigo_reg/CVN_R_cos.con +cic:/Coq/Reals/Rtrigo_reg/CVN_R_sin.con +cic:/Coq/Reals/Rtrigo_reg/continuity_cos.con +cic:/Coq/Reals/Rtrigo_reg/continuity_sin.con +cic:/Coq/Reals/Rtrigo_reg/derivable_cos.con +cic:/Coq/Reals/Rtrigo_reg/derivable_pt_cos.con +cic:/Coq/Reals/Rtrigo_reg/derivable_pt_lim_sin.con +cic:/Coq/Reals/Rtrigo_reg/derivable_pt_lim_sin_0.con +cic:/Coq/Reals/Rtrigo_reg/derivable_pt_sin.con +cic:/Coq/Reals/Rtrigo_reg/derivable_sin.con +cic:/Coq/Reals/Rtrigo_reg/derive_pt_cos.con +cic:/Coq/Reals/Rtrigo_reg/derive_pt_sin.con +cic:/Coq/Reals/SeqProp/CV_Cauchy.con +cic:/Coq/Reals/SeqProp/CV_minus.con +cic:/Coq/Reals/SeqProp/CV_mult.con +cic:/Coq/Reals/SeqProp/CV_opp.con +cic:/Coq/Reals/SeqProp/CV_plus.con +cic:/Coq/Reals/SeqProp/UL_sequence.con +cic:/Coq/Reals/SeqProp/Un_decreasing.con +cic:/Coq/Reals/SeqProp/Vn_Un_Wn_order.con +cic:/Coq/Reals/SeqProp/Vn_growing.con +cic:/Coq/Reals/SeqProp/Wn_decreasing.con +cic:/Coq/Reals/SeqProp/approx_maj.con +cic:/Coq/Reals/SeqProp/approx_min.con +cic:/Coq/Reals/SeqProp/cauchy_maj.con +cic:/Coq/Reals/SeqProp/cauchy_min.con +cic:/Coq/Reals/SeqProp/cauchy_opp.con +cic:/Coq/Reals/SeqProp/cond_eq.con +cic:/Coq/Reals/SeqProp/cv_cvabs.con +cic:/Coq/Reals/SeqProp/cv_infty.con +cic:/Coq/Reals/SeqProp/cv_infty_cv_R0.con +cic:/Coq/Reals/SeqProp/cv_speed_pow_fact.con +cic:/Coq/Reals/SeqProp/decreasing_cv.con +cic:/Coq/Reals/SeqProp/decreasing_growing.con +cic:/Coq/Reals/SeqProp/decreasing_ineq.con +cic:/Coq/Reals/SeqProp/decreasing_prop.con +cic:/Coq/Reals/SeqProp/growing_cv.con +cic:/Coq/Reals/SeqProp/growing_ineq.con +cic:/Coq/Reals/SeqProp/has_lb.con +cic:/Coq/Reals/SeqProp/has_ub.con +cic:/Coq/Reals/SeqProp/maj_by_pos.con +cic:/Coq/Reals/SeqProp/maj_cv.con +cic:/Coq/Reals/SeqProp/maj_min.con +cic:/Coq/Reals/SeqProp/maj_ss.con +cic:/Coq/Reals/SeqProp/maj_sup.con +cic:/Coq/Reals/SeqProp/majorant.con +cic:/Coq/Reals/SeqProp/min_cv.con +cic:/Coq/Reals/SeqProp/min_inf.con +cic:/Coq/Reals/SeqProp/min_maj.con +cic:/Coq/Reals/SeqProp/min_ss.con +cic:/Coq/Reals/SeqProp/minorant.con +cic:/Coq/Reals/SeqProp/not_Rlt.con +cic:/Coq/Reals/SeqProp/opp_seq.con +cic:/Coq/Reals/SeqProp/sequence_majorant.con +cic:/Coq/Reals/SeqProp/sequence_minorant.con +cic:/Coq/Reals/SeqProp/tech10.con +cic:/Coq/Reals/SeqProp/tech13.con +cic:/Coq/Reals/SeqProp/tech9.con +cic:/Coq/Reals/SeqSeries/Cesaro.con +cic:/Coq/Reals/SeqSeries/Cesaro_1.con +cic:/Coq/Reals/SeqSeries/Rseries_CV_comp.con +cic:/Coq/Reals/SeqSeries/sum_maj1.con +cic:/Coq/Reals/Sqrt_reg/continuity_pt_sqrt.con +cic:/Coq/Reals/Sqrt_reg/derivable_pt_sqrt.con +cic:/Coq/Reals/Sqrt_reg/derive_pt_sqrt.con +cic:/Coq/Reals/Sqrt_reg/sqrt_continuity_pt.con +cic:/Coq/Reals/Sqrt_reg/sqrt_continuity_pt_R1.con +cic:/Coq/Reals/Sqrt_reg/sqrt_var_maj.con +cic:/Coq/Relations/Newman/Diagram.con +cic:/Coq/Relations/Newman/Ind_proof.con +cic:/Coq/Relations/Newman/Newman.con +cic:/Coq/Relations/Newman/Rstar_coherence.con +cic:/Coq/Relations/Newman/caseRxy.con +cic:/Coq/Relations/Newman/coherence.con +cic:/Coq/Relations/Newman/coherence_intro.con +cic:/Coq/Relations/Newman/coherence_sym.con +cic:/Coq/Relations/Newman/confluence.con +cic:/Coq/Relations/Newman/local_confluence.con +cic:/Coq/Relations/Newman/noetherian.con +cic:/Coq/Relations/Operators_Properties/clos_refl_trans_ind_left.con +cic:/Coq/Relations/Operators_Properties/clos_rst_idempotent.con +cic:/Coq/Relations/Operators_Properties/clos_rst_is_equiv.con +cic:/Coq/Relations/Operators_Properties/clos_rt_clos_rst.con +cic:/Coq/Relations/Operators_Properties/clos_rt_idempotent.con +cic:/Coq/Relations/Operators_Properties/clos_rt_is_preorder.con +cic:/Coq/Relations/Relation_Definitions/PER_ind.con +cic:/Coq/Relations/Relation_Definitions/PER_rec.con +cic:/Coq/Relations/Relation_Definitions/PER_rect.con +cic:/Coq/Relations/Relation_Definitions/antisymmetric.con +cic:/Coq/Relations/Relation_Definitions/commut.con +cic:/Coq/Relations/Relation_Definitions/equiv.con +cic:/Coq/Relations/Relation_Definitions/equiv_refl.con +cic:/Coq/Relations/Relation_Definitions/equiv_sym.con +cic:/Coq/Relations/Relation_Definitions/equiv_trans.con +cic:/Coq/Relations/Relation_Definitions/equivalence_ind.con +cic:/Coq/Relations/Relation_Definitions/equivalence_rec.con +cic:/Coq/Relations/Relation_Definitions/equivalence_rect.con +cic:/Coq/Relations/Relation_Definitions/inclusion.con +cic:/Coq/Relations/Relation_Definitions/ord_antisym.con +cic:/Coq/Relations/Relation_Definitions/ord_refl.con +cic:/Coq/Relations/Relation_Definitions/ord_trans.con +cic:/Coq/Relations/Relation_Definitions/order_ind.con +cic:/Coq/Relations/Relation_Definitions/order_rec.con +cic:/Coq/Relations/Relation_Definitions/order_rect.con +cic:/Coq/Relations/Relation_Definitions/per_sym.con +cic:/Coq/Relations/Relation_Definitions/per_trans.con +cic:/Coq/Relations/Relation_Definitions/preord_refl.con +cic:/Coq/Relations/Relation_Definitions/preord_trans.con +cic:/Coq/Relations/Relation_Definitions/preorder_ind.con +cic:/Coq/Relations/Relation_Definitions/preorder_rec.con +cic:/Coq/Relations/Relation_Definitions/preorder_rect.con +cic:/Coq/Relations/Relation_Definitions/reflexive.con +cic:/Coq/Relations/Relation_Definitions/relation.con +cic:/Coq/Relations/Relation_Definitions/same_relation.con +cic:/Coq/Relations/Relation_Definitions/symmetric.con +cic:/Coq/Relations/Relation_Definitions/transitive.con +cic:/Coq/Relations/Relation_Operators/Desc_ind.con +cic:/Coq/Relations/Relation_Operators/Ltl_ind.con +cic:/Coq/Relations/Relation_Operators/Pow.con +cic:/Coq/Relations/Relation_Operators/clos_refl_sym_trans_ind.con +cic:/Coq/Relations/Relation_Operators/clos_refl_trans_ind.con +cic:/Coq/Relations/Relation_Operators/clos_trans_ind.con +cic:/Coq/Relations/Relation_Operators/le_AsB_ind.con +cic:/Coq/Relations/Relation_Operators/lex_exp.con +cic:/Coq/Relations/Relation_Operators/lexprod_ind.con +cic:/Coq/Relations/Relation_Operators/swapprod_ind.con +cic:/Coq/Relations/Relation_Operators/symprod_ind.con +cic:/Coq/Relations/Relation_Operators/transp.con +cic:/Coq/Relations/Relation_Operators/union.con +cic:/Coq/Relations/Relations/inverse_image_of_eq.con +cic:/Coq/Relations/Relations/inverse_image_of_equivalence.con +cic:/Coq/Relations/Rstar/Rstar'.con +cic:/Coq/Relations/Rstar/Rstar'_R.con +cic:/Coq/Relations/Rstar/Rstar'_Rstar.con +cic:/Coq/Relations/Rstar/Rstar'_reflexive.con +cic:/Coq/Relations/Rstar/Rstar.con +cic:/Coq/Relations/Rstar/Rstar_R.con +cic:/Coq/Relations/Rstar/Rstar_Rstar'.con +cic:/Coq/Relations/Rstar/Rstar_reflexive.con +cic:/Coq/Relations/Rstar/Rstar_transitive.con +cic:/Coq/Relations/Rstar/commut.con +cic:/Coq/Setoids/Setoid/Prop_S.con +cic:/Coq/Setoids/Setoid/Seq_refl.con +cic:/Coq/Setoids/Setoid/Seq_sym.con +cic:/Coq/Setoids/Setoid/Seq_trans.con +cic:/Coq/Setoids/Setoid/Setoid_Theory_ind.con +cic:/Coq/Setoids/Setoid/Setoid_Theory_rec.con +cic:/Coq/Setoids/Setoid/Setoid_Theory_rect.con +cic:/Coq/Setoids/Setoid/and_ext.con +cic:/Coq/Setoids/Setoid/and_ext2.con +cic:/Coq/Setoids/Setoid/fleche.con +cic:/Coq/Setoids/Setoid/fleche_ext.con +cic:/Coq/Setoids/Setoid/fleche_ext2.con +cic:/Coq/Setoids/Setoid/not_ext.con +cic:/Coq/Setoids/Setoid/not_ext2.con +cic:/Coq/Setoids/Setoid/or_ext.con +cic:/Coq/Setoids/Setoid/or_ext2.con +cic:/Coq/Setoids/Setoid/setoid_eq_ext1.con +cic:/Coq/Setoids/Setoid/setoid_eq_ext2.con +cic:/Coq/Sets/Classical_sets/Complement_Complement.con +cic:/Coq/Sets/Classical_sets/Included_Strict_Included.con +cic:/Coq/Sets/Classical_sets/Inhabited_Setminus.con +cic:/Coq/Sets/Classical_sets/Strict_Included_inv.con +cic:/Coq/Sets/Classical_sets/Strict_super_set_contains_new_element.con +cic:/Coq/Sets/Classical_sets/Subtract_intro.con +cic:/Coq/Sets/Classical_sets/Subtract_inv.con +cic:/Coq/Sets/Classical_sets/not_SIncl_empty.con +cic:/Coq/Sets/Classical_sets/not_empty_Inhabited.con +cic:/Coq/Sets/Classical_sets/not_included_empty_Inhabited.con +cic:/Coq/Sets/Constructive_sets/Add_intro1.con +cic:/Coq/Sets/Constructive_sets/Add_intro2.con +cic:/Coq/Sets/Constructive_sets/Add_inv.con +cic:/Coq/Sets/Constructive_sets/Add_not_Empty.con +cic:/Coq/Sets/Constructive_sets/Couple_inv.con +cic:/Coq/Sets/Constructive_sets/Extension.con +cic:/Coq/Sets/Constructive_sets/Included_Empty.con +cic:/Coq/Sets/Constructive_sets/Inhabited_add.con +cic:/Coq/Sets/Constructive_sets/Inhabited_not_empty.con +cic:/Coq/Sets/Constructive_sets/Intersection_inv.con +cic:/Coq/Sets/Constructive_sets/Noone_in_empty.con +cic:/Coq/Sets/Constructive_sets/Setminus_intro.con +cic:/Coq/Sets/Constructive_sets/Singleton_intro.con +cic:/Coq/Sets/Constructive_sets/Singleton_inv.con +cic:/Coq/Sets/Constructive_sets/Strict_Included_intro.con +cic:/Coq/Sets/Constructive_sets/Strict_Included_strict.con +cic:/Coq/Sets/Constructive_sets/Union_inv.con +cic:/Coq/Sets/Constructive_sets/not_Empty_Add.con +cic:/Coq/Sets/Cpo/Bottom_ind.con +cic:/Coq/Sets/Cpo/Bottom_rec.con +cic:/Coq/Sets/Cpo/Bottom_rect.con +cic:/Coq/Sets/Cpo/Chain_cond.con +cic:/Coq/Sets/Cpo/Chain_ind.con +cic:/Coq/Sets/Cpo/Chain_rec.con +cic:/Coq/Sets/Cpo/Chain_rect.con +cic:/Coq/Sets/Cpo/Compatible.con +cic:/Coq/Sets/Cpo/Complete_ind.con +cic:/Coq/Sets/Cpo/Complete_rec.con +cic:/Coq/Sets/Cpo/Complete_rect.con +cic:/Coq/Sets/Cpo/Conditionally_complete_ind.con +cic:/Coq/Sets/Cpo/Conditionally_complete_rec.con +cic:/Coq/Sets/Cpo/Conditionally_complete_rect.con +cic:/Coq/Sets/Cpo/Cpo_cond.con +cic:/Coq/Sets/Cpo/Cpo_ind.con +cic:/Coq/Sets/Cpo/Cpo_rec.con +cic:/Coq/Sets/Cpo/Cpo_rect.con +cic:/Coq/Sets/Cpo/Directed_ind.con +cic:/Coq/Sets/Cpo/Directed_rec.con +cic:/Coq/Sets/Cpo/Directed_rect.con +cic:/Coq/Sets/Cpo/Glb_ind.con +cic:/Coq/Sets/Cpo/Glb_rec.con +cic:/Coq/Sets/Cpo/Glb_rect.con +cic:/Coq/Sets/Cpo/Lower_Bound_ind.con +cic:/Coq/Sets/Cpo/Lower_Bound_rec.con +cic:/Coq/Sets/Cpo/Lower_Bound_rect.con +cic:/Coq/Sets/Cpo/Lub_ind.con +cic:/Coq/Sets/Cpo/Lub_rec.con +cic:/Coq/Sets/Cpo/Lub_rect.con +cic:/Coq/Sets/Cpo/PO_of_chain.con +cic:/Coq/Sets/Cpo/PO_of_cpo.con +cic:/Coq/Sets/Cpo/Totally_ordered_ind.con +cic:/Coq/Sets/Cpo/Totally_ordered_rec.con +cic:/Coq/Sets/Cpo/Totally_ordered_rect.con +cic:/Coq/Sets/Cpo/Upper_Bound_ind.con +cic:/Coq/Sets/Cpo/Upper_Bound_rec.con +cic:/Coq/Sets/Cpo/Upper_Bound_rect.con +cic:/Coq/Sets/Ensembles/Add.con +cic:/Coq/Sets/Ensembles/Complement.con +cic:/Coq/Sets/Ensembles/Couple_ind.con +cic:/Coq/Sets/Ensembles/Disjoint_ind.con +cic:/Coq/Sets/Ensembles/Disjoint_rec.con +cic:/Coq/Sets/Ensembles/Disjoint_rect.con +cic:/Coq/Sets/Ensembles/Empty_set_ind.con +cic:/Coq/Sets/Ensembles/Empty_set_rec.con +cic:/Coq/Sets/Ensembles/Empty_set_rect.con +cic:/Coq/Sets/Ensembles/Ensemble.con +cic:/Coq/Sets/Ensembles/Extensionality_Ensembles.con +cic:/Coq/Sets/Ensembles/Full_set_ind.con +cic:/Coq/Sets/Ensembles/In.con +cic:/Coq/Sets/Ensembles/Included.con +cic:/Coq/Sets/Ensembles/Inhabited_ind.con +cic:/Coq/Sets/Ensembles/Intersection_ind.con +cic:/Coq/Sets/Ensembles/Same_set.con +cic:/Coq/Sets/Ensembles/Setminus.con +cic:/Coq/Sets/Ensembles/Singleton_ind.con +cic:/Coq/Sets/Ensembles/Singleton_rec.con +cic:/Coq/Sets/Ensembles/Singleton_rect.con +cic:/Coq/Sets/Ensembles/Strict_Included.con +cic:/Coq/Sets/Ensembles/Subtract.con +cic:/Coq/Sets/Ensembles/Triple_ind.con +cic:/Coq/Sets/Ensembles/Union_ind.con +cic:/Coq/Sets/Finite_sets/Finite_ind.con +cic:/Coq/Sets/Finite_sets/cardinal_elim.con +cic:/Coq/Sets/Finite_sets/cardinal_ind.con +cic:/Coq/Sets/Finite_sets/cardinal_invert.con +cic:/Coq/Sets/Finite_sets_facts/Add_preserves_Finite.con +cic:/Coq/Sets/Finite_sets_facts/Finite_downward_closed.con +cic:/Coq/Sets/Finite_sets_facts/G_aux.con +cic:/Coq/Sets/Finite_sets_facts/Generalized_induction_on_finite_sets.con +cic:/Coq/Sets/Finite_sets_facts/Intersection_preserves_finite.con +cic:/Coq/Sets/Finite_sets_facts/Singleton_is_finite.con +cic:/Coq/Sets/Finite_sets_facts/Union_preserves_Finite.con +cic:/Coq/Sets/Finite_sets_facts/card_Add_gen.con +cic:/Coq/Sets/Finite_sets_facts/card_soustr_1.con +cic:/Coq/Sets/Finite_sets_facts/cardinalO_empty.con +cic:/Coq/Sets/Finite_sets_facts/cardinal_Empty.con +cic:/Coq/Sets/Finite_sets_facts/cardinal_finite.con +cic:/Coq/Sets/Finite_sets_facts/cardinal_is_functional.con +cic:/Coq/Sets/Finite_sets_facts/cardinal_unicity.con +cic:/Coq/Sets/Finite_sets_facts/finite_cardinal.con +cic:/Coq/Sets/Finite_sets_facts/incl_card_le.con +cic:/Coq/Sets/Finite_sets_facts/incl_st_card_lt.con +cic:/Coq/Sets/Finite_sets_facts/inh_card_gt_O.con +cic:/Coq/Sets/Image/Im_add.con +cic:/Coq/Sets/Image/Im_def.con +cic:/Coq/Sets/Image/Im_ind.con +cic:/Coq/Sets/Image/Im_inv.con +cic:/Coq/Sets/Image/In_Image_elim.con +cic:/Coq/Sets/Image/Pigeonhole.con +cic:/Coq/Sets/Image/Pigeonhole_principle.con +cic:/Coq/Sets/Image/cardinal_Im_intro.con +cic:/Coq/Sets/Image/cardinal_decreases.con +cic:/Coq/Sets/Image/finite_image.con +cic:/Coq/Sets/Image/image_empty.con +cic:/Coq/Sets/Image/injective.con +cic:/Coq/Sets/Image/injective_preserves_cardinal.con +cic:/Coq/Sets/Image/not_injective_elim.con +cic:/Coq/Sets/Infinite_sets/Approximant_ind.con +cic:/Coq/Sets/Infinite_sets/Approximant_rec.con +cic:/Coq/Sets/Infinite_sets/Approximant_rect.con +cic:/Coq/Sets/Infinite_sets/Image_set_continuous'.con +cic:/Coq/Sets/Infinite_sets/Image_set_continuous.con +cic:/Coq/Sets/Infinite_sets/Pigeonhole_bis.con +cic:/Coq/Sets/Infinite_sets/Pigeonhole_ter.con +cic:/Coq/Sets/Infinite_sets/approximant_can_be_any_size.con +cic:/Coq/Sets/Infinite_sets/approximants_grow'.con +cic:/Coq/Sets/Infinite_sets/approximants_grow.con +cic:/Coq/Sets/Infinite_sets/make_new_approximant.con +cic:/Coq/Sets/Integers/Finite_subset_has_lub.con +cic:/Coq/Sets/Integers/Integers_has_no_ub.con +cic:/Coq/Sets/Integers/Integers_ind.con +cic:/Coq/Sets/Integers/Integers_infinite.con +cic:/Coq/Sets/Integers/le_Order.con +cic:/Coq/Sets/Integers/le_antisym.con +cic:/Coq/Sets/Integers/le_reflexive.con +cic:/Coq/Sets/Integers/le_total_order.con +cic:/Coq/Sets/Integers/le_trans.con +cic:/Coq/Sets/Integers/nat_po.con +cic:/Coq/Sets/Integers/triv_nat.con +cic:/Coq/Sets/Multiset/EmptyBag.con +cic:/Coq/Sets/Multiset/SingletonBag.con +cic:/Coq/Sets/Multiset/meq.con +cic:/Coq/Sets/Multiset/meq_congr.con +cic:/Coq/Sets/Multiset/meq_left.con +cic:/Coq/Sets/Multiset/meq_refl.con +cic:/Coq/Sets/Multiset/meq_right.con +cic:/Coq/Sets/Multiset/meq_sym.con +cic:/Coq/Sets/Multiset/meq_trans.con +cic:/Coq/Sets/Multiset/multiplicity.con +cic:/Coq/Sets/Multiset/multiset_ind.con +cic:/Coq/Sets/Multiset/multiset_rec.con +cic:/Coq/Sets/Multiset/multiset_rect.con +cic:/Coq/Sets/Multiset/multiset_twist1.con +cic:/Coq/Sets/Multiset/multiset_twist2.con +cic:/Coq/Sets/Multiset/munion.con +cic:/Coq/Sets/Multiset/munion_ass.con +cic:/Coq/Sets/Multiset/munion_comm.con +cic:/Coq/Sets/Multiset/munion_empty_left.con +cic:/Coq/Sets/Multiset/munion_empty_right.con +cic:/Coq/Sets/Multiset/munion_perm_left.con +cic:/Coq/Sets/Multiset/munion_rotate.con +cic:/Coq/Sets/Multiset/treesort_twist1.con +cic:/Coq/Sets/Multiset/treesort_twist2.con +cic:/Coq/Sets/Partial_Order/Carrier.con +cic:/Coq/Sets/Partial_Order/Carrier_of.con +cic:/Coq/Sets/Partial_Order/PO_cond1.con +cic:/Coq/Sets/Partial_Order/PO_cond2.con +cic:/Coq/Sets/Partial_Order/PO_ind.con +cic:/Coq/Sets/Partial_Order/PO_rec.con +cic:/Coq/Sets/Partial_Order/PO_rect.con +cic:/Coq/Sets/Partial_Order/Rel.con +cic:/Coq/Sets/Partial_Order/Rel_of.con +cic:/Coq/Sets/Partial_Order/Strict_Rel_Transitive.con +cic:/Coq/Sets/Partial_Order/Strict_Rel_Transitive_with_Rel.con +cic:/Coq/Sets/Partial_Order/Strict_Rel_Transitive_with_Rel_left.con +cic:/Coq/Sets/Partial_Order/Strict_Rel_of.con +cic:/Coq/Sets/Partial_Order/covers_ind.con +cic:/Coq/Sets/Partial_Order/covers_rec.con +cic:/Coq/Sets/Partial_Order/covers_rect.con +cic:/Coq/Sets/Permut/comm_left.con +cic:/Coq/Sets/Permut/comm_right.con +cic:/Coq/Sets/Permut/cong_congr.con +cic:/Coq/Sets/Permut/op_rotate.con +cic:/Coq/Sets/Permut/perm_left.con +cic:/Coq/Sets/Permut/perm_right.con +cic:/Coq/Sets/Permut/twist.con +cic:/Coq/Sets/Powerset/Empty_set_is_Bottom.con +cic:/Coq/Sets/Powerset/Empty_set_minimal.con +cic:/Coq/Sets/Powerset/Inclusion_is_an_order.con +cic:/Coq/Sets/Powerset/Inclusion_is_transitive.con +cic:/Coq/Sets/Powerset/Intersection_decreases_l.con +cic:/Coq/Sets/Powerset/Intersection_decreases_r.con +cic:/Coq/Sets/Powerset/Intersection_is_Glb.con +cic:/Coq/Sets/Powerset/Intersection_maximal.con +cic:/Coq/Sets/Powerset/Power_set_Inhabited.con +cic:/Coq/Sets/Powerset/Power_set_PO.con +cic:/Coq/Sets/Powerset/Power_set_ind.con +cic:/Coq/Sets/Powerset/Strict_Rel_is_Strict_Included.con +cic:/Coq/Sets/Powerset/Strict_inclusion_is_transitive.con +cic:/Coq/Sets/Powerset/Strict_inclusion_is_transitive_with_inclusion.con +cic:/Coq/Sets/Powerset/Strict_inclusion_is_transitive_with_inclusion_left.con +cic:/Coq/Sets/Powerset/Union_increases_l.con +cic:/Coq/Sets/Powerset/Union_increases_r.con +cic:/Coq/Sets/Powerset/Union_is_Lub.con +cic:/Coq/Sets/Powerset/Union_minimal.con +cic:/Coq/Sets/Powerset_Classical_facts/Add_covers.con +cic:/Coq/Sets/Powerset_Classical_facts/Included_Add.con +cic:/Coq/Sets/Powerset_Classical_facts/Simplify_add.con +cic:/Coq/Sets/Powerset_Classical_facts/Singleton_atomic.con +cic:/Coq/Sets/Powerset_Classical_facts/Sub_Add_new.con +cic:/Coq/Sets/Powerset_Classical_facts/add_soustr_1.con +cic:/Coq/Sets/Powerset_Classical_facts/add_soustr_2.con +cic:/Coq/Sets/Powerset_Classical_facts/add_soustr_xy.con +cic:/Coq/Sets/Powerset_Classical_facts/covers_Add.con +cic:/Coq/Sets/Powerset_Classical_facts/covers_is_Add.con +cic:/Coq/Sets/Powerset_Classical_facts/incl_soustr.con +cic:/Coq/Sets/Powerset_Classical_facts/incl_soustr_add_l.con +cic:/Coq/Sets/Powerset_Classical_facts/incl_soustr_add_r.con +cic:/Coq/Sets/Powerset_Classical_facts/incl_soustr_in.con +cic:/Coq/Sets/Powerset_Classical_facts/incl_st_add_soustr.con +cic:/Coq/Sets/Powerset_Classical_facts/less_than_singleton.con +cic:/Coq/Sets/Powerset_Classical_facts/setcover_inv.con +cic:/Coq/Sets/Powerset_Classical_facts/sincl_add_x.con +cic:/Coq/Sets/Powerset_facts/Add_commutative'.con +cic:/Coq/Sets/Powerset_facts/Add_commutative.con +cic:/Coq/Sets/Powerset_facts/Add_distributes.con +cic:/Coq/Sets/Powerset_facts/Couple_as_union.con +cic:/Coq/Sets/Powerset_facts/Distributivity'.con +cic:/Coq/Sets/Powerset_facts/Distributivity.con +cic:/Coq/Sets/Powerset_facts/Empty_set_zero'.con +cic:/Coq/Sets/Powerset_facts/Empty_set_zero.con +cic:/Coq/Sets/Powerset_facts/Intersection_commutative.con +cic:/Coq/Sets/Powerset_facts/Non_disjoint_union'.con +cic:/Coq/Sets/Powerset_facts/Non_disjoint_union.con +cic:/Coq/Sets/Powerset_facts/Triple_as_Couple.con +cic:/Coq/Sets/Powerset_facts/Triple_as_Couple_Singleton.con +cic:/Coq/Sets/Powerset_facts/Triple_as_union.con +cic:/Coq/Sets/Powerset_facts/Union_absorbs.con +cic:/Coq/Sets/Powerset_facts/Union_add.con +cic:/Coq/Sets/Powerset_facts/Union_associative.con +cic:/Coq/Sets/Powerset_facts/Union_commutative.con +cic:/Coq/Sets/Powerset_facts/Union_idempotent.con +cic:/Coq/Sets/Powerset_facts/incl_add.con +cic:/Coq/Sets/Powerset_facts/incl_add_x.con +cic:/Coq/Sets/Powerset_facts/less_than_empty.con +cic:/Coq/Sets/Powerset_facts/setcover_intro.con +cic:/Coq/Sets/Powerset_facts/singlx.con +cic:/Coq/Sets/Relations_1/Antisymmetric.con +cic:/Coq/Sets/Relations_1/Equivalence_ind.con +cic:/Coq/Sets/Relations_1/Equivalence_rec.con +cic:/Coq/Sets/Relations_1/Equivalence_rect.con +cic:/Coq/Sets/Relations_1/Order_ind.con +cic:/Coq/Sets/Relations_1/Order_rec.con +cic:/Coq/Sets/Relations_1/Order_rect.con +cic:/Coq/Sets/Relations_1/PER_ind.con +cic:/Coq/Sets/Relations_1/PER_rec.con +cic:/Coq/Sets/Relations_1/PER_rect.con +cic:/Coq/Sets/Relations_1/Preorder_ind.con +cic:/Coq/Sets/Relations_1/Preorder_rec.con +cic:/Coq/Sets/Relations_1/Preorder_rect.con +cic:/Coq/Sets/Relations_1/Reflexive.con +cic:/Coq/Sets/Relations_1/Relation.con +cic:/Coq/Sets/Relations_1/Symmetric.con +cic:/Coq/Sets/Relations_1/Transitive.con +cic:/Coq/Sets/Relations_1/contains.con +cic:/Coq/Sets/Relations_1/same_relation.con +cic:/Coq/Sets/Relations_1_facts/Complement.con +cic:/Coq/Sets/Relations_1_facts/Equiv_from_order.con +cic:/Coq/Sets/Relations_1_facts/Equiv_from_preorder.con +cic:/Coq/Sets/Relations_1_facts/Rsym_imp_notRsym.con +cic:/Coq/Sets/Relations_1_facts/cong_antisymmetric_same_relation.con +cic:/Coq/Sets/Relations_1_facts/cong_reflexive_same_relation.con +cic:/Coq/Sets/Relations_1_facts/cong_symmetric_same_relation.con +cic:/Coq/Sets/Relations_1_facts/cong_transitive_same_relation.con +cic:/Coq/Sets/Relations_1_facts/contains_is_preorder.con +cic:/Coq/Sets/Relations_1_facts/same_relation_is_equivalence.con +cic:/Coq/Sets/Relations_2/Rplus_ind.con +cic:/Coq/Sets/Relations_2/Rstar1_ind.con +cic:/Coq/Sets/Relations_2/Rstar_ind.con +cic:/Coq/Sets/Relations_2/Strongly_confluent.con +cic:/Coq/Sets/Relations_2_facts/Lemma1.con +cic:/Coq/Sets/Relations_2_facts/Rplus_contains_R.con +cic:/Coq/Sets/Relations_2_facts/RstarRplus_RRstar.con +cic:/Coq/Sets/Relations_2_facts/Rstar_cases.con +cic:/Coq/Sets/Relations_2_facts/Rstar_contains_R.con +cic:/Coq/Sets/Relations_2_facts/Rstar_contains_Rplus.con +cic:/Coq/Sets/Relations_2_facts/Rstar_equiv_Rstar1.con +cic:/Coq/Sets/Relations_2_facts/Rstar_reflexive.con +cic:/Coq/Sets/Relations_2_facts/Rstar_transitive.con +cic:/Coq/Sets/Relations_2_facts/Rsym_imp_Rstarsym.con +cic:/Coq/Sets/Relations_2_facts/Sstar_contains_Rstar.con +cic:/Coq/Sets/Relations_2_facts/star_monotone.con +cic:/Coq/Sets/Relations_3/Confluent.con +cic:/Coq/Sets/Relations_3/Locally_confluent.con +cic:/Coq/Sets/Relations_3/Noetherian.con +cic:/Coq/Sets/Relations_3/coherent.con +cic:/Coq/Sets/Relations_3/confluent.con +cic:/Coq/Sets/Relations_3/locally_confluent.con +cic:/Coq/Sets/Relations_3/noetherian_ind.con +cic:/Coq/Sets/Relations_3_facts/Newman.con +cic:/Coq/Sets/Relations_3_facts/Noetherian_contains_Noetherian.con +cic:/Coq/Sets/Relations_3_facts/Rstar_imp_coherent.con +cic:/Coq/Sets/Relations_3_facts/Strong_confluence.con +cic:/Coq/Sets/Relations_3_facts/Strong_confluence_direct.con +cic:/Coq/Sets/Relations_3_facts/coherent_symmetric.con +cic:/Coq/Sets/Uniset/Emptyset.con +cic:/Coq/Sets/Uniset/Fullset.con +cic:/Coq/Sets/Uniset/In.con +cic:/Coq/Sets/Uniset/Singleton.con +cic:/Coq/Sets/Uniset/charac.con +cic:/Coq/Sets/Uniset/incl.con +cic:/Coq/Sets/Uniset/incl_left.con +cic:/Coq/Sets/Uniset/incl_right.con +cic:/Coq/Sets/Uniset/leb_refl.con +cic:/Coq/Sets/Uniset/seq.con +cic:/Coq/Sets/Uniset/seq_congr.con +cic:/Coq/Sets/Uniset/seq_left.con +cic:/Coq/Sets/Uniset/seq_refl.con +cic:/Coq/Sets/Uniset/seq_right.con +cic:/Coq/Sets/Uniset/seq_sym.con +cic:/Coq/Sets/Uniset/seq_trans.con +cic:/Coq/Sets/Uniset/treesort_twist1.con +cic:/Coq/Sets/Uniset/treesort_twist2.con +cic:/Coq/Sets/Uniset/union.con +cic:/Coq/Sets/Uniset/union_ass.con +cic:/Coq/Sets/Uniset/union_comm.con +cic:/Coq/Sets/Uniset/union_empty_left.con +cic:/Coq/Sets/Uniset/union_empty_right.con +cic:/Coq/Sets/Uniset/union_perm_left.con +cic:/Coq/Sets/Uniset/union_rotate.con +cic:/Coq/Sets/Uniset/uniset_ind.con +cic:/Coq/Sets/Uniset/uniset_rec.con +cic:/Coq/Sets/Uniset/uniset_rect.con +cic:/Coq/Sets/Uniset/uniset_twist1.con +cic:/Coq/Sets/Uniset/uniset_twist2.con +cic:/Coq/Sorting/Heap/Tree_ind.con +cic:/Coq/Sorting/Heap/Tree_rec.con +cic:/Coq/Sorting/Heap/Tree_rect.con +cic:/Coq/Sorting/Heap/build_heap_ind.con +cic:/Coq/Sorting/Heap/build_heap_rec.con +cic:/Coq/Sorting/Heap/build_heap_rect.con +cic:/Coq/Sorting/Heap/contents.con +cic:/Coq/Sorting/Heap/equiv_Tree.con +cic:/Coq/Sorting/Heap/flat_spec_ind.con +cic:/Coq/Sorting/Heap/flat_spec_rec.con +cic:/Coq/Sorting/Heap/flat_spec_rect.con +cic:/Coq/Sorting/Heap/heap_to_list.con +cic:/Coq/Sorting/Heap/insert.con +cic:/Coq/Sorting/Heap/insert_spec_ind.con +cic:/Coq/Sorting/Heap/insert_spec_rec.con +cic:/Coq/Sorting/Heap/insert_spec_rect.con +cic:/Coq/Sorting/Heap/invert_heap.con +cic:/Coq/Sorting/Heap/is_heap_ind.con +cic:/Coq/Sorting/Heap/is_heap_rec.con +cic:/Coq/Sorting/Heap/leA_Tree.con +cic:/Coq/Sorting/Heap/leA_Tree_Leaf.con +cic:/Coq/Sorting/Heap/leA_Tree_Node.con +cic:/Coq/Sorting/Heap/list_to_heap.con +cic:/Coq/Sorting/Heap/low_trans.con +cic:/Coq/Sorting/Heap/treesort.con +cic:/Coq/Sorting/Permutation/list_contents.con +cic:/Coq/Sorting/Permutation/list_contents_app.con +cic:/Coq/Sorting/Permutation/permut_app.con +cic:/Coq/Sorting/Permutation/permut_cons.con +cic:/Coq/Sorting/Permutation/permut_middle.con +cic:/Coq/Sorting/Permutation/permut_refl.con +cic:/Coq/Sorting/Permutation/permut_right.con +cic:/Coq/Sorting/Permutation/permut_tran.con +cic:/Coq/Sorting/Permutation/permutation.con +cic:/Coq/Sorting/Sorting/lelistA_ind.con +cic:/Coq/Sorting/Sorting/lelistA_inv.con +cic:/Coq/Sorting/Sorting/merge.con +cic:/Coq/Sorting/Sorting/merge_lem_ind.con +cic:/Coq/Sorting/Sorting/merge_lem_rec.con +cic:/Coq/Sorting/Sorting/merge_lem_rect.con +cic:/Coq/Sorting/Sorting/sort_ind.con +cic:/Coq/Sorting/Sorting/sort_inv.con +cic:/Coq/Sorting/Sorting/sort_rec.con +cic:/Coq/Wellfounded/Disjoint_Union/acc_A_sum.con +cic:/Coq/Wellfounded/Disjoint_Union/acc_B_sum.con +cic:/Coq/Wellfounded/Disjoint_Union/wf_disjoint_sum.con +cic:/Coq/Wellfounded/Inclusion/Acc_incl.con +cic:/Coq/Wellfounded/Inclusion/wf_incl.con +cic:/Coq/Wellfounded/Inverse_Image/Acc_inverse_image.con +cic:/Coq/Wellfounded/Inverse_Image/Acc_inverse_rel.con +cic:/Coq/Wellfounded/Inverse_Image/Acc_lemma.con +cic:/Coq/Wellfounded/Inverse_Image/wf_inverse_image.con +cic:/Coq/Wellfounded/Inverse_Image/wf_inverse_rel.con +cic:/Coq/Wellfounded/Lexicographic_Exponentiation/acc_app.con +cic:/Coq/Wellfounded/Lexicographic_Exponentiation/desc_end.con +cic:/Coq/Wellfounded/Lexicographic_Exponentiation/desc_prefix.con +cic:/Coq/Wellfounded/Lexicographic_Exponentiation/desc_tail.con +cic:/Coq/Wellfounded/Lexicographic_Exponentiation/dist_Desc_concat.con +cic:/Coq/Wellfounded/Lexicographic_Exponentiation/dist_aux.con +cic:/Coq/Wellfounded/Lexicographic_Exponentiation/left_prefix.con +cic:/Coq/Wellfounded/Lexicographic_Exponentiation/ltl_unit.con +cic:/Coq/Wellfounded/Lexicographic_Exponentiation/right_prefix.con +cic:/Coq/Wellfounded/Lexicographic_Exponentiation/wf_lex_exp.con +cic:/Coq/Wellfounded/Lexicographic_Product/Acc_swapprod.con +cic:/Coq/Wellfounded/Lexicographic_Product/Acc_symprod.con +cic:/Coq/Wellfounded/Lexicographic_Product/acc_A_B_lexprod.con +cic:/Coq/Wellfounded/Lexicographic_Product/swap_Acc.con +cic:/Coq/Wellfounded/Lexicographic_Product/wf_lexprod.con +cic:/Coq/Wellfounded/Lexicographic_Product/wf_swapprod.con +cic:/Coq/Wellfounded/Lexicographic_Product/wf_symprod.con +cic:/Coq/Wellfounded/Transitive_Closure/Acc_clos_trans.con +cic:/Coq/Wellfounded/Transitive_Closure/Acc_inv_trans.con +cic:/Coq/Wellfounded/Transitive_Closure/incl_clos_trans.con +cic:/Coq/Wellfounded/Transitive_Closure/wf_clos_trans.con +cic:/Coq/Wellfounded/Union/Acc_union.con +cic:/Coq/Wellfounded/Union/strip_commut.con +cic:/Coq/Wellfounded/Union/wf_union.con +cic:/Coq/Wellfounded/Well_Ordering/B.con +cic:/Coq/Wellfounded/Well_Ordering/WO_ind.con +cic:/Coq/Wellfounded/Well_Ordering/WO_rec.con +cic:/Coq/Wellfounded/Well_Ordering/WO_rect.con +cic:/Coq/Wellfounded/Well_Ordering/le_WO_ind.con +cic:/Coq/Wellfounded/Well_Ordering/wf_WO.con +cic:/Coq/Wellfounded/Well_Ordering/wof.con +cic:/Coq/ZArith/BinInt/ZL0.con +cic:/Coq/ZArith/BinInt/ZPminus.con +cic:/Coq/ZArith/BinInt/Z_eq_mult.con +cic:/Coq/ZArith/BinInt/Z_ind.con +cic:/Coq/ZArith/BinInt/Z_of_N.con +cic:/Coq/ZArith/BinInt/Z_of_nat.con +cic:/Coq/ZArith/BinInt/Z_rec.con +cic:/Coq/ZArith/BinInt/Z_rect.con +cic:/Coq/ZArith/BinInt/Zabs.con +cic:/Coq/ZArith/BinInt/Zabs_N.con +cic:/Coq/ZArith/BinInt/Zabs_nat.con +cic:/Coq/ZArith/BinInt/Zcompare.con +cic:/Coq/ZArith/BinInt/Zdouble.con +cic:/Coq/ZArith/BinInt/Zdouble_minus_one.con +cic:/Coq/ZArith/BinInt/Zdouble_plus_one.con +cic:/Coq/ZArith/BinInt/Zeq_minus.con +cic:/Coq/ZArith/BinInt/Zge.con +cic:/Coq/ZArith/BinInt/Zgt.con +cic:/Coq/ZArith/BinInt/Zind.con +cic:/Coq/ZArith/BinInt/Zle.con +cic:/Coq/ZArith/BinInt/Zlt.con +cic:/Coq/ZArith/BinInt/Zminus.con +cic:/Coq/ZArith/BinInt/Zminus_0_l_reverse.con +cic:/Coq/ZArith/BinInt/Zminus_0_r.con +cic:/Coq/ZArith/BinInt/Zminus_diag.con +cic:/Coq/ZArith/BinInt/Zminus_diag_reverse.con +cic:/Coq/ZArith/BinInt/Zminus_eq.con +cic:/Coq/ZArith/BinInt/Zminus_plus.con +cic:/Coq/ZArith/BinInt/Zminus_plus_simpl_l.con +cic:/Coq/ZArith/BinInt/Zminus_plus_simpl_l_reverse.con +cic:/Coq/ZArith/BinInt/Zminus_plus_simpl_r.con +cic:/Coq/ZArith/BinInt/Zminus_succ_l.con +cic:/Coq/ZArith/BinInt/Zmult.con +cic:/Coq/ZArith/BinInt/Zmult_0_l.con +cic:/Coq/ZArith/BinInt/Zmult_0_r.con +cic:/Coq/ZArith/BinInt/Zmult_0_r_reverse.con +cic:/Coq/ZArith/BinInt/Zmult_1_inversion_l.con +cic:/Coq/ZArith/BinInt/Zmult_1_l.con +cic:/Coq/ZArith/BinInt/Zmult_1_r.con +cic:/Coq/ZArith/BinInt/Zmult_assoc.con +cic:/Coq/ZArith/BinInt/Zmult_assoc_reverse.con +cic:/Coq/ZArith/BinInt/Zmult_comm.con +cic:/Coq/ZArith/BinInt/Zmult_integral.con +cic:/Coq/ZArith/BinInt/Zmult_integral_l.con +cic:/Coq/ZArith/BinInt/Zmult_minus_distr_l.con +cic:/Coq/ZArith/BinInt/Zmult_minus_distr_r.con +cic:/Coq/ZArith/BinInt/Zmult_opp_comm.con +cic:/Coq/ZArith/BinInt/Zmult_opp_opp.con +cic:/Coq/ZArith/BinInt/Zmult_permute.con +cic:/Coq/ZArith/BinInt/Zmult_plus_distr_l.con +cic:/Coq/ZArith/BinInt/Zmult_plus_distr_r.con +cic:/Coq/ZArith/BinInt/Zmult_reg_l.con +cic:/Coq/ZArith/BinInt/Zmult_reg_r.con +cic:/Coq/ZArith/BinInt/Zmult_succ_l.con +cic:/Coq/ZArith/BinInt/Zmult_succ_l_reverse.con +cic:/Coq/ZArith/BinInt/Zmult_succ_r.con +cic:/Coq/ZArith/BinInt/Zmult_succ_r_reverse.con +cic:/Coq/ZArith/BinInt/Zne.con +cic:/Coq/ZArith/BinInt/Zneg_plus_distr.con +cic:/Coq/ZArith/BinInt/Zneg_xI.con +cic:/Coq/ZArith/BinInt/Zneg_xO.con +cic:/Coq/ZArith/BinInt/Zopp.con +cic:/Coq/ZArith/BinInt/Zopp_eq_mult_neg_1.con +cic:/Coq/ZArith/BinInt/Zopp_inj.con +cic:/Coq/ZArith/BinInt/Zopp_involutive.con +cic:/Coq/ZArith/BinInt/Zopp_mult_distr_l.con +cic:/Coq/ZArith/BinInt/Zopp_mult_distr_l_reverse.con +cic:/Coq/ZArith/BinInt/Zopp_mult_distr_r.con +cic:/Coq/ZArith/BinInt/Zopp_neg.con +cic:/Coq/ZArith/BinInt/Zopp_plus_distr.con +cic:/Coq/ZArith/BinInt/Zplus'.con +cic:/Coq/ZArith/BinInt/Zplus.con +cic:/Coq/ZArith/BinInt/Zplus_0_l.con +cic:/Coq/ZArith/BinInt/Zplus_0_r.con +cic:/Coq/ZArith/BinInt/Zplus_0_r_reverse.con +cic:/Coq/ZArith/BinInt/Zplus_0_simpl_l.con +cic:/Coq/ZArith/BinInt/Zplus_0_simpl_l_reverse.con +cic:/Coq/ZArith/BinInt/Zplus_assoc.con +cic:/Coq/ZArith/BinInt/Zplus_assoc_reverse.con +cic:/Coq/ZArith/BinInt/Zplus_comm.con +cic:/Coq/ZArith/BinInt/Zplus_diag_eq_mult_2.con +cic:/Coq/ZArith/BinInt/Zplus_eq_compat.con +cic:/Coq/ZArith/BinInt/Zplus_minus.con +cic:/Coq/ZArith/BinInt/Zplus_minus_eq.con +cic:/Coq/ZArith/BinInt/Zplus_opp_expand.con +cic:/Coq/ZArith/BinInt/Zplus_opp_l.con +cic:/Coq/ZArith/BinInt/Zplus_opp_r.con +cic:/Coq/ZArith/BinInt/Zplus_permute.con +cic:/Coq/ZArith/BinInt/Zplus_reg_l.con +cic:/Coq/ZArith/BinInt/Zplus_succ_comm.con +cic:/Coq/ZArith/BinInt/Zplus_succ_l.con +cic:/Coq/ZArith/BinInt/Zplus_succ_r.con +cic:/Coq/ZArith/BinInt/Zpos_plus_distr.con +cic:/Coq/ZArith/BinInt/Zpos_succ_morphism.con +cic:/Coq/ZArith/BinInt/Zpos_xI.con +cic:/Coq/ZArith/BinInt/Zpos_xO.con +cic:/Coq/ZArith/BinInt/Zpred'.con +cic:/Coq/ZArith/BinInt/Zpred'_succ'.con +cic:/Coq/ZArith/BinInt/Zpred.con +cic:/Coq/ZArith/BinInt/Zpred_succ.con +cic:/Coq/ZArith/BinInt/Zsgn.con +cic:/Coq/ZArith/BinInt/Zsucc'.con +cic:/Coq/ZArith/BinInt/Zsucc'_discr.con +cic:/Coq/ZArith/BinInt/Zsucc.con +cic:/Coq/ZArith/BinInt/Zsucc_discr.con +cic:/Coq/ZArith/BinInt/Zsucc_eq_compat.con +cic:/Coq/ZArith/BinInt/Zsucc_inj.con +cic:/Coq/ZArith/BinInt/Zsucc_inj_contrapositive.con +cic:/Coq/ZArith/BinInt/Zsucc_pred.con +cic:/Coq/ZArith/BinInt/weak_Zmult_plus_distr_r.con +cic:/Coq/ZArith/BinInt/weak_assoc.con +cic:/Coq/ZArith/Wf_Z/ZL4_inf.con +cic:/Coq/ZArith/Wf_Z/Z_lt_induction.con +cic:/Coq/ZArith/Wf_Z/Z_lt_rec.con +cic:/Coq/ZArith/Wf_Z/Z_of_nat_complete.con +cic:/Coq/ZArith/Wf_Z/Z_of_nat_complete_inf.con +cic:/Coq/ZArith/Wf_Z/Z_of_nat_prop.con +cic:/Coq/ZArith/Wf_Z/Z_of_nat_set.con +cic:/Coq/ZArith/Wf_Z/natlike_ind.con +cic:/Coq/ZArith/Wf_Z/natlike_rec.con +cic:/Coq/ZArith/Wf_Z/natlike_rec2.con +cic:/Coq/ZArith/Wf_Z/natlike_rec3.con +cic:/Coq/ZArith/ZArith_dec/Dcompare_inf.con +cic:/Coq/ZArith/ZArith_dec/Z_dec'.con +cic:/Coq/ZArith/ZArith_dec/Z_dec.con +cic:/Coq/ZArith/ZArith_dec/Z_eq_dec.con +cic:/Coq/ZArith/ZArith_dec/Z_ge_dec.con +cic:/Coq/ZArith/ZArith_dec/Z_ge_lt_dec.con +cic:/Coq/ZArith/ZArith_dec/Z_gt_dec.con +cic:/Coq/ZArith/ZArith_dec/Z_gt_le_dec.con +cic:/Coq/ZArith/ZArith_dec/Z_le_dec.con +cic:/Coq/ZArith/ZArith_dec/Z_le_gt_dec.con +cic:/Coq/ZArith/ZArith_dec/Z_le_lt_eq_dec.con +cic:/Coq/ZArith/ZArith_dec/Z_lt_dec.con +cic:/Coq/ZArith/ZArith_dec/Z_lt_ge_dec.con +cic:/Coq/ZArith/ZArith_dec/Z_lt_le_dec.con +cic:/Coq/ZArith/ZArith_dec/Z_noteq_dec.con +cic:/Coq/ZArith/ZArith_dec/Z_notzerop.con +cic:/Coq/ZArith/ZArith_dec/Z_zerop.con +cic:/Coq/ZArith/ZArith_dec/Zcompare_rec.con +cic:/Coq/ZArith/ZArith_dec/Zlt_cotrans.con +cic:/Coq/ZArith/ZArith_dec/Zlt_cotrans_neg.con +cic:/Coq/ZArith/ZArith_dec/Zlt_cotrans_pos.con +cic:/Coq/ZArith/ZArith_dec/not_Zeq_inf.con +cic:/Coq/ZArith/Zabs/Zabs_Zmult.con +cic:/Coq/ZArith/Zabs/Zabs_Zopp.con +cic:/Coq/ZArith/Zabs/Zabs_Zsgn.con +cic:/Coq/ZArith/Zabs/Zabs_dec.con +cic:/Coq/ZArith/Zabs/Zabs_eq.con +cic:/Coq/ZArith/Zabs/Zabs_eq_case.con +cic:/Coq/ZArith/Zabs/Zabs_ind.con +cic:/Coq/ZArith/Zabs/Zabs_intro.con +cic:/Coq/ZArith/Zabs/Zabs_nat_lt.con +cic:/Coq/ZArith/Zabs/Zabs_non_eq.con +cic:/Coq/ZArith/Zabs/Zabs_pos.con +cic:/Coq/ZArith/Zabs/Zabs_triangle.con +cic:/Coq/ZArith/Zabs/Zsgn_Zabs.con +cic:/Coq/ZArith/Zbinary/Pdiv2.con +cic:/Coq/ZArith/Zbinary/Z_div2_value.con +cic:/Coq/ZArith/Zbinary/Z_to_binary.con +cic:/Coq/ZArith/Zbinary/Z_to_binary_Sn.con +cic:/Coq/ZArith/Zbinary/Z_to_binary_Sn_z.con +cic:/Coq/ZArith/Zbinary/Z_to_binary_to_Z.con +cic:/Coq/ZArith/Zbinary/Z_to_two_compl.con +cic:/Coq/ZArith/Zbinary/Z_to_two_compl_Sn.con +cic:/Coq/ZArith/Zbinary/Z_to_two_compl_Sn_z.con +cic:/Coq/ZArith/Zbinary/Z_to_two_compl_to_Z.con +cic:/Coq/ZArith/Zbinary/Zdiv2_two_power_nat.con +cic:/Coq/ZArith/Zbinary/Zeven_bit_value.con +cic:/Coq/ZArith/Zbinary/Zge_minus_two_power_nat_S.con +cic:/Coq/ZArith/Zbinary/Zlt_two_power_nat_S.con +cic:/Coq/ZArith/Zbinary/Zmod2.con +cic:/Coq/ZArith/Zbinary/Zmod2_twice.con +cic:/Coq/ZArith/Zbinary/Zodd_bit_value.con +cic:/Coq/ZArith/Zbinary/binary_to_Z_to_binary.con +cic:/Coq/ZArith/Zbinary/binary_value.con +cic:/Coq/ZArith/Zbinary/binary_value_Sn.con +cic:/Coq/ZArith/Zbinary/binary_value_pos.con +cic:/Coq/ZArith/Zbinary/binary_value_pos_subproof.con +cic:/Coq/ZArith/Zbinary/bit_value.con +cic:/Coq/ZArith/Zbinary/two_compl_to_Z_to_two_compl.con +cic:/Coq/ZArith/Zbinary/two_compl_value.con +cic:/Coq/ZArith/Zbinary/two_compl_value_Sn.con +cic:/Coq/ZArith/Zbool/Z_eq_bool.con +cic:/Coq/ZArith/Zbool/Z_ge_lt_bool.con +cic:/Coq/ZArith/Zbool/Z_gt_le_bool.con +cic:/Coq/ZArith/Zbool/Z_le_gt_bool.con +cic:/Coq/ZArith/Zbool/Z_lt_ge_bool.con +cic:/Coq/ZArith/Zbool/Z_noteq_bool.con +cic:/Coq/ZArith/Zbool/Zeq_bool.con +cic:/Coq/ZArith/Zbool/Zeven_odd_bool.con +cic:/Coq/ZArith/Zbool/Zge_bool.con +cic:/Coq/ZArith/Zbool/Zge_cases.con +cic:/Coq/ZArith/Zbool/Zge_is_le_bool.con +cic:/Coq/ZArith/Zbool/Zgt_bool.con +cic:/Coq/ZArith/Zbool/Zgt_cases.con +cic:/Coq/ZArith/Zbool/Zgt_is_le_bool.con +cic:/Coq/ZArith/Zbool/Zle_bool.con +cic:/Coq/ZArith/Zbool/Zle_bool_antisym.con +cic:/Coq/ZArith/Zbool/Zle_bool_imp_le.con +cic:/Coq/ZArith/Zbool/Zle_bool_plus_mono.con +cic:/Coq/ZArith/Zbool/Zle_bool_refl.con +cic:/Coq/ZArith/Zbool/Zle_bool_total.con +cic:/Coq/ZArith/Zbool/Zle_bool_trans.con +cic:/Coq/ZArith/Zbool/Zle_cases.con +cic:/Coq/ZArith/Zbool/Zle_imp_le_bool.con +cic:/Coq/ZArith/Zbool/Zle_is_le_bool.con +cic:/Coq/ZArith/Zbool/Zlt_bool.con +cic:/Coq/ZArith/Zbool/Zlt_cases.con +cic:/Coq/ZArith/Zbool/Zlt_is_le_bool.con +cic:/Coq/ZArith/Zbool/Zneq_bool.con +cic:/Coq/ZArith/Zbool/Zone_min_pos.con +cic:/Coq/ZArith/Zbool/Zone_pos.con +cic:/Coq/ZArith/Zcompare/Zcompare_Eq_eq.con +cic:/Coq/ZArith/Zcompare/Zcompare_Eq_iff_eq.con +cic:/Coq/ZArith/Zcompare/Zcompare_Gt_Lt_antisym.con +cic:/Coq/ZArith/Zcompare/Zcompare_Gt_not_Lt.con +cic:/Coq/ZArith/Zcompare/Zcompare_Gt_spec.con +cic:/Coq/ZArith/Zcompare/Zcompare_Gt_trans.con +cic:/Coq/ZArith/Zcompare/Zcompare_antisym.con +cic:/Coq/ZArith/Zcompare/Zcompare_egal_dec.con +cic:/Coq/ZArith/Zcompare/Zcompare_elim.con +cic:/Coq/ZArith/Zcompare/Zcompare_eq_case.con +cic:/Coq/ZArith/Zcompare/Zcompare_mult_compat.con +cic:/Coq/ZArith/Zcompare/Zcompare_opp.con +cic:/Coq/ZArith/Zcompare/Zcompare_plus_compat.con +cic:/Coq/ZArith/Zcompare/Zcompare_refl.con +cic:/Coq/ZArith/Zcompare/Zcompare_succ_Gt.con +cic:/Coq/ZArith/Zcompare/Zcompare_succ_compat.con +cic:/Coq/ZArith/Zcompare/Zge_compare.con +cic:/Coq/ZArith/Zcompare/Zgt_compare.con +cic:/Coq/ZArith/Zcompare/Zle_compare.con +cic:/Coq/ZArith/Zcompare/Zlt_compare.con +cic:/Coq/ZArith/Zcompare/Zmult_compare_compat_l.con +cic:/Coq/ZArith/Zcompare/Zmult_compare_compat_r.con +cic:/Coq/ZArith/Zcompare/Zplus_compare_compat.con +cic:/Coq/ZArith/Zcompare/rename.con +cic:/Coq/ZArith/Zcompare/weak_Zcompare_Zplus_compatible.con +cic:/Coq/ZArith/Zcompare/weaken_Zcompare_Zplus_compatible.con +cic:/Coq/ZArith/Zcomplements/Z_lt_abs_induction.con +cic:/Coq/ZArith/Zcomplements/Z_lt_abs_induction_subproof.con +cic:/Coq/ZArith/Zcomplements/Z_lt_abs_rec.con +cic:/Coq/ZArith/Zcomplements/Z_lt_abs_rec_subproof.con +cic:/Coq/ZArith/Zcomplements/Zcase_sign.con +cic:/Coq/ZArith/Zcomplements/Zlength.con +cic:/Coq/ZArith/Zcomplements/Zlength_aux.con +cic:/Coq/ZArith/Zcomplements/Zlength_cons.con +cic:/Coq/ZArith/Zcomplements/Zlength_correct.con +cic:/Coq/ZArith/Zcomplements/Zlength_correct_subproof.con +cic:/Coq/ZArith/Zcomplements/Zlength_nil.con +cic:/Coq/ZArith/Zcomplements/Zlength_nil_inv.con +cic:/Coq/ZArith/Zcomplements/floor.con +cic:/Coq/ZArith/Zcomplements/floor_gt0.con +cic:/Coq/ZArith/Zcomplements/floor_ok.con +cic:/Coq/ZArith/Zcomplements/floor_pos.con +cic:/Coq/ZArith/Zcomplements/sqr_pos.con +cic:/Coq/ZArith/Zcomplements/two_or_two_plus_one.con +cic:/Coq/ZArith/Zdiv/Z_div_POS_ge0.con +cic:/Coq/ZArith/Zdiv/Z_div_exact_1.con +cic:/Coq/ZArith/Zdiv/Z_div_exact_2.con +cic:/Coq/ZArith/Zdiv/Z_div_ge.con +cic:/Coq/ZArith/Zdiv/Z_div_ge0.con +cic:/Coq/ZArith/Zdiv/Z_div_ge0_subproof.con +cic:/Coq/ZArith/Zdiv/Z_div_lt.con +cic:/Coq/ZArith/Zdiv/Z_div_mod.con +cic:/Coq/ZArith/Zdiv/Z_div_mod_POS.con +cic:/Coq/ZArith/Zdiv/Z_div_mod_eq.con +cic:/Coq/ZArith/Zdiv/Z_div_mult.con +cic:/Coq/ZArith/Zdiv/Z_div_plus.con +cic:/Coq/ZArith/Zdiv/Z_div_same.con +cic:/Coq/ZArith/Zdiv/Z_mod_lt.con +cic:/Coq/ZArith/Zdiv/Z_mod_plus.con +cic:/Coq/ZArith/Zdiv/Z_mod_same.con +cic:/Coq/ZArith/Zdiv/Z_mod_zero_opp.con +cic:/Coq/ZArith/Zdiv/Z_mult_div_ge.con +cic:/Coq/ZArith/Zdiv/Zdiv.con +cic:/Coq/ZArith/Zdiv/Zdiv_eucl.con +cic:/Coq/ZArith/Zdiv/Zdiv_eucl_POS.con +cic:/Coq/ZArith/Zdiv/Zdiv_eucl_exist.con +cic:/Coq/ZArith/Zdiv/Zdiv_eucl_extended.con +cic:/Coq/ZArith/Zdiv/Zmod.con +cic:/Coq/ZArith/Zeven/Z_modulo_2.con +cic:/Coq/ZArith/Zeven/Zdiv2.con +cic:/Coq/ZArith/Zeven/Zeven.con +cic:/Coq/ZArith/Zeven/Zeven_Sn.con +cic:/Coq/ZArith/Zeven/Zeven_bool.con +cic:/Coq/ZArith/Zeven/Zeven_dec.con +cic:/Coq/ZArith/Zeven/Zeven_div2.con +cic:/Coq/ZArith/Zeven/Zeven_not_Zodd.con +cic:/Coq/ZArith/Zeven/Zeven_odd_dec.con +cic:/Coq/ZArith/Zeven/Zeven_pred.con +cic:/Coq/ZArith/Zeven/Zodd.con +cic:/Coq/ZArith/Zeven/Zodd_Sn.con +cic:/Coq/ZArith/Zeven/Zodd_bool.con +cic:/Coq/ZArith/Zeven/Zodd_dec.con +cic:/Coq/ZArith/Zeven/Zodd_div2.con +cic:/Coq/ZArith/Zeven/Zodd_div2_neg.con +cic:/Coq/ZArith/Zeven/Zodd_not_Zeven.con +cic:/Coq/ZArith/Zeven/Zodd_pred.con +cic:/Coq/ZArith/Zeven/Zsplit2.con +cic:/Coq/ZArith/Zlogarithm/Is_power.con +cic:/Coq/ZArith/Zlogarithm/Is_power_correct.con +cic:/Coq/ZArith/Zlogarithm/Is_power_or.con +cic:/Coq/ZArith/Zlogarithm/N_digits.con +cic:/Coq/ZArith/Zlogarithm/ZERO_le_N_digits.con +cic:/Coq/ZArith/Zlogarithm/log_inf.con +cic:/Coq/ZArith/Zlogarithm/log_inf_correct.con +cic:/Coq/ZArith/Zlogarithm/log_inf_correct1.con +cic:/Coq/ZArith/Zlogarithm/log_inf_correct2.con +cic:/Coq/ZArith/Zlogarithm/log_inf_le_log_sup.con +cic:/Coq/ZArith/Zlogarithm/log_inf_shift_nat.con +cic:/Coq/ZArith/Zlogarithm/log_near.con +cic:/Coq/ZArith/Zlogarithm/log_near_correct1.con +cic:/Coq/ZArith/Zlogarithm/log_near_correct2.con +cic:/Coq/ZArith/Zlogarithm/log_near_correct2_subproof.con +cic:/Coq/ZArith/Zlogarithm/log_sup.con +cic:/Coq/ZArith/Zlogarithm/log_sup_correct1.con +cic:/Coq/ZArith/Zlogarithm/log_sup_correct2.con +cic:/Coq/ZArith/Zlogarithm/log_sup_le_Slog_inf.con +cic:/Coq/ZArith/Zlogarithm/log_sup_log_inf.con +cic:/Coq/ZArith/Zlogarithm/log_sup_shift_nat.con +cic:/Coq/ZArith/Zmin/Zle_min_l.con +cic:/Coq/ZArith/Zmin/Zle_min_r.con +cic:/Coq/ZArith/Zmin/Zmax.con +cic:/Coq/ZArith/Zmin/Zmax1.con +cic:/Coq/ZArith/Zmin/Zmax2.con +cic:/Coq/ZArith/Zmin/Zmin.con +cic:/Coq/ZArith/Zmin/Zmin_SS.con +cic:/Coq/ZArith/Zmin/Zmin_case.con +cic:/Coq/ZArith/Zmin/Zmin_n_n.con +cic:/Coq/ZArith/Zmin/Zmin_or.con +cic:/Coq/ZArith/Zmin/Zmin_plus.con +cic:/Coq/ZArith/Zmisc/iter.con +cic:/Coq/ZArith/Zmisc/iter_nat.con +cic:/Coq/ZArith/Zmisc/iter_nat_invariant.con +cic:/Coq/ZArith/Zmisc/iter_nat_of_P.con +cic:/Coq/ZArith/Zmisc/iter_nat_plus.con +cic:/Coq/ZArith/Zmisc/iter_pos.con +cic:/Coq/ZArith/Zmisc/iter_pos_invariant.con +cic:/Coq/ZArith/Zmisc/iter_pos_plus.con +cic:/Coq/ZArith/Znat/Zpos_eq_Z_of_nat_o_nat_of_P.con +cic:/Coq/ZArith/Znat/inj_S.con +cic:/Coq/ZArith/Znat/inj_eq.con +cic:/Coq/ZArith/Znat/inj_ge.con +cic:/Coq/ZArith/Znat/inj_gt.con +cic:/Coq/ZArith/Znat/inj_le.con +cic:/Coq/ZArith/Znat/inj_lt.con +cic:/Coq/ZArith/Znat/inj_minus1.con +cic:/Coq/ZArith/Znat/inj_minus2.con +cic:/Coq/ZArith/Znat/inj_mult.con +cic:/Coq/ZArith/Znat/inj_neq.con +cic:/Coq/ZArith/Znat/inj_plus.con +cic:/Coq/ZArith/Znat/intro_Z.con +cic:/Coq/ZArith/Znat/neq.con +cic:/Coq/ZArith/Znumtheory/Bezout_ind.con +cic:/Coq/ZArith/Znumtheory/Euclid_ind.con +cic:/Coq/ZArith/Znumtheory/Euclid_rec.con +cic:/Coq/ZArith/Znumtheory/Euclid_rect.con +cic:/Coq/ZArith/Znumtheory/Gauss.con +cic:/Coq/ZArith/Znumtheory/Zdivide_0.con +cic:/Coq/ZArith/Znumtheory/Zdivide_1.con +cic:/Coq/ZArith/Znumtheory/Zdivide_1_subproof.con +cic:/Coq/ZArith/Znumtheory/Zdivide_1_subproof0.con +cic:/Coq/ZArith/Znumtheory/Zdivide_1_subproof1.con +cic:/Coq/ZArith/Znumtheory/Zdivide_antisym.con +cic:/Coq/ZArith/Znumtheory/Zdivide_bounds.con +cic:/Coq/ZArith/Znumtheory/Zdivide_bounds_subproof.con +cic:/Coq/ZArith/Znumtheory/Zdivide_bounds_subproof0.con +cic:/Coq/ZArith/Znumtheory/Zdivide_bounds_subproof1.con +cic:/Coq/ZArith/Znumtheory/Zdivide_bounds_subproof2.con +cic:/Coq/ZArith/Znumtheory/Zdivide_dec.con +cic:/Coq/ZArith/Znumtheory/Zdivide_dec_subproof.con +cic:/Coq/ZArith/Znumtheory/Zdivide_dec_subproof0.con +cic:/Coq/ZArith/Znumtheory/Zdivide_factor_l.con +cic:/Coq/ZArith/Znumtheory/Zdivide_factor_r.con +cic:/Coq/ZArith/Znumtheory/Zdivide_ind.con +cic:/Coq/ZArith/Znumtheory/Zdivide_minus_l.con +cic:/Coq/ZArith/Znumtheory/Zdivide_mod.con +cic:/Coq/ZArith/Znumtheory/Zdivide_mult_l.con +cic:/Coq/ZArith/Znumtheory/Zdivide_mult_r.con +cic:/Coq/ZArith/Znumtheory/Zdivide_opp_l.con +cic:/Coq/ZArith/Znumtheory/Zdivide_opp_l_rev.con +cic:/Coq/ZArith/Znumtheory/Zdivide_opp_r.con +cic:/Coq/ZArith/Znumtheory/Zdivide_opp_r_rev.con +cic:/Coq/ZArith/Znumtheory/Zdivide_plus_r.con +cic:/Coq/ZArith/Znumtheory/Zdivide_refl.con +cic:/Coq/ZArith/Znumtheory/Zgcd.con +cic:/Coq/ZArith/Znumtheory/Zgcd_is_gcd.con +cic:/Coq/ZArith/Znumtheory/Zgcd_is_pos.con +cic:/Coq/ZArith/Znumtheory/Zgcd_pos.con +cic:/Coq/ZArith/Znumtheory/Zgcd_pos_subproof.con +cic:/Coq/ZArith/Znumtheory/Zgcd_pos_subproof0.con +cic:/Coq/ZArith/Znumtheory/Zgcd_spec.con +cic:/Coq/ZArith/Znumtheory/Zis_gcd_0.con +cic:/Coq/ZArith/Znumtheory/Zis_gcd_bezout.con +cic:/Coq/ZArith/Znumtheory/Zis_gcd_for_euclid.con +cic:/Coq/ZArith/Znumtheory/Zis_gcd_for_euclid2.con +cic:/Coq/ZArith/Znumtheory/Zis_gcd_ind.con +cic:/Coq/ZArith/Znumtheory/Zis_gcd_minus.con +cic:/Coq/ZArith/Znumtheory/Zis_gcd_mult.con +cic:/Coq/ZArith/Znumtheory/Zis_gcd_opp.con +cic:/Coq/ZArith/Znumtheory/Zis_gcd_rec.con +cic:/Coq/ZArith/Znumtheory/Zis_gcd_rect.con +cic:/Coq/ZArith/Znumtheory/Zis_gcd_rel_prime.con +cic:/Coq/ZArith/Znumtheory/Zis_gcd_rel_prime_subproof.con +cic:/Coq/ZArith/Znumtheory/Zis_gcd_rel_prime_subproof0.con +cic:/Coq/ZArith/Znumtheory/Zis_gcd_rel_prime_subproof1.con +cic:/Coq/ZArith/Znumtheory/Zis_gcd_sym.con +cic:/Coq/ZArith/Znumtheory/Zis_gcd_uniqueness_apart_sign.con +cic:/Coq/ZArith/Znumtheory/Zmod_divide.con +cic:/Coq/ZArith/Znumtheory/Zmult_divide_compat_l.con +cic:/Coq/ZArith/Znumtheory/Zmult_divide_compat_r.con +cic:/Coq/ZArith/Znumtheory/Zmult_one.con +cic:/Coq/ZArith/Znumtheory/Zone_divide.con +cic:/Coq/ZArith/Znumtheory/bezout_rel_prime.con +cic:/Coq/ZArith/Znumtheory/euclid.con +cic:/Coq/ZArith/Znumtheory/euclid_rec.con +cic:/Coq/ZArith/Znumtheory/euclid_subproof.con +cic:/Coq/ZArith/Znumtheory/euclid_subproof0.con +cic:/Coq/ZArith/Znumtheory/euclid_subproof1.con +cic:/Coq/ZArith/Znumtheory/euclid_subproof2.con +cic:/Coq/ZArith/Znumtheory/prime_divisors.con +cic:/Coq/ZArith/Znumtheory/prime_divisors_subproof.con +cic:/Coq/ZArith/Znumtheory/prime_divisors_subproof0.con +cic:/Coq/ZArith/Znumtheory/prime_divisors_subproof1.con +cic:/Coq/ZArith/Znumtheory/prime_divisors_subproof2.con +cic:/Coq/ZArith/Znumtheory/prime_divisors_subproof3.con +cic:/Coq/ZArith/Znumtheory/prime_divisors_subproof4.con +cic:/Coq/ZArith/Znumtheory/prime_divisors_subproof5.con +cic:/Coq/ZArith/Znumtheory/prime_ind.con +cic:/Coq/ZArith/Znumtheory/prime_mult.con +cic:/Coq/ZArith/Znumtheory/prime_rec.con +cic:/Coq/ZArith/Znumtheory/prime_rect.con +cic:/Coq/ZArith/Znumtheory/prime_rel_prime.con +cic:/Coq/ZArith/Znumtheory/rel_prime.con +cic:/Coq/ZArith/Znumtheory/rel_prime_bezout.con +cic:/Coq/ZArith/Znumtheory/rel_prime_cross_prod.con +cic:/Coq/ZArith/Znumtheory/rel_prime_cross_prod_subproof.con +cic:/Coq/ZArith/Znumtheory/rel_prime_mult.con +cic:/Coq/ZArith/Zorder/Zeq_le.con +cic:/Coq/ZArith/Zorder/Zeq_plus_swap.con +cic:/Coq/ZArith/Zorder/Zge_iff_le.con +cic:/Coq/ZArith/Zorder/Zge_le.con +cic:/Coq/ZArith/Zorder/Zge_trans.con +cic:/Coq/ZArith/Zorder/Zge_trans_succ.con +cic:/Coq/ZArith/Zorder/Zgt_0_le_0_pred.con +cic:/Coq/ZArith/Zorder/Zgt_asym.con +cic:/Coq/ZArith/Zorder/Zgt_iff_lt.con +cic:/Coq/ZArith/Zorder/Zgt_irrefl.con +cic:/Coq/ZArith/Zorder/Zgt_le_succ.con +cic:/Coq/ZArith/Zorder/Zgt_le_trans.con +cic:/Coq/ZArith/Zorder/Zgt_lt.con +cic:/Coq/ZArith/Zorder/Zgt_not_le.con +cic:/Coq/ZArith/Zorder/Zgt_pos_0.con +cic:/Coq/ZArith/Zorder/Zgt_square_simpl.con +cic:/Coq/ZArith/Zorder/Zgt_succ.con +cic:/Coq/ZArith/Zorder/Zgt_succ_gt_or_eq.con +cic:/Coq/ZArith/Zorder/Zgt_succ_le.con +cic:/Coq/ZArith/Zorder/Zgt_succ_pred.con +cic:/Coq/ZArith/Zorder/Zgt_trans.con +cic:/Coq/ZArith/Zorder/Zle_0_1.con +cic:/Coq/ZArith/Zorder/Zle_0_nat.con +cic:/Coq/ZArith/Zorder/Zle_0_pos.con +cic:/Coq/ZArith/Zorder/Zle_antisym.con +cic:/Coq/ZArith/Zorder/Zle_ge.con +cic:/Coq/ZArith/Zorder/Zle_gt_trans.con +cic:/Coq/ZArith/Zorder/Zle_le_succ.con +cic:/Coq/ZArith/Zorder/Zle_lt_or_eq.con +cic:/Coq/ZArith/Zorder/Zle_lt_succ.con +cic:/Coq/ZArith/Zorder/Zle_lt_trans.con +cic:/Coq/ZArith/Zorder/Zle_neg_pos.con +cic:/Coq/ZArith/Zorder/Zle_not_gt.con +cic:/Coq/ZArith/Zorder/Zle_not_lt.con +cic:/Coq/ZArith/Zorder/Zle_or_lt.con +cic:/Coq/ZArith/Zorder/Zle_plus_swap.con +cic:/Coq/ZArith/Zorder/Zle_pred.con +cic:/Coq/ZArith/Zorder/Zle_refl.con +cic:/Coq/ZArith/Zorder/Zle_succ.con +cic:/Coq/ZArith/Zorder/Zle_succ_le.con +cic:/Coq/ZArith/Zorder/Zle_trans.con +cic:/Coq/ZArith/Zorder/Zlt_0_1.con +cic:/Coq/ZArith/Zorder/Zlt_0_le_0_pred.con +cic:/Coq/ZArith/Zorder/Zlt_O_minus_lt.con +cic:/Coq/ZArith/Zorder/Zlt_asym.con +cic:/Coq/ZArith/Zorder/Zlt_gt.con +cic:/Coq/ZArith/Zorder/Zlt_gt_succ.con +cic:/Coq/ZArith/Zorder/Zlt_irrefl.con +cic:/Coq/ZArith/Zorder/Zlt_le_succ.con +cic:/Coq/ZArith/Zorder/Zlt_le_trans.con +cic:/Coq/ZArith/Zorder/Zlt_le_weak.con +cic:/Coq/ZArith/Zorder/Zlt_lt_succ.con +cic:/Coq/ZArith/Zorder/Zlt_minus_simpl_swap.con +cic:/Coq/ZArith/Zorder/Zlt_neg_0.con +cic:/Coq/ZArith/Zorder/Zlt_not_eq.con +cic:/Coq/ZArith/Zorder/Zlt_not_le.con +cic:/Coq/ZArith/Zorder/Zlt_plus_swap.con +cic:/Coq/ZArith/Zorder/Zlt_pred.con +cic:/Coq/ZArith/Zorder/Zlt_square_simpl.con +cic:/Coq/ZArith/Zorder/Zlt_succ.con +cic:/Coq/ZArith/Zorder/Zlt_succ_gt.con +cic:/Coq/ZArith/Zorder/Zlt_succ_le.con +cic:/Coq/ZArith/Zorder/Zlt_succ_pred.con +cic:/Coq/ZArith/Zorder/Zlt_trans.con +cic:/Coq/ZArith/Zorder/Zmult_ge_compat.con +cic:/Coq/ZArith/Zorder/Zmult_ge_compat_l.con +cic:/Coq/ZArith/Zorder/Zmult_ge_compat_r.con +cic:/Coq/ZArith/Zorder/Zmult_ge_reg_r.con +cic:/Coq/ZArith/Zorder/Zmult_gt_0_compat.con +cic:/Coq/ZArith/Zorder/Zmult_gt_0_le_0_compat.con +cic:/Coq/ZArith/Zorder/Zmult_gt_0_le_compat_r.con +cic:/Coq/ZArith/Zorder/Zmult_gt_0_lt_0_reg_r.con +cic:/Coq/ZArith/Zorder/Zmult_gt_0_lt_compat_l.con +cic:/Coq/ZArith/Zorder/Zmult_gt_0_lt_compat_r.con +cic:/Coq/ZArith/Zorder/Zmult_gt_0_lt_reg_r.con +cic:/Coq/ZArith/Zorder/Zmult_gt_0_reg_l.con +cic:/Coq/ZArith/Zorder/Zmult_gt_compat_l.con +cic:/Coq/ZArith/Zorder/Zmult_gt_compat_r.con +cic:/Coq/ZArith/Zorder/Zmult_gt_reg_r.con +cic:/Coq/ZArith/Zorder/Zmult_le_0_compat.con +cic:/Coq/ZArith/Zorder/Zmult_le_0_reg_r.con +cic:/Coq/ZArith/Zorder/Zmult_le_compat.con +cic:/Coq/ZArith/Zorder/Zmult_le_compat_l.con +cic:/Coq/ZArith/Zorder/Zmult_le_compat_r.con +cic:/Coq/ZArith/Zorder/Zmult_le_reg_r.con +cic:/Coq/ZArith/Zorder/Zmult_lt_0_le_compat_r.con +cic:/Coq/ZArith/Zorder/Zmult_lt_0_le_reg_r.con +cic:/Coq/ZArith/Zorder/Zmult_lt_0_reg_r.con +cic:/Coq/ZArith/Zorder/Zmult_lt_O_compat.con +cic:/Coq/ZArith/Zorder/Zmult_lt_compat_l.con +cic:/Coq/ZArith/Zorder/Zmult_lt_compat_r.con +cic:/Coq/ZArith/Zorder/Zmult_lt_reg_r.con +cic:/Coq/ZArith/Zorder/Znot_ge_lt.con +cic:/Coq/ZArith/Zorder/Znot_gt_le.con +cic:/Coq/ZArith/Zorder/Znot_le_gt.con +cic:/Coq/ZArith/Zorder/Znot_le_succ.con +cic:/Coq/ZArith/Zorder/Znot_lt_ge.con +cic:/Coq/ZArith/Zorder/Zplus_gt_compat_l.con +cic:/Coq/ZArith/Zorder/Zplus_gt_compat_r.con +cic:/Coq/ZArith/Zorder/Zplus_gt_reg_l.con +cic:/Coq/ZArith/Zorder/Zplus_gt_reg_r.con +cic:/Coq/ZArith/Zorder/Zplus_le_0_compat.con +cic:/Coq/ZArith/Zorder/Zplus_le_compat.con +cic:/Coq/ZArith/Zorder/Zplus_le_compat_l.con +cic:/Coq/ZArith/Zorder/Zplus_le_compat_r.con +cic:/Coq/ZArith/Zorder/Zplus_le_lt_compat.con +cic:/Coq/ZArith/Zorder/Zplus_le_reg_l.con +cic:/Coq/ZArith/Zorder/Zplus_le_reg_r.con +cic:/Coq/ZArith/Zorder/Zplus_lt_compat.con +cic:/Coq/ZArith/Zorder/Zplus_lt_compat_l.con +cic:/Coq/ZArith/Zorder/Zplus_lt_compat_r.con +cic:/Coq/ZArith/Zorder/Zplus_lt_le_compat.con +cic:/Coq/ZArith/Zorder/Zplus_lt_reg_l.con +cic:/Coq/ZArith/Zorder/Zplus_lt_reg_r.con +cic:/Coq/ZArith/Zorder/Zsucc_gt_compat.con +cic:/Coq/ZArith/Zorder/Zsucc_gt_reg.con +cic:/Coq/ZArith/Zorder/Zsucc_le_compat.con +cic:/Coq/ZArith/Zorder/Zsucc_le_reg.con +cic:/Coq/ZArith/Zorder/Zsucc_lt_compat.con +cic:/Coq/ZArith/Zorder/Zsucc_lt_reg.con +cic:/Coq/ZArith/Zorder/Ztrichotomy.con +cic:/Coq/ZArith/Zorder/Ztrichotomy_inf.con +cic:/Coq/ZArith/Zorder/dec_Zge.con +cic:/Coq/ZArith/Zorder/dec_Zgt.con +cic:/Coq/ZArith/Zorder/dec_Zle.con +cic:/Coq/ZArith/Zorder/dec_Zlt.con +cic:/Coq/ZArith/Zorder/dec_Zne.con +cic:/Coq/ZArith/Zorder/dec_eq.con +cic:/Coq/ZArith/Zorder/not_Zeq.con +cic:/Coq/ZArith/Zpower/Zdiv_rest.con +cic:/Coq/ZArith/Zpower/Zdiv_rest_aux.con +cic:/Coq/ZArith/Zpower/Zdiv_rest_correct.con +cic:/Coq/ZArith/Zpower/Zdiv_rest_correct1.con +cic:/Coq/ZArith/Zpower/Zdiv_rest_correct2.con +cic:/Coq/ZArith/Zpower/Zdiv_rest_proofs_ind.con +cic:/Coq/ZArith/Zpower/Zdiv_rest_proofs_rec.con +cic:/Coq/ZArith/Zpower/Zdiv_rest_proofs_rect.con +cic:/Coq/ZArith/Zpower/Zlt_lt_double.con +cic:/Coq/ZArith/Zpower/Zpower.con +cic:/Coq/ZArith/Zpower/Zpower_exp.con +cic:/Coq/ZArith/Zpower/Zpower_nat.con +cic:/Coq/ZArith/Zpower/Zpower_nat_is_exp.con +cic:/Coq/ZArith/Zpower/Zpower_pos.con +cic:/Coq/ZArith/Zpower/Zpower_pos_is_exp.con +cic:/Coq/ZArith/Zpower/Zpower_pos_nat.con +cic:/Coq/ZArith/Zpower/shift.con +cic:/Coq/ZArith/Zpower/shift_nat.con +cic:/Coq/ZArith/Zpower/shift_nat_correct.con +cic:/Coq/ZArith/Zpower/shift_nat_plus.con +cic:/Coq/ZArith/Zpower/shift_pos.con +cic:/Coq/ZArith/Zpower/shift_pos_correct.con +cic:/Coq/ZArith/Zpower/shift_pos_nat.con +cic:/Coq/ZArith/Zpower/two_p.con +cic:/Coq/ZArith/Zpower/two_p_S.con +cic:/Coq/ZArith/Zpower/two_p_gt_ZERO.con +cic:/Coq/ZArith/Zpower/two_p_is_exp.con +cic:/Coq/ZArith/Zpower/two_p_pred.con +cic:/Coq/ZArith/Zpower/two_power_nat.con +cic:/Coq/ZArith/Zpower/two_power_nat_S.con +cic:/Coq/ZArith/Zpower/two_power_nat_correct.con +cic:/Coq/ZArith/Zpower/two_power_pos.con +cic:/Coq/ZArith/Zpower/two_power_pos_correct.con +cic:/Coq/ZArith/Zpower/two_power_pos_is_exp.con +cic:/Coq/ZArith/Zpower/two_power_pos_nat.con +cic:/Coq/ZArith/Zsqrt/Zsqrt.con +cic:/Coq/ZArith/Zsqrt/Zsqrt_interval.con +cic:/Coq/ZArith/Zsqrt/Zsqrt_plain.con +cic:/Coq/ZArith/Zsqrt/sqrt_data_ind.con +cic:/Coq/ZArith/Zsqrt/sqrt_data_rec.con +cic:/Coq/ZArith/Zsqrt/sqrt_data_rect.con +cic:/Coq/ZArith/Zsqrt/sqrtrempos.con +cic:/Coq/ZArith/Zwf/Zwf.con +cic:/Coq/ZArith/Zwf/Zwf_up.con +cic:/Coq/ZArith/Zwf/Zwf_up_well_founded.con +cic:/Coq/ZArith/Zwf/Zwf_well_founded.con +cic:/Coq/ZArith/auxiliary/Zegal_left.con +cic:/Coq/ZArith/auxiliary/Zge_left.con +cic:/Coq/ZArith/auxiliary/Zgt_left.con +cic:/Coq/ZArith/auxiliary/Zgt_left_gt.con +cic:/Coq/ZArith/auxiliary/Zgt_left_rev.con +cic:/Coq/ZArith/auxiliary/Zle_left.con +cic:/Coq/ZArith/auxiliary/Zle_left_rev.con +cic:/Coq/ZArith/auxiliary/Zle_mult_approx.con +cic:/Coq/ZArith/auxiliary/Zlt_left.con +cic:/Coq/ZArith/auxiliary/Zlt_left_lt.con +cic:/Coq/ZArith/auxiliary/Zlt_left_rev.con +cic:/Coq/ZArith/auxiliary/Zmult_le_approx.con +cic:/Coq/ZArith/auxiliary/Zne_left.con +cic:/Coq/ZArith/auxiliary/Zred_factor0.con +cic:/Coq/ZArith/auxiliary/Zred_factor1.con +cic:/Coq/ZArith/auxiliary/Zred_factor2.con +cic:/Coq/ZArith/auxiliary/Zred_factor3.con +cic:/Coq/ZArith/auxiliary/Zred_factor4.con +cic:/Coq/ZArith/auxiliary/Zred_factor5.con +cic:/Coq/ZArith/auxiliary/Zred_factor6.con +cic:/Coq/field/Field_Compl/appT.con +cic:/Coq/field/Field_Compl/assoc_2nd.con +cic:/Coq/field/Field_Compl/field_rel_option_ind.con +cic:/Coq/field/Field_Compl/field_rel_option_rec.con +cic:/Coq/field/Field_Compl/field_rel_option_rect.con +cic:/Coq/field/Field_Compl/fstT.con +cic:/Coq/field/Field_Compl/listT_ind.con +cic:/Coq/field/Field_Compl/listT_rec.con +cic:/Coq/field/Field_Compl/listT_rect.con +cic:/Coq/field/Field_Compl/mem.con +cic:/Coq/field/Field_Compl/prodT_ind.con +cic:/Coq/field/Field_Compl/prodT_rec.con +cic:/Coq/field/Field_Compl/prodT_rect.con +cic:/Coq/field/Field_Compl/sndT.con +cic:/Coq/field/Field_Theory/A.con +cic:/Coq/field/Field_Theory/Adiv.con +cic:/Coq/field/Field_Theory/Aeq.con +cic:/Coq/field/Field_Theory/Ainv.con +cic:/Coq/field/Field_Theory/AinvT_r.con +cic:/Coq/field/Field_Theory/Aminus.con +cic:/Coq/field/Field_Theory/Amult.con +cic:/Coq/field/Field_Theory/AmultT_1l.con +cic:/Coq/field/Field_Theory/AmultT_1r.con +cic:/Coq/field/Field_Theory/AmultT_AplusT_distr.con +cic:/Coq/field/Field_Theory/AmultT_Ol.con +cic:/Coq/field/Field_Theory/AmultT_Or.con +cic:/Coq/field/Field_Theory/AmultT_assoc.con +cic:/Coq/field/Field_Theory/AmultT_sym.con +cic:/Coq/field/Field_Theory/Aone.con +cic:/Coq/field/Field_Theory/Aopp.con +cic:/Coq/field/Field_Theory/Aplus.con +cic:/Coq/field/Field_Theory/AplusT_AoppT_r.con +cic:/Coq/field/Field_Theory/AplusT_Ol.con +cic:/Coq/field/Field_Theory/AplusT_assoc.con +cic:/Coq/field/Field_Theory/AplusT_sym.con +cic:/Coq/field/Field_Theory/Azero.con +cic:/Coq/field/Field_Theory/ExprA_ind.con +cic:/Coq/field/Field_Theory/ExprA_rec.con +cic:/Coq/field/Field_Theory/ExprA_rect.con +cic:/Coq/field/Field_Theory/Field_Theory_ind.con +cic:/Coq/field/Field_Theory/Field_Theory_rec.con +cic:/Coq/field/Field_Theory/Field_Theory_rect.con +cic:/Coq/field/Field_Theory/RT.con +cic:/Coq/field/Field_Theory/Rmult_neq_0_reg.con +cic:/Coq/field/Field_Theory/Th_inv_def.con +cic:/Coq/field/Field_Theory/assoc.con +cic:/Coq/field/Field_Theory/assoc_correct.con +cic:/Coq/field/Field_Theory/assoc_mult.con +cic:/Coq/field/Field_Theory/assoc_mult_correct.con +cic:/Coq/field/Field_Theory/assoc_mult_correct1.con +cic:/Coq/field/Field_Theory/assoc_plus_correct.con +cic:/Coq/field/Field_Theory/distrib.con +cic:/Coq/field/Field_Theory/distrib_EAopp.con +cic:/Coq/field/Field_Theory/distrib_correct.con +cic:/Coq/field/Field_Theory/distrib_main.con +cic:/Coq/field/Field_Theory/distrib_mult_left.con +cic:/Coq/field/Field_Theory/distrib_mult_left_correct.con +cic:/Coq/field/Field_Theory/distrib_mult_right.con +cic:/Coq/field/Field_Theory/distrib_mult_right_correct.con +cic:/Coq/field/Field_Theory/eqExprA.con +cic:/Coq/field/Field_Theory/eqExprA_O.con +cic:/Coq/field/Field_Theory/eq_nat_dec.con +cic:/Coq/field/Field_Theory/interp_ExprA.con +cic:/Coq/field/Field_Theory/inverse_correct.con +cic:/Coq/field/Field_Theory/inverse_simplif.con +cic:/Coq/field/Field_Theory/merge_mult.con +cic:/Coq/field/Field_Theory/merge_mult_correct.con +cic:/Coq/field/Field_Theory/merge_mult_correct1.con +cic:/Coq/field/Field_Theory/merge_plus.con +cic:/Coq/field/Field_Theory/merge_plus_correct.con +cic:/Coq/field/Field_Theory/merge_plus_correct1.con +cic:/Coq/field/Field_Theory/monom_remove.con +cic:/Coq/field/Field_Theory/monom_remove_correct.con +cic:/Coq/field/Field_Theory/monom_simplif.con +cic:/Coq/field/Field_Theory/monom_simplif_correct.con +cic:/Coq/field/Field_Theory/monom_simplif_rem.con +cic:/Coq/field/Field_Theory/monom_simplif_rem_correct.con +cic:/Coq/field/Field_Theory/mult_eq.con +cic:/Coq/field/Field_Theory/mult_of_list.con +cic:/Coq/field/Field_Theory/multiply.con +cic:/Coq/field/Field_Theory/multiply_aux.con +cic:/Coq/field/Field_Theory/multiply_aux_correct.con +cic:/Coq/field/Field_Theory/multiply_correct.con +cic:/Coq/field/Field_Theory/r_AmultT_mult.con +cic:/Coq/field/Field_Theory/r_AplusT_plus.con +cic:/Coq/fourier/Fourier_util/Rfourier_eqLR_to_le.con +cic:/Coq/fourier/Fourier_util/Rfourier_eqRL_to_le.con +cic:/Coq/fourier/Fourier_util/Rfourier_ge_to_le.con +cic:/Coq/fourier/Fourier_util/Rfourier_gt_to_lt.con +cic:/Coq/fourier/Fourier_util/Rfourier_le.con +cic:/Coq/fourier/Fourier_util/Rfourier_le_le.con +cic:/Coq/fourier/Fourier_util/Rfourier_le_lt.con +cic:/Coq/fourier/Fourier_util/Rfourier_lt.con +cic:/Coq/fourier/Fourier_util/Rfourier_lt_le.con +cic:/Coq/fourier/Fourier_util/Rfourier_lt_lt.con +cic:/Coq/fourier/Fourier_util/Rfourier_not_ge_lt.con +cic:/Coq/fourier/Fourier_util/Rfourier_not_gt_le.con +cic:/Coq/fourier/Fourier_util/Rfourier_not_le_gt.con +cic:/Coq/fourier/Fourier_util/Rfourier_not_lt_ge.con +cic:/Coq/fourier/Fourier_util/Rle_mult_inv_pos.con +cic:/Coq/fourier/Fourier_util/Rle_not_lt.con +cic:/Coq/fourier/Fourier_util/Rle_zero_1.con +cic:/Coq/fourier/Fourier_util/Rle_zero_pos_plus1.con +cic:/Coq/fourier/Fourier_util/Rlt_mult_inv_pos.con +cic:/Coq/fourier/Fourier_util/Rlt_not_le.con +cic:/Coq/fourier/Fourier_util/Rlt_zero_1.con +cic:/Coq/fourier/Fourier_util/Rlt_zero_pos_plus1.con +cic:/Coq/fourier/Fourier_util/Rnot_le_le.con +cic:/Coq/fourier/Fourier_util/Rnot_lt0.con +cic:/Coq/fourier/Fourier_util/Rnot_lt_lt.con +cic:/Coq/omega/OmegaLemmas/OMEGA1.con +cic:/Coq/omega/OmegaLemmas/OMEGA10.con +cic:/Coq/omega/OmegaLemmas/OMEGA11.con +cic:/Coq/omega/OmegaLemmas/OMEGA12.con +cic:/Coq/omega/OmegaLemmas/OMEGA13.con +cic:/Coq/omega/OmegaLemmas/OMEGA14.con +cic:/Coq/omega/OmegaLemmas/OMEGA15.con +cic:/Coq/omega/OmegaLemmas/OMEGA16.con +cic:/Coq/omega/OmegaLemmas/OMEGA17.con +cic:/Coq/omega/OmegaLemmas/OMEGA18.con +cic:/Coq/omega/OmegaLemmas/OMEGA19.con +cic:/Coq/omega/OmegaLemmas/OMEGA2.con +cic:/Coq/omega/OmegaLemmas/OMEGA20.con +cic:/Coq/omega/OmegaLemmas/OMEGA3.con +cic:/Coq/omega/OmegaLemmas/OMEGA4.con +cic:/Coq/omega/OmegaLemmas/OMEGA5.con +cic:/Coq/omega/OmegaLemmas/OMEGA6.con +cic:/Coq/omega/OmegaLemmas/OMEGA7.con +cic:/Coq/omega/OmegaLemmas/OMEGA8.con +cic:/Coq/omega/OmegaLemmas/OMEGA9.con +cic:/Coq/omega/OmegaLemmas/fast_OMEGA10.con +cic:/Coq/omega/OmegaLemmas/fast_OMEGA11.con +cic:/Coq/omega/OmegaLemmas/fast_OMEGA12.con +cic:/Coq/omega/OmegaLemmas/fast_OMEGA13.con +cic:/Coq/omega/OmegaLemmas/fast_OMEGA14.con +cic:/Coq/omega/OmegaLemmas/fast_OMEGA15.con +cic:/Coq/omega/OmegaLemmas/fast_OMEGA16.con +cic:/Coq/omega/OmegaLemmas/fast_Zmult_Zopp_left.con +cic:/Coq/omega/OmegaLemmas/fast_Zmult_assoc_r.con +cic:/Coq/omega/OmegaLemmas/fast_Zmult_plus_distr.con +cic:/Coq/omega/OmegaLemmas/fast_Zmult_sym.con +cic:/Coq/omega/OmegaLemmas/fast_Zopp_Zmult_r.con +cic:/Coq/omega/OmegaLemmas/fast_Zopp_Zopp.con +cic:/Coq/omega/OmegaLemmas/fast_Zopp_Zplus.con +cic:/Coq/omega/OmegaLemmas/fast_Zopp_one.con +cic:/Coq/omega/OmegaLemmas/fast_Zplus_assoc_l.con +cic:/Coq/omega/OmegaLemmas/fast_Zplus_assoc_r.con +cic:/Coq/omega/OmegaLemmas/fast_Zplus_permute.con +cic:/Coq/omega/OmegaLemmas/fast_Zplus_sym.con +cic:/Coq/omega/OmegaLemmas/fast_Zred_factor0.con +cic:/Coq/omega/OmegaLemmas/fast_Zred_factor1.con +cic:/Coq/omega/OmegaLemmas/fast_Zred_factor2.con +cic:/Coq/omega/OmegaLemmas/fast_Zred_factor3.con +cic:/Coq/omega/OmegaLemmas/fast_Zred_factor4.con +cic:/Coq/omega/OmegaLemmas/fast_Zred_factor5.con +cic:/Coq/omega/OmegaLemmas/fast_Zred_factor6.con +cic:/Coq/omega/OmegaLemmas/new_var.con +cic:/Coq/ring/ArithRing/NatTheory.con +cic:/Coq/ring/ArithRing/S_to_plus_one.con +cic:/Coq/ring/ArithRing/nateq.con +cic:/Coq/ring/ArithRing/nateq_prop.con +cic:/Coq/ring/NArithRing/NTheory.con +cic:/Coq/ring/NArithRing/Neq.con +cic:/Coq/ring/NArithRing/Neq_prop.con +cic:/Coq/ring/Quote/index_eq.con +cic:/Coq/ring/Quote/index_eq_prop.con +cic:/Coq/ring/Quote/index_ind.con +cic:/Coq/ring/Quote/index_lt.con +cic:/Coq/ring/Quote/index_rec.con +cic:/Coq/ring/Quote/index_rect.con +cic:/Coq/ring/Quote/varmap_find.con +cic:/Coq/ring/Quote/varmap_ind.con +cic:/Coq/ring/Quote/varmap_rec.con +cic:/Coq/ring/Quote/varmap_rect.con +cic:/Coq/ring/Ring/BoolTheory.con +cic:/Coq/ring/Ring_abstract/abstract_sum_ind.con +cic:/Coq/ring/Ring_abstract/abstract_sum_merge.con +cic:/Coq/ring/Ring_abstract/abstract_sum_merge_ok.con +cic:/Coq/ring/Ring_abstract/abstract_sum_prod.con +cic:/Coq/ring/Ring_abstract/abstract_sum_prod_ok.con +cic:/Coq/ring/Ring_abstract/abstract_sum_rec.con +cic:/Coq/ring/Ring_abstract/abstract_sum_rect.con +cic:/Coq/ring/Ring_abstract/abstract_sum_scalar.con +cic:/Coq/ring/Ring_abstract/abstract_sum_scalar_ok.con +cic:/Coq/ring/Ring_abstract/abstract_varlist_insert.con +cic:/Coq/ring/Ring_abstract/abstract_varlist_insert_ok.con +cic:/Coq/ring/Ring_abstract/apolynomial_ind.con +cic:/Coq/ring/Ring_abstract/apolynomial_normalize.con +cic:/Coq/ring/Ring_abstract/apolynomial_normalize_ok.con +cic:/Coq/ring/Ring_abstract/apolynomial_rec.con +cic:/Coq/ring/Ring_abstract/apolynomial_rect.con +cic:/Coq/ring/Ring_abstract/aspolynomial_ind.con +cic:/Coq/ring/Ring_abstract/aspolynomial_normalize.con +cic:/Coq/ring/Ring_abstract/aspolynomial_normalize_ok.con +cic:/Coq/ring/Ring_abstract/aspolynomial_rec.con +cic:/Coq/ring/Ring_abstract/aspolynomial_rect.con +cic:/Coq/ring/Ring_abstract/iacs_aux.con +cic:/Coq/ring/Ring_abstract/iacs_aux_ok.con +cic:/Coq/ring/Ring_abstract/interp_acs.con +cic:/Coq/ring/Ring_abstract/interp_ap.con +cic:/Coq/ring/Ring_abstract/interp_asp.con +cic:/Coq/ring/Ring_abstract/interp_sacs.con +cic:/Coq/ring/Ring_abstract/isacs_aux.con +cic:/Coq/ring/Ring_abstract/isacs_aux_ok.con +cic:/Coq/ring/Ring_abstract/minus_sum_scalar.con +cic:/Coq/ring/Ring_abstract/minus_sum_scalar_ok.con +cic:/Coq/ring/Ring_abstract/minus_varlist_insert.con +cic:/Coq/ring/Ring_abstract/minus_varlist_insert_ok.con +cic:/Coq/ring/Ring_abstract/plus_sum_scalar.con +cic:/Coq/ring/Ring_abstract/plus_sum_scalar_ok.con +cic:/Coq/ring/Ring_abstract/plus_varlist_insert.con +cic:/Coq/ring/Ring_abstract/plus_varlist_insert_ok.con +cic:/Coq/ring/Ring_abstract/signed_sum_ind.con +cic:/Coq/ring/Ring_abstract/signed_sum_merge.con +cic:/Coq/ring/Ring_abstract/signed_sum_merge_ok.con +cic:/Coq/ring/Ring_abstract/signed_sum_opp.con +cic:/Coq/ring/Ring_abstract/signed_sum_opp_ok.con +cic:/Coq/ring/Ring_abstract/signed_sum_prod.con +cic:/Coq/ring/Ring_abstract/signed_sum_prod_ok.con +cic:/Coq/ring/Ring_abstract/signed_sum_rec.con +cic:/Coq/ring/Ring_abstract/signed_sum_rect.con +cic:/Coq/ring/Ring_normalize/canonical_sum_ind.con +cic:/Coq/ring/Ring_normalize/canonical_sum_merge.con +cic:/Coq/ring/Ring_normalize/canonical_sum_merge_ok.con +cic:/Coq/ring/Ring_normalize/canonical_sum_prod.con +cic:/Coq/ring/Ring_normalize/canonical_sum_prod_ok.con +cic:/Coq/ring/Ring_normalize/canonical_sum_rec.con +cic:/Coq/ring/Ring_normalize/canonical_sum_rect.con +cic:/Coq/ring/Ring_normalize/canonical_sum_scalar.con +cic:/Coq/ring/Ring_normalize/canonical_sum_scalar2.con +cic:/Coq/ring/Ring_normalize/canonical_sum_scalar2_ok.con +cic:/Coq/ring/Ring_normalize/canonical_sum_scalar3.con +cic:/Coq/ring/Ring_normalize/canonical_sum_scalar3_ok.con +cic:/Coq/ring/Ring_normalize/canonical_sum_scalar_ok.con +cic:/Coq/ring/Ring_normalize/canonical_sum_simplify.con +cic:/Coq/ring/Ring_normalize/canonical_sum_simplify_ok.con +cic:/Coq/ring/Ring_normalize/ics_aux.con +cic:/Coq/ring/Ring_normalize/ics_aux_ok.con +cic:/Coq/ring/Ring_normalize/index_eq_prop.con +cic:/Coq/ring/Ring_normalize/interp_cs.con +cic:/Coq/ring/Ring_normalize/interp_m.con +cic:/Coq/ring/Ring_normalize/interp_m_ok.con +cic:/Coq/ring/Ring_normalize/interp_p.con +cic:/Coq/ring/Ring_normalize/interp_sp.con +cic:/Coq/ring/Ring_normalize/interp_var.con +cic:/Coq/ring/Ring_normalize/interp_vl.con +cic:/Coq/ring/Ring_normalize/ivl_aux.con +cic:/Coq/ring/Ring_normalize/ivl_aux_ok.con +cic:/Coq/ring/Ring_normalize/monom_insert.con +cic:/Coq/ring/Ring_normalize/monom_insert_ok.con +cic:/Coq/ring/Ring_normalize/polynomial_ind.con +cic:/Coq/ring/Ring_normalize/polynomial_normalize.con +cic:/Coq/ring/Ring_normalize/polynomial_normalize_ok.con +cic:/Coq/ring/Ring_normalize/polynomial_rec.con +cic:/Coq/ring/Ring_normalize/polynomial_rect.con +cic:/Coq/ring/Ring_normalize/polynomial_simplify.con +cic:/Coq/ring/Ring_normalize/polynomial_simplify_ok.con +cic:/Coq/ring/Ring_normalize/spolynomial_ind.con +cic:/Coq/ring/Ring_normalize/spolynomial_normalize.con +cic:/Coq/ring/Ring_normalize/spolynomial_normalize_ok.con +cic:/Coq/ring/Ring_normalize/spolynomial_of.con +cic:/Coq/ring/Ring_normalize/spolynomial_of_ok.con +cic:/Coq/ring/Ring_normalize/spolynomial_rec.con +cic:/Coq/ring/Ring_normalize/spolynomial_rect.con +cic:/Coq/ring/Ring_normalize/spolynomial_simplify.con +cic:/Coq/ring/Ring_normalize/spolynomial_simplify_ok.con +cic:/Coq/ring/Ring_normalize/varlist_eq.con +cic:/Coq/ring/Ring_normalize/varlist_eq_prop.con +cic:/Coq/ring/Ring_normalize/varlist_ind.con +cic:/Coq/ring/Ring_normalize/varlist_insert.con +cic:/Coq/ring/Ring_normalize/varlist_insert_ok.con +cic:/Coq/ring/Ring_normalize/varlist_lt.con +cic:/Coq/ring/Ring_normalize/varlist_merge.con +cic:/Coq/ring/Ring_normalize/varlist_merge_ok.con +cic:/Coq/ring/Ring_normalize/varlist_rec.con +cic:/Coq/ring/Ring_normalize/varlist_rect.con +cic:/Coq/ring/Ring_theory/Ring_Theory_ind.con +cic:/Coq/ring/Ring_theory/Ring_Theory_rec.con +cic:/Coq/ring/Ring_theory/Ring_Theory_rect.con +cic:/Coq/ring/Ring_theory/SR_distr_left.con +cic:/Coq/ring/Ring_theory/SR_distr_left2.con +cic:/Coq/ring/Ring_theory/SR_distr_right.con +cic:/Coq/ring/Ring_theory/SR_distr_right2.con +cic:/Coq/ring/Ring_theory/SR_eq_prop.con +cic:/Coq/ring/Ring_theory/SR_mult_assoc.con +cic:/Coq/ring/Ring_theory/SR_mult_assoc2.con +cic:/Coq/ring/Ring_theory/SR_mult_comm.con +cic:/Coq/ring/Ring_theory/SR_mult_one_left.con +cic:/Coq/ring/Ring_theory/SR_mult_one_left2.con +cic:/Coq/ring/Ring_theory/SR_mult_one_right.con +cic:/Coq/ring/Ring_theory/SR_mult_one_right2.con +cic:/Coq/ring/Ring_theory/SR_mult_permute.con +cic:/Coq/ring/Ring_theory/SR_mult_zero_left.con +cic:/Coq/ring/Ring_theory/SR_mult_zero_left2.con +cic:/Coq/ring/Ring_theory/SR_mult_zero_right.con +cic:/Coq/ring/Ring_theory/SR_mult_zero_right2.con +cic:/Coq/ring/Ring_theory/SR_plus_assoc.con +cic:/Coq/ring/Ring_theory/SR_plus_assoc2.con +cic:/Coq/ring/Ring_theory/SR_plus_comm.con +cic:/Coq/ring/Ring_theory/SR_plus_permute.con +cic:/Coq/ring/Ring_theory/SR_plus_reg_left.con +cic:/Coq/ring/Ring_theory/SR_plus_reg_right.con +cic:/Coq/ring/Ring_theory/SR_plus_zero_left.con +cic:/Coq/ring/Ring_theory/SR_plus_zero_left2.con +cic:/Coq/ring/Ring_theory/SR_plus_zero_right.con +cic:/Coq/ring/Ring_theory/SR_plus_zero_right2.con +cic:/Coq/ring/Ring_theory/Semi_Ring_Theory_ind.con +cic:/Coq/ring/Ring_theory/Semi_Ring_Theory_of.con +cic:/Coq/ring/Ring_theory/Semi_Ring_Theory_rec.con +cic:/Coq/ring/Ring_theory/Semi_Ring_Theory_rect.con +cic:/Coq/ring/Ring_theory/Th_distr_left.con +cic:/Coq/ring/Ring_theory/Th_distr_left2.con +cic:/Coq/ring/Ring_theory/Th_distr_right.con +cic:/Coq/ring/Ring_theory/Th_distr_right2.con +cic:/Coq/ring/Ring_theory/Th_eq_prop.con +cic:/Coq/ring/Ring_theory/Th_mult_assoc.con +cic:/Coq/ring/Ring_theory/Th_mult_assoc2.con +cic:/Coq/ring/Ring_theory/Th_mult_one_left.con +cic:/Coq/ring/Ring_theory/Th_mult_one_left2.con +cic:/Coq/ring/Ring_theory/Th_mult_one_right.con +cic:/Coq/ring/Ring_theory/Th_mult_one_right2.con +cic:/Coq/ring/Ring_theory/Th_mult_opp_opp.con +cic:/Coq/ring/Ring_theory/Th_mult_opp_opp2.con +cic:/Coq/ring/Ring_theory/Th_mult_permute.con +cic:/Coq/ring/Ring_theory/Th_mult_sym.con +cic:/Coq/ring/Ring_theory/Th_mult_zero_left.con +cic:/Coq/ring/Ring_theory/Th_mult_zero_left2.con +cic:/Coq/ring/Ring_theory/Th_mult_zero_right.con +cic:/Coq/ring/Ring_theory/Th_mult_zero_right2.con +cic:/Coq/ring/Ring_theory/Th_opp_def.con +cic:/Coq/ring/Ring_theory/Th_opp_def2.con +cic:/Coq/ring/Ring_theory/Th_opp_mult_left.con +cic:/Coq/ring/Ring_theory/Th_opp_mult_left2.con +cic:/Coq/ring/Ring_theory/Th_opp_mult_right.con +cic:/Coq/ring/Ring_theory/Th_opp_mult_right2.con +cic:/Coq/ring/Ring_theory/Th_opp_opp.con +cic:/Coq/ring/Ring_theory/Th_opp_opp2.con +cic:/Coq/ring/Ring_theory/Th_opp_zero.con +cic:/Coq/ring/Ring_theory/Th_plus_assoc.con +cic:/Coq/ring/Ring_theory/Th_plus_assoc2.con +cic:/Coq/ring/Ring_theory/Th_plus_comm.con +cic:/Coq/ring/Ring_theory/Th_plus_opp_opp.con +cic:/Coq/ring/Ring_theory/Th_plus_permute.con +cic:/Coq/ring/Ring_theory/Th_plus_permute_opp.con +cic:/Coq/ring/Ring_theory/Th_plus_reg_left.con +cic:/Coq/ring/Ring_theory/Th_plus_reg_right.con +cic:/Coq/ring/Ring_theory/Th_plus_zero_left.con +cic:/Coq/ring/Ring_theory/Th_plus_zero_left2.con +cic:/Coq/ring/Ring_theory/Th_plus_zero_right.con +cic:/Coq/ring/Ring_theory/Th_plus_zero_right2.con +cic:/Coq/ring/Ring_theory/aux1.con +cic:/Coq/ring/Ring_theory/aux2.con +cic:/Coq/ring/Setoid_ring_normalize/Amult_ext.con +cic:/Coq/ring/Setoid_ring_normalize/Aopp_ext.con +cic:/Coq/ring/Setoid_ring_normalize/Aplus_ext.con +cic:/Coq/ring/Setoid_ring_normalize/canonical_sum_ind.con +cic:/Coq/ring/Setoid_ring_normalize/canonical_sum_merge.con +cic:/Coq/ring/Setoid_ring_normalize/canonical_sum_merge_ok.con +cic:/Coq/ring/Setoid_ring_normalize/canonical_sum_prod.con +cic:/Coq/ring/Setoid_ring_normalize/canonical_sum_prod_ok.con +cic:/Coq/ring/Setoid_ring_normalize/canonical_sum_rec.con +cic:/Coq/ring/Setoid_ring_normalize/canonical_sum_rect.con +cic:/Coq/ring/Setoid_ring_normalize/canonical_sum_scalar.con +cic:/Coq/ring/Setoid_ring_normalize/canonical_sum_scalar2.con +cic:/Coq/ring/Setoid_ring_normalize/canonical_sum_scalar2_ok.con +cic:/Coq/ring/Setoid_ring_normalize/canonical_sum_scalar3.con +cic:/Coq/ring/Setoid_ring_normalize/canonical_sum_scalar3_ok.con +cic:/Coq/ring/Setoid_ring_normalize/canonical_sum_scalar_ok.con +cic:/Coq/ring/Setoid_ring_normalize/canonical_sum_simplify.con +cic:/Coq/ring/Setoid_ring_normalize/canonical_sum_simplify_ok.con +cic:/Coq/ring/Setoid_ring_normalize/ics_aux.con +cic:/Coq/ring/Setoid_ring_normalize/ics_aux_ok.con +cic:/Coq/ring/Setoid_ring_normalize/index_eq_prop.con +cic:/Coq/ring/Setoid_ring_normalize/interp_m.con +cic:/Coq/ring/Setoid_ring_normalize/interp_m_ok.con +cic:/Coq/ring/Setoid_ring_normalize/interp_setcs.con +cic:/Coq/ring/Setoid_ring_normalize/interp_setp.con +cic:/Coq/ring/Setoid_ring_normalize/interp_setsp.con +cic:/Coq/ring/Setoid_ring_normalize/interp_var.con +cic:/Coq/ring/Setoid_ring_normalize/interp_vl.con +cic:/Coq/ring/Setoid_ring_normalize/ivl_aux.con +cic:/Coq/ring/Setoid_ring_normalize/ivl_aux_ok.con +cic:/Coq/ring/Setoid_ring_normalize/monom_insert.con +cic:/Coq/ring/Setoid_ring_normalize/monom_insert_ok.con +cic:/Coq/ring/Setoid_ring_normalize/setoid_eq_ext1.con +cic:/Coq/ring/Setoid_ring_normalize/setoid_eq_ext2.con +cic:/Coq/ring/Setoid_ring_normalize/setpolynomial_ind.con +cic:/Coq/ring/Setoid_ring_normalize/setpolynomial_normalize.con +cic:/Coq/ring/Setoid_ring_normalize/setpolynomial_normalize_ok.con +cic:/Coq/ring/Setoid_ring_normalize/setpolynomial_rec.con +cic:/Coq/ring/Setoid_ring_normalize/setpolynomial_rect.con +cic:/Coq/ring/Setoid_ring_normalize/setpolynomial_simplify.con +cic:/Coq/ring/Setoid_ring_normalize/setpolynomial_simplify_ok.con +cic:/Coq/ring/Setoid_ring_normalize/setspolynomial_ind.con +cic:/Coq/ring/Setoid_ring_normalize/setspolynomial_normalize.con +cic:/Coq/ring/Setoid_ring_normalize/setspolynomial_normalize_ok.con +cic:/Coq/ring/Setoid_ring_normalize/setspolynomial_of.con +cic:/Coq/ring/Setoid_ring_normalize/setspolynomial_of_ok.con +cic:/Coq/ring/Setoid_ring_normalize/setspolynomial_rec.con +cic:/Coq/ring/Setoid_ring_normalize/setspolynomial_rect.con +cic:/Coq/ring/Setoid_ring_normalize/setspolynomial_simplify.con +cic:/Coq/ring/Setoid_ring_normalize/setspolynomial_simplify_ok.con +cic:/Coq/ring/Setoid_ring_normalize/varlist_eq.con +cic:/Coq/ring/Setoid_ring_normalize/varlist_eq_prop.con +cic:/Coq/ring/Setoid_ring_normalize/varlist_ind.con +cic:/Coq/ring/Setoid_ring_normalize/varlist_insert.con +cic:/Coq/ring/Setoid_ring_normalize/varlist_insert_ok.con +cic:/Coq/ring/Setoid_ring_normalize/varlist_lt.con +cic:/Coq/ring/Setoid_ring_normalize/varlist_merge.con +cic:/Coq/ring/Setoid_ring_normalize/varlist_merge_ok.con +cic:/Coq/ring/Setoid_ring_normalize/varlist_rec.con +cic:/Coq/ring/Setoid_ring_normalize/varlist_rect.con +cic:/Coq/ring/Setoid_ring_theory/Amult_ext.con +cic:/Coq/ring/Setoid_ring_theory/Aopp_ext.con +cic:/Coq/ring/Setoid_ring_theory/Aplus_ext.con +cic:/Coq/ring/Setoid_ring_theory/SSR_distr_left.con +cic:/Coq/ring/Setoid_ring_theory/SSR_distr_left2.con +cic:/Coq/ring/Setoid_ring_theory/SSR_distr_right.con +cic:/Coq/ring/Setoid_ring_theory/SSR_distr_right2.con +cic:/Coq/ring/Setoid_ring_theory/SSR_eq_prop.con +cic:/Coq/ring/Setoid_ring_theory/SSR_mult_assoc.con +cic:/Coq/ring/Setoid_ring_theory/SSR_mult_assoc2.con +cic:/Coq/ring/Setoid_ring_theory/SSR_mult_comm.con +cic:/Coq/ring/Setoid_ring_theory/SSR_mult_one_left.con +cic:/Coq/ring/Setoid_ring_theory/SSR_mult_one_left2.con +cic:/Coq/ring/Setoid_ring_theory/SSR_mult_one_right.con +cic:/Coq/ring/Setoid_ring_theory/SSR_mult_one_right2.con +cic:/Coq/ring/Setoid_ring_theory/SSR_mult_permute.con +cic:/Coq/ring/Setoid_ring_theory/SSR_mult_zero_left.con +cic:/Coq/ring/Setoid_ring_theory/SSR_mult_zero_left2.con +cic:/Coq/ring/Setoid_ring_theory/SSR_mult_zero_right.con +cic:/Coq/ring/Setoid_ring_theory/SSR_mult_zero_right2.con +cic:/Coq/ring/Setoid_ring_theory/SSR_plus_assoc.con +cic:/Coq/ring/Setoid_ring_theory/SSR_plus_assoc2.con +cic:/Coq/ring/Setoid_ring_theory/SSR_plus_comm.con +cic:/Coq/ring/Setoid_ring_theory/SSR_plus_permute.con +cic:/Coq/ring/Setoid_ring_theory/SSR_plus_reg_left.con +cic:/Coq/ring/Setoid_ring_theory/SSR_plus_reg_right.con +cic:/Coq/ring/Setoid_ring_theory/SSR_plus_zero_left.con +cic:/Coq/ring/Setoid_ring_theory/SSR_plus_zero_left2.con +cic:/Coq/ring/Setoid_ring_theory/SSR_plus_zero_right.con +cic:/Coq/ring/Setoid_ring_theory/SSR_plus_zero_right2.con +cic:/Coq/ring/Setoid_ring_theory/STh_distr_left.con +cic:/Coq/ring/Setoid_ring_theory/STh_distr_left2.con +cic:/Coq/ring/Setoid_ring_theory/STh_distr_right.con +cic:/Coq/ring/Setoid_ring_theory/STh_distr_right2.con +cic:/Coq/ring/Setoid_ring_theory/STh_eq_prop.con +cic:/Coq/ring/Setoid_ring_theory/STh_mult_assoc.con +cic:/Coq/ring/Setoid_ring_theory/STh_mult_assoc2.con +cic:/Coq/ring/Setoid_ring_theory/STh_mult_one_left.con +cic:/Coq/ring/Setoid_ring_theory/STh_mult_one_left2.con +cic:/Coq/ring/Setoid_ring_theory/STh_mult_one_right.con +cic:/Coq/ring/Setoid_ring_theory/STh_mult_one_right2.con +cic:/Coq/ring/Setoid_ring_theory/STh_mult_opp_opp.con +cic:/Coq/ring/Setoid_ring_theory/STh_mult_opp_opp2.con +cic:/Coq/ring/Setoid_ring_theory/STh_mult_permute.con +cic:/Coq/ring/Setoid_ring_theory/STh_mult_sym.con +cic:/Coq/ring/Setoid_ring_theory/STh_mult_zero_left.con +cic:/Coq/ring/Setoid_ring_theory/STh_mult_zero_left2.con +cic:/Coq/ring/Setoid_ring_theory/STh_mult_zero_right.con +cic:/Coq/ring/Setoid_ring_theory/STh_mult_zero_right2.con +cic:/Coq/ring/Setoid_ring_theory/STh_opp_def.con +cic:/Coq/ring/Setoid_ring_theory/STh_opp_def2.con +cic:/Coq/ring/Setoid_ring_theory/STh_opp_mult_left.con +cic:/Coq/ring/Setoid_ring_theory/STh_opp_mult_left2.con +cic:/Coq/ring/Setoid_ring_theory/STh_opp_mult_right.con +cic:/Coq/ring/Setoid_ring_theory/STh_opp_mult_right2.con +cic:/Coq/ring/Setoid_ring_theory/STh_opp_opp.con +cic:/Coq/ring/Setoid_ring_theory/STh_opp_opp2.con +cic:/Coq/ring/Setoid_ring_theory/STh_opp_zero.con +cic:/Coq/ring/Setoid_ring_theory/STh_plus_assoc.con +cic:/Coq/ring/Setoid_ring_theory/STh_plus_assoc2.con +cic:/Coq/ring/Setoid_ring_theory/STh_plus_comm.con +cic:/Coq/ring/Setoid_ring_theory/STh_plus_opp_opp.con +cic:/Coq/ring/Setoid_ring_theory/STh_plus_permute.con +cic:/Coq/ring/Setoid_ring_theory/STh_plus_permute_opp.con +cic:/Coq/ring/Setoid_ring_theory/STh_plus_reg_left.con +cic:/Coq/ring/Setoid_ring_theory/STh_plus_reg_right.con +cic:/Coq/ring/Setoid_ring_theory/STh_plus_zero_left.con +cic:/Coq/ring/Setoid_ring_theory/STh_plus_zero_left2.con +cic:/Coq/ring/Setoid_ring_theory/STh_plus_zero_right.con +cic:/Coq/ring/Setoid_ring_theory/STh_plus_zero_right2.con +cic:/Coq/ring/Setoid_ring_theory/Saux1.con +cic:/Coq/ring/Setoid_ring_theory/Saux2.con +cic:/Coq/ring/Setoid_ring_theory/Semi_Setoid_Ring_Theory_ind.con +cic:/Coq/ring/Setoid_ring_theory/Semi_Setoid_Ring_Theory_of.con +cic:/Coq/ring/Setoid_ring_theory/Semi_Setoid_Ring_Theory_rec.con +cic:/Coq/ring/Setoid_ring_theory/Semi_Setoid_Ring_Theory_rect.con +cic:/Coq/ring/Setoid_ring_theory/Setoid_Ring_Theory_ind.con +cic:/Coq/ring/Setoid_ring_theory/Setoid_Ring_Theory_rec.con +cic:/Coq/ring/Setoid_ring_theory/Setoid_Ring_Theory_rect.con +cic:/Coq/ring/Setoid_ring_theory/setoid_eq_ext1.con +cic:/Coq/ring/Setoid_ring_theory/setoid_eq_ext2.con +cic:/Coq/ring/ZArithRing/ZTheory.con +cic:/Coq/ring/ZArithRing/Zeq.con +cic:/Coq/ring/ZArithRing/Zeq_prop.con +cic:/Coq/romega/ReflOmegaCore/PropList_ind.con +cic:/Coq/romega/ReflOmegaCore/PropList_rec.con +cic:/Coq/romega/ReflOmegaCore/PropList_rect.con +cic:/Coq/romega/ReflOmegaCore/T_OMEGA10.con +cic:/Coq/romega/ReflOmegaCore/T_OMEGA10_stable.con +cic:/Coq/romega/ReflOmegaCore/T_OMEGA11.con +cic:/Coq/romega/ReflOmegaCore/T_OMEGA11_stable.con +cic:/Coq/romega/ReflOmegaCore/T_OMEGA12.con +cic:/Coq/romega/ReflOmegaCore/T_OMEGA12_stable.con +cic:/Coq/romega/ReflOmegaCore/T_OMEGA13.con +cic:/Coq/romega/ReflOmegaCore/T_OMEGA13_stable.con +cic:/Coq/romega/ReflOmegaCore/T_OMEGA15.con +cic:/Coq/romega/ReflOmegaCore/T_OMEGA15_stable.con +cic:/Coq/romega/ReflOmegaCore/T_OMEGA16.con +cic:/Coq/romega/ReflOmegaCore/T_OMEGA16_stable.con +cic:/Coq/romega/ReflOmegaCore/Tminus_def.con +cic:/Coq/romega/ReflOmegaCore/Tminus_def_stable.con +cic:/Coq/romega/ReflOmegaCore/Tmult_assoc_r.con +cic:/Coq/romega/ReflOmegaCore/Tmult_assoc_r_stable.con +cic:/Coq/romega/ReflOmegaCore/Tmult_assoc_reduced.con +cic:/Coq/romega/ReflOmegaCore/Tmult_assoc_reduced_stable.con +cic:/Coq/romega/ReflOmegaCore/Tmult_opp_left.con +cic:/Coq/romega/ReflOmegaCore/Tmult_opp_left_stable.con +cic:/Coq/romega/ReflOmegaCore/Tmult_plus_distr.con +cic:/Coq/romega/ReflOmegaCore/Tmult_plus_distr_stable.con +cic:/Coq/romega/ReflOmegaCore/Tmult_sym.con +cic:/Coq/romega/ReflOmegaCore/Tmult_sym_stable.con +cic:/Coq/romega/ReflOmegaCore/Topp_mult_r.con +cic:/Coq/romega/ReflOmegaCore/Topp_mult_r_stable.con +cic:/Coq/romega/ReflOmegaCore/Topp_one.con +cic:/Coq/romega/ReflOmegaCore/Topp_one_stable.con +cic:/Coq/romega/ReflOmegaCore/Topp_opp.con +cic:/Coq/romega/ReflOmegaCore/Topp_opp_stable.con +cic:/Coq/romega/ReflOmegaCore/Topp_plus.con +cic:/Coq/romega/ReflOmegaCore/Topp_plus_stable.con +cic:/Coq/romega/ReflOmegaCore/Tplus_assoc_l.con +cic:/Coq/romega/ReflOmegaCore/Tplus_assoc_l_stable.con +cic:/Coq/romega/ReflOmegaCore/Tplus_assoc_r.con +cic:/Coq/romega/ReflOmegaCore/Tplus_assoc_r_stable.con +cic:/Coq/romega/ReflOmegaCore/Tplus_permute.con +cic:/Coq/romega/ReflOmegaCore/Tplus_permute_stable.con +cic:/Coq/romega/ReflOmegaCore/Tplus_sym.con +cic:/Coq/romega/ReflOmegaCore/Tplus_sym_stable.con +cic:/Coq/romega/ReflOmegaCore/Tred_factor0.con +cic:/Coq/romega/ReflOmegaCore/Tred_factor0_stable.con +cic:/Coq/romega/ReflOmegaCore/Tred_factor1.con +cic:/Coq/romega/ReflOmegaCore/Tred_factor1_stable.con +cic:/Coq/romega/ReflOmegaCore/Tred_factor2.con +cic:/Coq/romega/ReflOmegaCore/Tred_factor2_stable.con +cic:/Coq/romega/ReflOmegaCore/Tred_factor3.con +cic:/Coq/romega/ReflOmegaCore/Tred_factor3_stable.con +cic:/Coq/romega/ReflOmegaCore/Tred_factor4.con +cic:/Coq/romega/ReflOmegaCore/Tred_factor4_stable.con +cic:/Coq/romega/ReflOmegaCore/Tred_factor5.con +cic:/Coq/romega/ReflOmegaCore/Tred_factor5_stable.con +cic:/Coq/romega/ReflOmegaCore/Tred_factor6.con +cic:/Coq/romega/ReflOmegaCore/Tred_factor6_stable.con +cic:/Coq/romega/ReflOmegaCore/Zlt_left_inv.con +cic:/Coq/romega/ReflOmegaCore/Zne_left_2.con +cic:/Coq/romega/ReflOmegaCore/absurd.con +cic:/Coq/romega/ReflOmegaCore/add_norm.con +cic:/Coq/romega/ReflOmegaCore/add_norm_stable.con +cic:/Coq/romega/ReflOmegaCore/append_goal.con +cic:/Coq/romega/ReflOmegaCore/append_valid.con +cic:/Coq/romega/ReflOmegaCore/apply_both.con +cic:/Coq/romega/ReflOmegaCore/apply_both_stable.con +cic:/Coq/romega/ReflOmegaCore/apply_left.con +cic:/Coq/romega/ReflOmegaCore/apply_left_stable.con +cic:/Coq/romega/ReflOmegaCore/apply_oper_1.con +cic:/Coq/romega/ReflOmegaCore/apply_oper_1_valid.con +cic:/Coq/romega/ReflOmegaCore/apply_oper_2.con +cic:/Coq/romega/ReflOmegaCore/apply_oper_2_valid.con +cic:/Coq/romega/ReflOmegaCore/apply_right.con +cic:/Coq/romega/ReflOmegaCore/apply_right_stable.con +cic:/Coq/romega/ReflOmegaCore/bool_ind2.con +cic:/Coq/romega/ReflOmegaCore/co_valid1.con +cic:/Coq/romega/ReflOmegaCore/compose_term_stable.con +cic:/Coq/romega/ReflOmegaCore/concl_to_hyp.con +cic:/Coq/romega/ReflOmegaCore/constant_neg.con +cic:/Coq/romega/ReflOmegaCore/constant_neg_valid.con +cic:/Coq/romega/ReflOmegaCore/constant_not_nul.con +cic:/Coq/romega/ReflOmegaCore/constant_not_nul_valid.con +cic:/Coq/romega/ReflOmegaCore/constant_nul.con +cic:/Coq/romega/ReflOmegaCore/constant_nul_valid.con +cic:/Coq/romega/ReflOmegaCore/contradiction.con +cic:/Coq/romega/ReflOmegaCore/contradiction_valid.con +cic:/Coq/romega/ReflOmegaCore/decidability.con +cic:/Coq/romega/ReflOmegaCore/decidable_correct.con +cic:/Coq/romega/ReflOmegaCore/decompose_solve.con +cic:/Coq/romega/ReflOmegaCore/decompose_solve_valid.con +cic:/Coq/romega/ReflOmegaCore/destructure_hyps.con +cic:/Coq/romega/ReflOmegaCore/destructure_hyps_valid.con +cic:/Coq/romega/ReflOmegaCore/direction_ind.con +cic:/Coq/romega/ReflOmegaCore/direction_rec.con +cic:/Coq/romega/ReflOmegaCore/direction_rect.con +cic:/Coq/romega/ReflOmegaCore/divide_and_approx.con +cic:/Coq/romega/ReflOmegaCore/divide_and_approx_valid.con +cic:/Coq/romega/ReflOmegaCore/do_concl_to_hyp.con +cic:/Coq/romega/ReflOmegaCore/do_normalize.con +cic:/Coq/romega/ReflOmegaCore/do_normalize_list.con +cic:/Coq/romega/ReflOmegaCore/do_normalize_list_valid.con +cic:/Coq/romega/ReflOmegaCore/do_normalize_valid.con +cic:/Coq/romega/ReflOmegaCore/do_omega.con +cic:/Coq/romega/ReflOmegaCore/do_reduce_lhyps.con +cic:/Coq/romega/ReflOmegaCore/e_step_ind.con +cic:/Coq/romega/ReflOmegaCore/e_step_rec.con +cic:/Coq/romega/ReflOmegaCore/e_step_rect.con +cic:/Coq/romega/ReflOmegaCore/eq_Z.con +cic:/Coq/romega/ReflOmegaCore/eq_Z_false.con +cic:/Coq/romega/ReflOmegaCore/eq_Z_true.con +cic:/Coq/romega/ReflOmegaCore/eq_nat.con +cic:/Coq/romega/ReflOmegaCore/eq_nat_false.con +cic:/Coq/romega/ReflOmegaCore/eq_nat_true.con +cic:/Coq/romega/ReflOmegaCore/eq_pos.con +cic:/Coq/romega/ReflOmegaCore/eq_pos_false.con +cic:/Coq/romega/ReflOmegaCore/eq_pos_true.con +cic:/Coq/romega/ReflOmegaCore/eq_term.con +cic:/Coq/romega/ReflOmegaCore/eq_term_false.con +cic:/Coq/romega/ReflOmegaCore/eq_term_true.con +cic:/Coq/romega/ReflOmegaCore/exact_divide.con +cic:/Coq/romega/ReflOmegaCore/exact_divide_valid.con +cic:/Coq/romega/ReflOmegaCore/execute_goal.con +cic:/Coq/romega/ReflOmegaCore/execute_omega.con +cic:/Coq/romega/ReflOmegaCore/extract_hyp_neg.con +cic:/Coq/romega/ReflOmegaCore/extract_hyp_pos.con +cic:/Coq/romega/ReflOmegaCore/extract_valid.con +cic:/Coq/romega/ReflOmegaCore/fusion.con +cic:/Coq/romega/ReflOmegaCore/fusion_cancel.con +cic:/Coq/romega/ReflOmegaCore/fusion_cancel_stable.con +cic:/Coq/romega/ReflOmegaCore/fusion_right.con +cic:/Coq/romega/ReflOmegaCore/fusion_stable.con +cic:/Coq/romega/ReflOmegaCore/goal_to_hyps.con +cic:/Coq/romega/ReflOmegaCore/goal_valid.con +cic:/Coq/romega/ReflOmegaCore/h_step_ind.con +cic:/Coq/romega/ReflOmegaCore/h_step_rec.con +cic:/Coq/romega/ReflOmegaCore/h_step_rect.con +cic:/Coq/romega/ReflOmegaCore/hyps_to_goal.con +cic:/Coq/romega/ReflOmegaCore/interp_full.con +cic:/Coq/romega/ReflOmegaCore/interp_full_false.con +cic:/Coq/romega/ReflOmegaCore/interp_full_goal.con +cic:/Coq/romega/ReflOmegaCore/interp_goal_concl.con +cic:/Coq/romega/ReflOmegaCore/interp_hyps.con +cic:/Coq/romega/ReflOmegaCore/interp_list_goal.con +cic:/Coq/romega/ReflOmegaCore/interp_list_hyps.con +cic:/Coq/romega/ReflOmegaCore/interp_proposition.con +cic:/Coq/romega/ReflOmegaCore/interp_term.con +cic:/Coq/romega/ReflOmegaCore/list_goal_to_hyps.con +cic:/Coq/romega/ReflOmegaCore/list_hyps_to_goal.con +cic:/Coq/romega/ReflOmegaCore/map_cons.con +cic:/Coq/romega/ReflOmegaCore/map_cons_val.con +cic:/Coq/romega/ReflOmegaCore/merge_eq.con +cic:/Coq/romega/ReflOmegaCore/merge_eq_valid.con +cic:/Coq/romega/ReflOmegaCore/move_right.con +cic:/Coq/romega/ReflOmegaCore/move_right_stable.con +cic:/Coq/romega/ReflOmegaCore/move_right_valid.con +cic:/Coq/romega/ReflOmegaCore/negate_contradict.con +cic:/Coq/romega/ReflOmegaCore/negate_contradict_inv.con +cic:/Coq/romega/ReflOmegaCore/negate_contradict_inv_valid.con +cic:/Coq/romega/ReflOmegaCore/negate_contradict_valid.con +cic:/Coq/romega/ReflOmegaCore/normalize_goal.con +cic:/Coq/romega/ReflOmegaCore/normalize_hyps.con +cic:/Coq/romega/ReflOmegaCore/normalize_hyps_goal.con +cic:/Coq/romega/ReflOmegaCore/normalize_hyps_valid.con +cic:/Coq/romega/ReflOmegaCore/not_exact_divide.con +cic:/Coq/romega/ReflOmegaCore/not_exact_divide_valid.con +cic:/Coq/romega/ReflOmegaCore/nthProp.con +cic:/Coq/romega/ReflOmegaCore/nth_hyps.con +cic:/Coq/romega/ReflOmegaCore/nth_valid.con +cic:/Coq/romega/ReflOmegaCore/omega_tactic.con +cic:/Coq/romega/ReflOmegaCore/omega_valid.con +cic:/Coq/romega/ReflOmegaCore/p_apply_left.con +cic:/Coq/romega/ReflOmegaCore/p_apply_left_stable.con +cic:/Coq/romega/ReflOmegaCore/p_apply_right.con +cic:/Coq/romega/ReflOmegaCore/p_apply_right_stable.con +cic:/Coq/romega/ReflOmegaCore/p_invert.con +cic:/Coq/romega/ReflOmegaCore/p_invert_stable.con +cic:/Coq/romega/ReflOmegaCore/p_rewrite.con +cic:/Coq/romega/ReflOmegaCore/p_rewrite_stable.con +cic:/Coq/romega/ReflOmegaCore/p_step_ind.con +cic:/Coq/romega/ReflOmegaCore/p_step_rec.con +cic:/Coq/romega/ReflOmegaCore/p_step_rect.con +cic:/Coq/romega/ReflOmegaCore/prop_stable.con +cic:/Coq/romega/ReflOmegaCore/proposition_ind.con +cic:/Coq/romega/ReflOmegaCore/proposition_rec.con +cic:/Coq/romega/ReflOmegaCore/proposition_rect.con +cic:/Coq/romega/ReflOmegaCore/reduce.con +cic:/Coq/romega/ReflOmegaCore/reduce_lhyps.con +cic:/Coq/romega/ReflOmegaCore/reduce_lhyps_valid.con +cic:/Coq/romega/ReflOmegaCore/reduce_stable.con +cic:/Coq/romega/ReflOmegaCore/relation_ind2.con +cic:/Coq/romega/ReflOmegaCore/rewrite.con +cic:/Coq/romega/ReflOmegaCore/rewrite_stable.con +cic:/Coq/romega/ReflOmegaCore/scalar_norm.con +cic:/Coq/romega/ReflOmegaCore/scalar_norm_add.con +cic:/Coq/romega/ReflOmegaCore/scalar_norm_add_stable.con +cic:/Coq/romega/ReflOmegaCore/scalar_norm_stable.con +cic:/Coq/romega/ReflOmegaCore/split_ineq.con +cic:/Coq/romega/ReflOmegaCore/split_ineq_valid.con +cic:/Coq/romega/ReflOmegaCore/state.con +cic:/Coq/romega/ReflOmegaCore/state_valid.con +cic:/Coq/romega/ReflOmegaCore/step_ind.con +cic:/Coq/romega/ReflOmegaCore/step_rec.con +cic:/Coq/romega/ReflOmegaCore/step_rect.con +cic:/Coq/romega/ReflOmegaCore/sum.con +cic:/Coq/romega/ReflOmegaCore/sum1.con +cic:/Coq/romega/ReflOmegaCore/sum2.con +cic:/Coq/romega/ReflOmegaCore/sum3.con +cic:/Coq/romega/ReflOmegaCore/sum4.con +cic:/Coq/romega/ReflOmegaCore/sum5.con +cic:/Coq/romega/ReflOmegaCore/sum_valid.con +cic:/Coq/romega/ReflOmegaCore/t_fusion_ind.con +cic:/Coq/romega/ReflOmegaCore/t_fusion_rec.con +cic:/Coq/romega/ReflOmegaCore/t_fusion_rect.con +cic:/Coq/romega/ReflOmegaCore/t_omega_ind.con +cic:/Coq/romega/ReflOmegaCore/t_omega_rec.con +cic:/Coq/romega/ReflOmegaCore/t_omega_rect.con +cic:/Coq/romega/ReflOmegaCore/term_ind.con +cic:/Coq/romega/ReflOmegaCore/term_rec.con +cic:/Coq/romega/ReflOmegaCore/term_rect.con +cic:/Coq/romega/ReflOmegaCore/term_stable.con +cic:/Coq/romega/ReflOmegaCore/to_contradict.con +cic:/Coq/romega/ReflOmegaCore/to_contradict_valid.con +cic:/Coq/romega/ReflOmegaCore/valid1.con +cic:/Coq/romega/ReflOmegaCore/valid2.con +cic:/Coq/romega/ReflOmegaCore/valid_goal.con +cic:/Coq/romega/ReflOmegaCore/valid_hyps.con +cic:/Coq/romega/ReflOmegaCore/valid_lhyps.con +cic:/Coq/romega/ReflOmegaCore/valid_list_goal.con +cic:/Coq/romega/ReflOmegaCore/valid_list_hyps.con diff --git a/daemons/whelp/searchEngine.conf.xml.sample b/daemons/whelp/searchEngine.conf.xml.sample new file mode 100644 index 000000000..6d646020f --- /dev/null +++ b/daemons/whelp/searchEngine.conf.xml.sample @@ -0,0 +1,62 @@ + + +
+ mowgli.cs.unibo.it + helm + mowgli +
+
+ + /tmp/helm/cache + /projects/helm/xml/dtd + 58081 + 180 + /projects/helm/daemons/log/http_getter.log + + theory:/ file:///projects/helm/library/theories/ + + + xslt:/ file:///projects/helm/xml/stylesheets_ccorn/ + + + xslt:/ file:///projects/helm/xml/stylesheets_hanane/ + + + xslt:/ file:///projects/helm/xml/on-line/xslt/ + + + xslt:/ file:///projects/helm/nuprl/NuPRL/nuprl_stylesheets/ + + + nuprl:/ http://www.cs.uwyo.edu/~nuprl/helm-library/ + + + cic:/ file:///projects/helm/library/coq_contribs/ + + + xslt:/ file:///projects/helm/xml/stylesheets/ + + + xslt:/ file:///projects/helm/xml/stylesheets/generated/ + + + theory:/residual_theory_in_lambda_calculus/ + http://helm.cs.unibo.it/~sacerdot/huet_lambda_calculus_mowgli/residual_theory_in_lambda_calculus/ + + + theory:/IDA/ + http://mowgli.cs.unibo.it/~sacerdot/ida/IDA/ + +
+
+ html + 58085 + 10 + + foo.env + /projects/helm/daemons/matita/core_notation.moo + /projects/helm/daemons/matita/coq.moo +
+
diff --git a/daemons/whelp/searchEngine.ml b/daemons/whelp/searchEngine.ml new file mode 100644 index 000000000..c42c01043 --- /dev/null +++ b/daemons/whelp/searchEngine.ml @@ -0,0 +1,505 @@ +(* Copyright (C) 2002-2005, HELM Team. + * + * This file is part of HELM, an Hypertextual, Electronic + * Library of Mathematics, developed at the Computer Science + * Department, University of Bologna, Italy. + * + * HELM is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * HELM is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with HELM; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + * For details, see the HELM World-Wide-Web page, + * http://cs.unibo.it/helm/. + *) + +open Printf + +let debug = true +let debug_print s = if debug then prerr_endline s +let _ = Http_common.debug := false + +exception Chat_unfinished +exception Unbound_identifier of string +exception Invalid_action of string (* invalid action for "/search" method *) + + (** raised by elim when a MutInd is required but not found *) +exception Not_a_MutInd + +let daemon_name = "Whelp" +let configuration_file = "/projects/helm/etc/whelp.conf.xml" + +let placeholders = [ + "ACTION"; "ADVANCED"; "ADVANCED_CHECKED"; "CHOICES"; "CURRENT_CHOICES"; + "EXPRESSION"; "ID"; "IDEN"; "ID_TO_URIS"; "INTERPRETATIONS"; + "INTERPRETATIONS_LABELS"; "MSG"; "NEW_ALIASES"; "NEXT_LINK"; "NO_CHOICES"; + "PAGE"; "PAGES"; "PAGELIST"; "PREV_LINK"; "QUERY_KIND"; "QUERY_SUMMARY"; "RESULTS"; + "SEARCH_ENGINE_URL"; "SIMPLE_CHECKED"; "TITLE"; +] + +let tag = + let regexps = Hashtbl.create 25 in + List.iter + (fun tag -> Hashtbl.add regexps tag (Pcre.regexp (sprintf "@%s@" tag))) + placeholders; + fun name -> + try + Hashtbl.find regexps name + with Not_found -> assert false + + (* First of all we load the configuration *) +let _ = Helm_registry.load_from configuration_file +let port = Helm_registry.get_int "search_engine.port" +let pages_dir = Helm_registry.get "search_engine.html_dir" + +let moogle_TPL = pages_dir ^ "/moogle.html" +let choices_TPL = pages_dir ^ "/moogle_chat.html" + +let my_own_url = + let ic = Unix.open_process_in "hostname -f" in + let hostname = input_line ic in + ignore (Unix.close_process_in ic); + sprintf "http://%s:%d" hostname port +let _ = Helm_registry.set "search_engine.my_own_url" my_own_url + +let bad_request body outchan = + Http_daemon.respond_error ~code:(`Status (`Client_error `Bad_request)) ~body + outchan + + (** chain application of Pcre substitutions *) +let rec apply_substs substs line = + match substs with + | [] -> line + | (rex, templ) :: rest -> apply_substs rest (Pcre.replace ~rex ~templ line) + (** fold like function on files *) +let fold_file f init fname = + let inchan = open_in fname in + let rec fold_lines' value = + try + let line = input_line inchan in + fold_lines' (f value line) + with End_of_file -> value + in + let res = (try fold_lines' init with e -> (close_in inchan; raise e)) in + close_in inchan; + res + (** iter like function on files *) +let iter_file f = fold_file (fun _ line -> f line) () +let javascript_quote s = + let rex = Pcre.regexp "'" in + let rex' = Pcre.regexp "\"" in + Pcre.replace ~rex ~templ:"\\'" + (Pcre.replace ~rex:rex' ~templ:"\\\"" s) +let string_tail s = + let len = String.length s in + String.sub s 1 (len-1) +let nonvar uri = + let s = UriManager.string_of_uri uri in + let len = String.length s in + let suffix = String.sub s (len-4) 4 in + not (suffix = ".var") + +let add_param_substs params = + List.map + (fun (key,value) -> + let key' = (Pcre.extract ~pat:"param\\.(.*)" key).(1) in + Pcre.regexp ("@" ^ key' ^ "@"), value) + (List.filter + (fun ((key,_) as p) -> Pcre.pmatch ~pat:"^param\\." key) + params) + +let page_RE = Pcre.regexp "¶m\\.page=\\d+" +let identifier_RE = Pcre.regexp "^\\s*(\\w|')+\\s*$" +let qualified_mutind_RE = + Pcre.regexp "^\\s*cic:(/(\\w|')+)+\\.ind#xpointer\\(1/\\d+\\)\\s*$" + +let query_kind_of_req (req: Http_types.request) = + match req#path with + | "/match" -> "Match" + | "/hint" -> "Hint" + | "/locate" -> "Locate" + | "/elim" -> "Elim" + | "/instance" -> "Instance" + | _ -> "" + + (* given a uri with a query part in input try to find in it a string + * "¶m_name=..." (where param_name is given). If found its value will be + * set to param_value. If not, a trailing "¶m_name=param_value" (where + * both are given) is added to the input string *) +let patch_param param_name param_value url = + let rex = Pcre.regexp (sprintf "&%s=[^&]*" (Pcre.quote param_name)) in + if Pcre.pmatch ~rex url then + Pcre.replace ~rex ~templ:(sprintf "%s=%s" param_name param_value) url + else + sprintf "%s&%s=%s" url param_name param_value + + (** HTML encoding, e.g.: "<" -> "<" *) +let html_encode = Netencoding.Html.encode_from_latin1 + +let fold_n_to_m f n m acc = + let rec aux acc = + function + i when i <= m -> aux (f i acc) (i + 1) + | _ -> acc + in + aux acc n + +let send_results results + ?(id_to_uris = DisambiguateTypes.empty_environment) + (req: Http_types.request) outchan + = + let query_kind = query_kind_of_req req in + let interp = try req#param "interp" with Http_types.Param_not_found _ -> "" in + let page_link anchor page = + try + let this = req#param "this" in + let target = + (patch_param "param.interp" interp + (patch_param "param.page" (string_of_int page) + this)) + in + let target = Pcre.replace ~pat:"&" ~templ:"&" target in + sprintf "%s" target anchor + with Http_types.Param_not_found _ -> "" + in + Http_daemon.send_basic_headers ~code:(`Code 200) outchan ; + Http_daemon.send_header "Content-Type" "text/xml" outchan; + Http_daemon.send_CRLF outchan ; + let subst = + match results with + | `Results results -> + let page = try int_of_string (req#param "page") with _ -> 1 in + let results_no = List.length results in + let results_per_page = + Helm_registry.get_int "search_engine.results_per_page" + in + let pages = + if results_no mod results_per_page = 0 then + results_no / results_per_page + else + results_no / results_per_page + 1 + in + let pages = if pages = 0 then 1 else pages in + let additional_pages = 3 in + let (summary, results) = MooglePp.theory_of_result page results in + [ tag "PAGE", string_of_int page; + tag "PAGES", string_of_int pages ^ " Pages"; + tag "PAGELIST", + (let inf = page - additional_pages in + let sup = page + additional_pages in + let superinf = inf - (sup - pages) in + let supersup = sup + (1 - inf) in + let n,m = + if inf >= 1 && sup <= pages then + inf,sup + else if inf < 1 then + 1, (if supersup <= pages then supersup else pages) + else (* sup > pages *) + (if superinf >= 1 then superinf else 1),pages + in + fold_n_to_m + (fun n acc -> acc ^ " " ^ + (if n = page then string_of_int n + else page_link (string_of_int n) n)) + n m ""); + tag "PREV_LINK", (if page > 1 then page_link "Prev" (page-1) else ""); + tag "NEXT_LINK", + (if page < pages then page_link "Next" (page+1) else ""); + tag "QUERY_KIND", query_kind; + tag "QUERY_SUMMARY", summary; + tag "RESULTS", results ] + | `Error msg -> + [ tag "PAGE", "1"; + tag "PAGES", "1 Page"; + tag "PAGELIST", ""; + tag "PREV_LINK", ""; + tag "NEXT_LINK", ""; + tag "QUERY_KIND", query_kind; + tag "QUERY_SUMMARY", "error"; + tag "RESULTS", msg ] + in + let advanced = + try + req#param "advanced" + with Http_types.Param_not_found _ -> "no" + in + let subst = + (tag "SEARCH_ENGINE_URL", my_own_url) :: + (tag "ADVANCED", advanced) :: + (tag "EXPRESSION", html_encode (req#param "expression")) :: + add_param_substs req#params @ + (if advanced = "no" then + [ tag "SIMPLE_CHECKED", "checked='true'"; + tag "ADVANCED_CHECKED", "" ] + else + [ tag "SIMPLE_CHECKED", ""; + tag "ADVANCED_CHECKED", "checked='true'" ]) @ + subst + in + iter_file + (fun line -> + let new_aliases = DisambiguatePp.pp_environment id_to_uris in + let processed_line = + apply_substs + (* CSC: Bug here: this is a string, not an array! *) + ((tag "NEW_ALIASES", "'" ^ javascript_quote new_aliases ^ "'") :: + subst) + line + in + output_string outchan (processed_line ^ "\n")) + moogle_TPL + +let exec_action dbd (req: Http_types.request) outchan = + let term_str = req#param "expression" in + try + if req#path = "/elim" && + not (Pcre.pmatch ~rex:identifier_RE term_str || + Pcre.pmatch ~rex:qualified_mutind_RE term_str) then + raise Not_a_MutInd; + let (context, metasenv) = ([], []) in + let id_to_uris_raw = + try req#param "aliases" + with Http_types.Param_not_found _ -> "" + in + let parse_interpretation_choices choices = + List.map int_of_string (Pcre.split ~pat:" " choices) in + let parse_choices choices_raw = + let choices = Pcre.split ~pat:";" choices_raw in + List.fold_left + (fun f x -> + match Pcre.split ~pat:"\\s" x with + | ""::id::tail + | id::tail when id<>"" -> + (fun id' -> + if id = id' then + Some (List.map + (fun u -> UriManager.uri_of_string + (Netencoding.Url.decode u)) + tail) + else + f id') + | _ -> failwith "Can't parse choices") + (fun _ -> None) + choices + in + let id_to_uris = DisambiguatePp.parse_environment id_to_uris_raw in + let id_to_choices = + try + parse_choices (req#param "choices") + with Http_types.Param_not_found _ -> (fun _ -> None) + in + let interpretation_choices = + try + let choices_raw = req#param "interpretation_choices" in + if choices_raw = "" then None + else Some (parse_interpretation_choices choices_raw) + with Http_types.Param_not_found _ -> None + in + let module Chat: DisambiguateTypes.Callbacks = + struct + let interactive_user_uri_choice ~selection_mode ?ok + ?enable_button_for_non_vars ~(title: string) ~(msg: string) + ~(id: string) (choices: UriManager.uri list) + = + match id_to_choices id with + | Some choices -> choices + | None -> List.filter nonvar choices + + let interactive_interpretation_choice interpretations = + match interpretation_choices with + | Some l -> l + | None -> + let html_interpretations = + MooglePp.html_of_interpretations interpretations + in + Http_daemon.send_basic_headers ~code:(`Code 200) outchan ; + Http_daemon.send_CRLF outchan ; + let advanced = + try + req#param "advanced" + with Http_types.Param_not_found _ -> "no" + in + let query_kind = query_kind_of_req req in + iter_file + (fun line -> + let processed_line = + apply_substs + [ tag "SEARCH_ENGINE_URL", my_own_url; + tag "ADVANCED", advanced; + tag "INTERPRETATIONS", html_interpretations; + tag "CURRENT_CHOICES", req#param "choices"; + tag "EXPRESSION", html_encode (req#param "expression"); + tag "QUERY_KIND", query_kind; + tag "QUERY_SUMMARY", "disambiguation"; + tag "ACTION", string_tail req#path ] + line + in + output_string outchan (processed_line ^ "\n")) + choices_TPL; + raise Chat_unfinished + + let input_or_locate_uri ~title ?id () = + match id with + | Some id -> raise (Unbound_identifier id) + | None -> assert false + end + in + let module Disambiguate' = Disambiguate.Make(Chat) in + let ast = Grammar.Entry.parse CicNotationParser.term (Stream.of_string term_str) in + let (id_to_uris, metasenv, term) = + match + Disambiguate'.disambiguate_term ~dbd ~context ~metasenv + ~aliases:id_to_uris ast + with + | [id_to_uris,metasenv,term,_] -> id_to_uris,metasenv,term + | _ -> assert false + in + let uris = + match req#path with + | "/match" -> MetadataQuery.match_term ~dbd term + | "/instance" -> MetadataQuery.instance ~dbd term + | "/hint" -> + let status = ProofEngineTypes.initial_status term metasenv in + let intros = PrimitiveTactics.intros_tac () in + let subgoals = ProofEngineTypes.apply_tactic intros status in + (match subgoals with + | proof, [goal] -> + let (uri,metasenv,bo,ty) = proof in + List.map fst (MetadataQuery.experimental_hint ~dbd (proof, goal)) + | _ -> assert false) + | "/elim" -> + let uri = + match term with + | Cic.MutInd (uri, typeno, _) -> + UriManager.uri_of_uriref uri typeno None + | _ -> raise Not_a_MutInd + in + MetadataQuery.elim ~dbd uri + | _ -> assert false + in + let uris = List.map UriManager.string_of_uri uris in + send_results ~id_to_uris (`Results uris) req outchan + with + | Not_a_MutInd -> + send_results (`Error (MooglePp.pp_error "Not an inductive type" + ("elim requires as input an identifier corresponding to an inductive" + ^ " type"))) + req outchan + +let callback dbd (req: Http_types.request) outchan = + try + debug_print (sprintf "Received request: %s" req#path); + (match req#path with + | "/getpage" -> + (* TODO implement "is_permitted" *) + (let is_permitted page = not (Pcre.pmatch ~pat:"/" page) in + let page = req#param "url" in + let fname = sprintf "%s/%s" pages_dir page in + let preprocess = + (try + bool_of_string (req#param "preprocess") + with Invalid_argument _ | Http_types.Param_not_found _ -> false) + in + (match page with + | page when is_permitted page && Sys.file_exists fname -> + Http_daemon.send_basic_headers ~code:(`Code 200) outchan; + Http_daemon.send_header "Content-Type" "text/html" outchan; + Http_daemon.send_CRLF outchan; + if preprocess then begin + iter_file + (fun line -> + output_string outchan + ((apply_substs + ((tag "SEARCH_ENGINE_URL", my_own_url) :: + (tag "ADVANCED", "no") :: + (tag "RESULTS", "") :: + add_param_substs req#params) + line) ^ + "\n")) + fname + end else + Http_daemon.send_file ~src:(Http_types.FileSrc fname) outchan + | page -> Http_daemon.respond_forbidden ~url:page outchan)) + | "/help" -> Http_daemon.respond ~body:daemon_name outchan + | "/locate" -> + let initial_expression = + try req#param "expression" with Http_types.Param_not_found _ -> "" + in + let expression = + Pcre.replace ~pat:"\\s*$" + (Pcre.replace ~pat:"^\\s*" initial_expression) + in + if expression = "" then + send_results (`Results []) req outchan + else begin + let results = MetadataQuery.locate ~dbd expression in + let results = List.map UriManager.string_of_uri results in + send_results (`Results results) req outchan + end + | "/hint" + | "/elim" + | "/instance" + | "/match" -> exec_action dbd req outchan + | invalid_request -> + Http_daemon.respond_error ~code:(`Status (`Client_error `Bad_request)) + outchan); + debug_print (sprintf "%s done!" req#path) + with + | Chat_unfinished -> () + | Http_types.Param_not_found attr_name -> + bad_request (sprintf "Parameter '%s' is missing" attr_name) outchan + | CicNotationParser.Parse_error (_, msg) -> + send_results (`Error (MooglePp.pp_error "Parse error" msg)) req outchan + | Unbound_identifier id -> + send_results (`Error (MooglePp.pp_error "Unbound identifier" id)) req + outchan + | exn -> + let exn_string = Printexc.to_string exn in + debug_print exn_string; + let msg = MooglePp.pp_error "Uncaught exception" exn_string in + send_results (`Error msg) req outchan + +let restore_environment () = + match + Helm_registry.get_opt Helm_registry.string "search_engine.environment_dump" + with + | None -> () + | Some fname -> + printf "Restoring Cic environment from %s ... " fname; flush stdout; + let ic = open_in fname in + CicEnvironment.restore_from_channel ic; + close_in ic; + printf "done!\n"; flush stdout + +let read_notation () = + CicNotation.load_notation (Helm_registry.get "search_engine.notations"); + CicNotation.load_notation (Helm_registry.get "search_engine.interpretations") + +let _ = + printf "%s started and listening on port %d\n" daemon_name port; + printf "Current directory is %s\n" (Sys.getcwd ()); + printf "HTML directory is %s\n" pages_dir; + flush stdout; + Unix.putenv "http_proxy" ""; + let dbd = + Mysql.quick_connect + ~host:(Helm_registry.get "db.host") + ~database:(Helm_registry.get "db.database") + ~user:(Helm_registry.get "db.user") + () + in + restore_environment (); + read_notation (); + Http_daemon.start' ~port (callback dbd); + printf "%s is terminating, bye!\n" daemon_name + -- 2.39.2