From 1fe10f27fface9c05c9eb9a601df3c41ad174076 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laure=CE=B7t?= Date: Sat, 10 Jun 2023 20:56:24 +0200 Subject: [PATCH] init --- BE2019/.Naturelle.aux | 69 + BE2019/Naturelle.glob | 254 ++++ BE2019/Naturelle.v | 292 ++++ BE2019/coq-exercice-1.v | 23 + BE2019/coq-exercice-2.v | 19 + BE2019/coq-exercice-3.v | 102 ++ BE2019/why3-exercice-4.mlw | 24 + .../why3mnexercicemn4_Somme_VC_somme_1.v | 44 + .../why3mnexercicemn4_Somme_VC_somme_2.v | 44 + BE2019/why3-exercice-4/why3session.xml | 39 + BE2020/.Naturelle.aux | 40 + BE2020/Naturelle.glob | 150 ++ BE2020/Naturelle.v | 224 +++ BE2020/coq_exercice_1.v | 41 + BE2020/coq_exercice_2.v | 17 + BE2020/coq_exercice_3.v | 91 ++ BE2020/why3_exercice_4.mlw | 23 + BE2020/why3_exercice_4/why3session.xml | 36 + TP1/.Naturelle.aux | 40 + TP1/Naturelle.glob | 150 ++ TP1/Naturelle.v | 225 +++ TP1/TP1.v | 119 ++ TP2-3/TP2-enigme.mlw | 29 + TP2-3/TP2.v | 45 + TP2-3/TP2.v.crashcoqide | 49 + TP2-3/enigme.mlw | 29 + TP2-3/enigme/enigme-Predicats-Thm01_1.cvc | 83 ++ TP2-3/enigme/enigme-Predicats-Thm01_1.smt2 | 29 + TP2-3/enigme/enigme-Proposition-Q1_1.smt2 | 34 + TP2-3/enigme/enigme_Predicats_Thm01_1.v | 27 + TP2-3/enigme/why3session.xml | 46 + TP2-3/sujet.pdf | Bin 0 -> 114125 bytes TP2/TP2.v | 45 + TP2/TP2.v.crashcoqide | 49 + TP2/enigme.mlw | 29 + TP2/enigme/enigme-Predicats-Thm01_1.cvc | 83 ++ TP2/enigme/enigme-Predicats-Thm01_1.smt2 | 29 + TP2/enigme/enigme-Proposition-Q1_1.smt2 | 34 + TP2/enigme/enigme_Predicats_Thm01_1.v | 27 + TP2/enigme/why3session.xml | 46 + TP4/induction-etu.mlw | 23 + TP4/induction-etu.v | 121 ++ TP4/readme.txt | 9 + TP5/induction-etu.mlw | 23 + TP5/induction-etu.v | 123 ++ TP5/induction-etu.wlm | 23 + TP5/induction-etu/why3session.xml | 32 + TP6/ascendant.mlw | 37 + ...elleAscendant_VC_factorielle_ascendant_1.v | 42 + ...elleAscendant_VC_factorielle_ascendant_2.v | 67 + ...elleAscendant_VC_factorielle_ascendant_3.v | 70 + ...elleAscendant_VC_factorielle_ascendant_4.v | 52 + TP6/ascendant/why3session.xml | 45 + TP6/descendant.mlw | 37 + TP6/descendant/why3session.xml | 47 + TP6/division.mlw | 23 + TP6/division/why3session.xml | 28 + TP6/pgcd.mlw | 38 + TP6/pgcd/why3session.xml | 58 + TP7/.Naturelle.aux | 40 + TP7/._Naturelle.v | Bin 0 -> 630 bytes TP7/Naturelle.glob | 150 ++ TP7/Naturelle.v | 225 +++ TP7/Unnamed_coqscript_1.crashcoqide | 0 TP7/coq-exercice-1.v | 29 + TP7/coq-exercice-2.v | 15 + TP7/coq-exercice-3.v | 113 ++ TP7/why3-exercice-4.mlw | 24 + TP7/why3-exercice-4/why3session.xml | 36 + TP8-9/outils-unix/cmd-sed.txt | 2 + TP8-9/outils-unix/commandes-TP5.sh | 11 + .../enseignant-attribut.xml-sed.out | 5 + TP8-9/outils-unix/enseignant-attribut.xml-vim | 5 + .../enseignant-element.xml-sed.out | 8 + TP8-9/outils-unix/enseignant-element.xml-vim | 8 + TP8-9/outils-unix/exemple.txt | 23 + TP8-9/process-analysis/MainProcessus | Bin 0 -> 164338 bytes TP8-9/process-analysis/Makefile | 36 + TP8-9/process-analysis/lexerProcessus.ml | 1279 +++++++++++++++++ TP8-9/process-analysis/lexerProcessus.mll | 46 + TP8-9/process-analysis/mainProcessus.ml | 42 + TP8-9/process-analysis/parserProcessus.ml | 945 ++++++++++++ TP8-9/process-analysis/parserProcessus.mli | 27 + TP8-9/process-analysis/parserProcessus.mly | 57 + TP8-9/process-analysis/tests/test00.processus | 8 + TP8-9/process-analysis/tests/test01.processus | 11 + TP8-9/process-analysis/tests/test02.processus | 18 + 87 files changed, 6840 insertions(+) create mode 100755 BE2019/.Naturelle.aux create mode 100755 BE2019/Naturelle.glob create mode 100755 BE2019/Naturelle.v create mode 100755 BE2019/coq-exercice-1.v create mode 100755 BE2019/coq-exercice-2.v create mode 100755 BE2019/coq-exercice-3.v create mode 100755 BE2019/why3-exercice-4.mlw create mode 100755 BE2019/why3-exercice-4/why3mnexercicemn4_Somme_VC_somme_1.v create mode 100755 BE2019/why3-exercice-4/why3mnexercicemn4_Somme_VC_somme_2.v create mode 100755 BE2019/why3-exercice-4/why3session.xml create mode 100755 BE2020/.Naturelle.aux create mode 100755 BE2020/Naturelle.glob create mode 100755 BE2020/Naturelle.v create mode 100755 BE2020/coq_exercice_1.v create mode 100755 BE2020/coq_exercice_2.v create mode 100755 BE2020/coq_exercice_3.v create mode 100755 BE2020/why3_exercice_4.mlw create mode 100755 BE2020/why3_exercice_4/why3session.xml create mode 100755 TP1/.Naturelle.aux create mode 100755 TP1/Naturelle.glob create mode 100755 TP1/Naturelle.v create mode 100755 TP1/TP1.v create mode 100644 TP2-3/TP2-enigme.mlw create mode 100644 TP2-3/TP2.v create mode 100644 TP2-3/TP2.v.crashcoqide create mode 100644 TP2-3/enigme.mlw create mode 100644 TP2-3/enigme/enigme-Predicats-Thm01_1.cvc create mode 100644 TP2-3/enigme/enigme-Predicats-Thm01_1.smt2 create mode 100644 TP2-3/enigme/enigme-Proposition-Q1_1.smt2 create mode 100644 TP2-3/enigme/enigme_Predicats_Thm01_1.v create mode 100644 TP2-3/enigme/why3session.xml create mode 100644 TP2-3/sujet.pdf create mode 100755 TP2/TP2.v create mode 100755 TP2/TP2.v.crashcoqide create mode 100755 TP2/enigme.mlw create mode 100755 TP2/enigme/enigme-Predicats-Thm01_1.cvc create mode 100755 TP2/enigme/enigme-Predicats-Thm01_1.smt2 create mode 100755 TP2/enigme/enigme-Proposition-Q1_1.smt2 create mode 100755 TP2/enigme/enigme_Predicats_Thm01_1.v create mode 100755 TP2/enigme/why3session.xml create mode 100644 TP4/induction-etu.mlw create mode 100644 TP4/induction-etu.v create mode 100644 TP4/readme.txt create mode 100755 TP5/induction-etu.mlw create mode 100755 TP5/induction-etu.v create mode 100755 TP5/induction-etu.wlm create mode 100755 TP5/induction-etu/why3session.xml create mode 100755 TP6/ascendant.mlw create mode 100755 TP6/ascendant/ascendant_FactorielleAscendant_VC_factorielle_ascendant_1.v create mode 100755 TP6/ascendant/ascendant_FactorielleAscendant_VC_factorielle_ascendant_2.v create mode 100755 TP6/ascendant/ascendant_FactorielleAscendant_VC_factorielle_ascendant_3.v create mode 100755 TP6/ascendant/ascendant_FactorielleAscendant_VC_factorielle_ascendant_4.v create mode 100755 TP6/ascendant/why3session.xml create mode 100755 TP6/descendant.mlw create mode 100755 TP6/descendant/why3session.xml create mode 100755 TP6/division.mlw create mode 100755 TP6/division/why3session.xml create mode 100755 TP6/pgcd.mlw create mode 100755 TP6/pgcd/why3session.xml create mode 100755 TP7/.Naturelle.aux create mode 100755 TP7/._Naturelle.v create mode 100755 TP7/Naturelle.glob create mode 100755 TP7/Naturelle.v create mode 100755 TP7/Unnamed_coqscript_1.crashcoqide create mode 100755 TP7/coq-exercice-1.v create mode 100755 TP7/coq-exercice-2.v create mode 100755 TP7/coq-exercice-3.v create mode 100755 TP7/why3-exercice-4.mlw create mode 100755 TP7/why3-exercice-4/why3session.xml create mode 100755 TP8-9/outils-unix/cmd-sed.txt create mode 100755 TP8-9/outils-unix/commandes-TP5.sh create mode 100755 TP8-9/outils-unix/enseignant-attribut.xml-sed.out create mode 100755 TP8-9/outils-unix/enseignant-attribut.xml-vim create mode 100755 TP8-9/outils-unix/enseignant-element.xml-sed.out create mode 100755 TP8-9/outils-unix/enseignant-element.xml-vim create mode 100755 TP8-9/outils-unix/exemple.txt create mode 100755 TP8-9/process-analysis/MainProcessus create mode 100755 TP8-9/process-analysis/Makefile create mode 100755 TP8-9/process-analysis/lexerProcessus.ml create mode 100755 TP8-9/process-analysis/lexerProcessus.mll create mode 100755 TP8-9/process-analysis/mainProcessus.ml create mode 100755 TP8-9/process-analysis/parserProcessus.ml create mode 100755 TP8-9/process-analysis/parserProcessus.mli create mode 100755 TP8-9/process-analysis/parserProcessus.mly create mode 100755 TP8-9/process-analysis/tests/test00.processus create mode 100755 TP8-9/process-analysis/tests/test01.processus create mode 100755 TP8-9/process-analysis/tests/test02.processus diff --git a/BE2019/.Naturelle.aux b/BE2019/.Naturelle.aux new file mode 100755 index 0000000..5aa4821 --- /dev/null +++ b/BE2019/.Naturelle.aux @@ -0,0 +1,69 @@ +COQAUX1 b99e0673e480d281145bd0be828a8006 /home/lfainsin/1A/Modé/BE2019/Naturelle.v +383 387 proof_build_time "0.000" +0 0 E_imp_th "0.000" +383 387 context_used "" +383 387 proof_check_time "0.000" +0 0 VernacProof "tac:no using:no" +916 920 proof_build_time "0.000" +0 0 E_forall_th "0.000" +916 920 context_used "" +916 920 proof_check_time "0.000" +1291 1295 proof_build_time "0.001" +0 0 E_et_g_th "0.001" +1291 1295 context_used "" +1291 1295 proof_check_time "0.000" +1601 1605 proof_build_time "0.001" +0 0 E_et_d_th "0.001" +1601 1605 context_used "" +1601 1605 proof_check_time "0.000" +1983 1987 proof_build_time "0.001" +0 0 E_ou_th "0.001" +1983 1987 context_used "" +1983 1987 proof_check_time "0.000" +0 0 VernacProof "tac:no using:no" +2806 2810 proof_build_time "0.001" +0 0 E_exists_th "0.001" +2806 2810 context_used "" +2806 2810 proof_check_time "0.000" +3280 3284 proof_build_time "0.000" +0 0 E_antiT_th "0.000" +3280 3284 context_used "" +3280 3284 proof_check_time "0.000" +3502 3506 proof_build_time "0.001" +0 0 I_antiT_th "0.001" +3502 3506 context_used "" +3502 3506 proof_check_time "0.000" +3683 3687 proof_build_time "0.000" +0 0 I_non_th "0.000" +3683 3687 context_used "" +3683 3687 proof_check_time "0.000" +4135 4158 context_used "" +4135 4158 context_used "" +4135 4158 context_used "" +0 0 VernacProof "tac:no using:no" +4398 4402 proof_build_time "0.003" +0 0 Yoga "0.003" +4398 4402 context_used "" +4398 4402 proof_check_time "0.000" +4404 4428 context_used "" +4404 4428 context_used "" +4557 4561 proof_build_time "0.001" +0 0 contra "0.001" +4557 4561 context_used "" +4557 4561 proof_check_time "0.000" +4642 4646 proof_build_time "0.001" +0 0 P2nnP "0.001" +4642 4646 context_used "" +4642 4646 proof_check_time "0.000" +4731 4735 proof_build_time "0.001" +0 0 nnP2P "0.001" +4731 4735 context_used "" +4731 4735 proof_check_time "0.000" +4737 4755 context_used "" +4756 4786 context_used "" +0 0 VernacProof "tac:no using:no" +4984 4988 proof_build_time "0.002" +0 0 Swap "0.002" +4984 4988 context_used "" +4984 4988 proof_check_time "0.000" +0 0 vo_compile_time "0.617" diff --git a/BE2019/Naturelle.glob b/BE2019/Naturelle.glob new file mode 100755 index 0000000..db0c96e --- /dev/null +++ b/BE2019/Naturelle.glob @@ -0,0 +1,254 @@ +DIGEST b99e0673e480d281145bd0be828a8006 +FNaturelle +R15:23 Coq.Logic.Classical <> <> lib +R97:100 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R97:100 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R218:221 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R218:221 Coq.Init.Logic <> ::type_scope:x_'->'_x not +prf 278:285 <> E_imp_th +R314:314 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R325:329 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R333:336 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R337:339 Naturelle <> psi var +R330:332 Naturelle <> phi var +R318:321 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R322:324 Naturelle <> psi var +R315:317 Naturelle <> phi var +R443:450 Naturelle <> E_imp_th thm +R521:528 Naturelle <> E_imp_th thm +prf 816:826 <> E_forall_th +R856:859 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R855:855 Naturelle <> A var +R869:869 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R885:889 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R890:892 Naturelle <> phi var +R894:894 Naturelle <> a var +R880:882 Naturelle <> phi var +R884:884 Naturelle <> x var +R996:1006 Naturelle <> E_forall_th thm +R1086:1089 Coq.Init.Logic <> ::type_scope:x_'/\'_x not +R1086:1089 Coq.Init.Logic <> ::type_scope:x_'/\'_x not +R1105:1108 Coq.Init.Logic <> conj constr +prf 1157:1165 <> E_et_g_th +R1194:1194 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1205:1209 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1210:1212 Naturelle <> phi var +R1198:1201 Coq.Init.Logic <> ::type_scope:x_'/\'_x not +R1195:1197 Naturelle <> phi var +R1202:1204 Naturelle <> psi var +R1352:1360 Naturelle <> E_et_g_th thm +R1432:1440 Naturelle <> E_et_g_th thm +prf 1465:1473 <> E_et_d_th +R1502:1502 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1513:1517 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1518:1520 Naturelle <> psi var +R1506:1509 Coq.Init.Logic <> ::type_scope:x_'/\'_x not +R1503:1505 Naturelle <> phi var +R1510:1512 Naturelle <> psi var +R1662:1670 Naturelle <> E_et_d_th thm +R1743:1751 Naturelle <> E_et_d_th thm +prf 1776:1782 <> E_ou_th +R1815:1815 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1826:1830 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1831:1831 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1842:1846 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1847:1847 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1858:1862 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1863:1865 Naturelle <> chi var +R1851:1854 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1855:1857 Naturelle <> chi var +R1848:1850 Naturelle <> psi var +R1835:1838 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1839:1841 Naturelle <> chi var +R1832:1834 Naturelle <> phi var +R1819:1822 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R1816:1818 Naturelle <> phi var +R1823:1825 Naturelle <> psi var +R2042:2048 Naturelle <> E_ou_th thm +R2124:2130 Naturelle <> E_ou_th thm +R2194:2197 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R2194:2197 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R2213:2221 Coq.Init.Logic <> or_introl constr +R2305:2308 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R2305:2308 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R2324:2332 Coq.Init.Logic <> or_intror constr +R2416:2423 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2430:2433 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2439:2439 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2438:2438 Naturelle <> x var +R2416:2423 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2430:2433 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2439:2439 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2438:2438 Naturelle <> x var +R2453:2460 Coq.Init.Logic <> ex_intro constr +R2561:2568 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2575:2578 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2584:2584 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2583:2583 Naturelle <> x var +R2561:2568 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2575:2578 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2584:2584 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2583:2583 Naturelle <> x var +R2597:2604 Coq.Init.Logic <> ex_intro constr +prf 2669:2679 <> E_exists_th +R2709:2712 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R2708:2708 Naturelle <> A var +R2733:2733 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R2749:2753 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R2754:2754 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R2777:2781 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R2782:2784 Naturelle <> chi var +R2770:2773 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R2774:2776 Naturelle <> chi var +R2765:2767 Naturelle <> phi var +R2769:2769 Naturelle <> a var +R2734:2740 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2742:2743 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2744:2746 Naturelle <> phi var +R2748:2748 Naturelle <> x var +R2963:2973 Naturelle <> E_exists_th thm +R3083:3085 Coq.Init.Logic <> not def +R3116:3120 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R3132:3132 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R3123:3126 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3127:3131 Coq.Init.Logic <> False ind +R3116:3120 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R3132:3132 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R3123:3126 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3127:3131 Coq.Init.Logic <> False ind +R3145:3151 Coq.Logic.Classical_Prop <> classic prfax +prf 3209:3218 <> E_antiT_th +R3248:3251 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3252:3254 Naturelle <> phi var +R3243:3247 Coq.Init.Logic <> False ind +R3340:3349 Naturelle <> E_antiT_th thm +prf 3370:3379 <> I_antiT_th +R3407:3410 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3411:3411 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3416:3420 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3421:3425 Coq.Init.Logic <> False ind +R3412:3412 Coq.Init.Logic <> ::type_scope:'~'_x not +R3413:3415 Naturelle <> phi var +R3404:3406 Naturelle <> phi var +R3435:3437 Coq.Init.Logic <> not def +R3551:3555 Coq.Init.Logic <> False ind +R3551:3555 Coq.Init.Logic <> False ind +R3567:3576 Naturelle <> I_antiT_th thm +prf 3598:3605 <> I_non_th +R3630:3630 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3643:3647 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3648:3648 Coq.Init.Logic <> ::type_scope:'~'_x not +R3649:3651 Naturelle <> phi var +R3634:3637 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3638:3642 Coq.Init.Logic <> False ind +R3631:3633 Naturelle <> phi var +R3669:3671 Coq.Init.Logic <> not def +R3730:3731 Coq.Init.Logic <> ::type_scope:'~'_x not +R3730:3731 Coq.Init.Logic <> ::type_scope:'~'_x not +R3745:3752 Naturelle <> I_non_th thm +R3801:3810 Naturelle <> I_antiT_th thm +R3875:3878 Coq.Logic.Classical_Prop <> NNPP thm +var 4144:4144 <> E +var 4146:4146 <> Y +var 4148:4148 <> R +prf 4168:4171 <> Yoga +R4175:4175 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R4203:4207 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R4210:4213 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R4214:4214 Coq.Init.Logic <> ::type_scope:'~'_x not +R4215:4215 Naturelle <> E defax +R4208:4208 Coq.Init.Logic <> ::type_scope:'~'_x not +R4209:4209 Naturelle <> R defax +R4176:4176 Coq.Init.Logic <> ::type_scope:x_'/\'_x not +R4190:4195 Coq.Init.Logic <> ::type_scope:x_'/\'_x not +R4202:4202 Coq.Init.Logic <> ::type_scope:x_'/\'_x not +R4178:4182 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R4189:4189 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R4184:4187 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R4183:4183 Naturelle <> Y defax +R4188:4188 Naturelle <> R defax +R4177:4177 Naturelle <> E defax +R4197:4200 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R4201:4201 Naturelle <> R defax +R4196:4196 Naturelle <> Y defax +R4263:4263 Naturelle <> R defax +R4272:4272 Naturelle <> Y defax +R4274:4274 Naturelle <> R defax +R4285:4285 Naturelle <> E defax +R4300:4303 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R4304:4304 Naturelle <> R defax +R4299:4299 Naturelle <> Y defax +R4300:4303 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R4304:4304 Naturelle <> R defax +R4299:4299 Naturelle <> Y defax +R4343:4346 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R4348:4351 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R4347:4347 Naturelle <> Y defax +R4352:4352 Naturelle <> R defax +R4342:4342 Naturelle <> E defax +R4343:4346 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R4348:4351 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R4347:4347 Naturelle <> Y defax +R4352:4352 Naturelle <> R defax +R4342:4342 Naturelle <> E defax +var 4413:4415 <> phi +var 4417:4419 <> psi +prf 4438:4443 <> contra +R4447:4447 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R4458:4463 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R4476:4476 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R4468:4471 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R4472:4472 Coq.Init.Logic <> ::type_scope:'~'_x not +R4473:4475 Naturelle <> phi defax +R4464:4464 Coq.Init.Logic <> ::type_scope:'~'_x not +R4465:4467 Naturelle <> psi defax +R4451:4454 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R4455:4457 Naturelle <> psi defax +R4448:4450 Naturelle <> phi defax +R4517:4519 Naturelle <> psi defax +R4528:4530 Naturelle <> phi defax +prf 4571:4575 <> P2nnP +R4582:4585 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R4586:4586 Coq.Init.Logic <> ::type_scope:'~'_x not +R4587:4587 Coq.Init.Logic <> ::type_scope:'~'_x not +R4588:4590 Naturelle <> phi defax +R4579:4581 Naturelle <> phi defax +R4621:4623 Naturelle <> phi defax +prf 4656:4660 <> nnP2P +R4670:4673 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R4674:4676 Naturelle <> phi defax +R4664:4664 Coq.Init.Logic <> ::type_scope:'~'_x not +R4665:4666 Coq.Init.Logic <> ::type_scope:'~'_x not +R4667:4669 Naturelle <> phi defax +R4708:4708 Coq.Init.Logic <> ::type_scope:'~'_x not +R4709:4711 Naturelle <> phi defax +R4708:4708 Coq.Init.Logic <> ::type_scope:'~'_x not +R4709:4711 Naturelle <> phi defax +var 4746:4746 <> A +var 4765:4767 <> chi +R4772:4775 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R4777:4780 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R4776:4776 Naturelle <> A defax +R4771:4771 Naturelle <> A defax +prf 4796:4799 <> Swap +R4803:4803 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R4831:4836 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R4864:4864 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R4847:4853 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R4855:4856 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R4857:4859 Naturelle <> chi defax +R4863:4863 Naturelle <> y var +R4861:4861 Naturelle <> x var +R4804:4810 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R4812:4813 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R4824:4826 Naturelle <> chi defax +R4830:4830 Naturelle <> y var +R4828:4828 Naturelle <> x var +R4926:4926 Naturelle <> A defax +R4929:4931 Naturelle <> chi defax +R4935:4935 Naturelle <> y var +R4933:4933 Naturelle <> x var +R4926:4926 Naturelle <> A defax +R4929:4931 Naturelle <> chi defax +R4935:4935 Naturelle <> y var +R4933:4933 Naturelle <> x var diff --git a/BE2019/Naturelle.v b/BE2019/Naturelle.v new file mode 100755 index 0000000..47b0dd7 --- /dev/null +++ b/BE2019/Naturelle.v @@ -0,0 +1,292 @@ +Require Export Classical. + +Ltac Hyp Nom := exact Nom. + +Ltac I_imp' := + match goal with + | |- ?A -> ?B => let hyp := fresh "H" in intro hyp + | _ => fail + end. + +Ltac I_imp Nom := + match goal with + | |- ?A -> ?B => intro Nom + | _ => fail + end. + +Theorem E_imp_th : forall (phi psi : Prop), (phi -> psi) -> phi -> psi. +intros Pphi Ppsi Hphi2psi. +Hyp Hphi2psi. +Qed. + +Ltac E_imp' := + match goal with + | |- ?P => eapply (E_imp_th _ P) + end. + +Ltac E_imp phi := + match goal with + | |- ?P => apply (E_imp_th phi P) + end. + +Ltac I_forall' := + match goal with + | |- forall (x : ?A), ?P => let hyp := fresh x in intro hyp + | _ => fail + end. + +Ltac I_forall Nom := + match goal with + | |- forall (x : ?A), ?P => intro Nom + | _ => fail + end. + +Theorem E_forall_th : forall (A : Type) (phi : A -> Prop) a, (forall x, phi x) -> phi a. +Proof. +firstorder. +Qed. + +Ltac E_forall x := + pattern x; + match goal with + | |- (?P x) => apply (E_forall_th _ P x) + | _ => fail + end. + +Ltac I_et := + match goal with + | |- (?A /\ ?B) => apply (@conj A B) + | _ => fail + end. + +Theorem E_et_g_th : forall (phi psi : Prop), (phi /\ psi) -> phi. +intros Pphi Ppsi Hphi_et_psi. +elim Hphi_et_psi. +intros Hphi Hpsi. +Hyp Hphi. +Qed. + +Ltac E_et_g' := + match goal with + | |- ?P => eapply (E_et_g_th P _) + end. + +Ltac E_et_g psi := + match goal with + | |- ?P => apply (E_et_g_th P psi) + end. + +Theorem E_et_d_th : forall (phi psi : Prop), (phi /\ psi) -> psi. +intros Pphi Ppsi H_phi_et_psi. +elim H_phi_et_psi. +intros Hphi Hpsi. +Hyp Hpsi. +Qed. + +Ltac E_et_d' := + match goal with + | |- ?P => eapply (E_et_d_th _ P) + end. + +Ltac E_et_d phi := + match goal with + | |- ?P => eapply (E_et_d_th phi P) + end. + +Theorem E_ou_th : forall (phi psi chi : Prop), (phi \/ psi) -> (phi -> chi) -> (psi -> chi) -> chi. +intros Pphi Ppsi Pchi Hphi_ou_psi Hphi_imp_chi Hpsi_imp_chi. +elim Hphi_ou_psi. +Hyp Hphi_imp_chi. +Hyp Hpsi_imp_chi. +Qed. + +Ltac E_ou' := + match goal with + | |- ?P => eapply (E_ou_th _ _ P) + end. + +Ltac E_ou phi psi := + match goal with + | |- ?P => apply (E_ou_th phi psi P) + end. + +Ltac I_ou_g := + match goal with + | |- (?A \/ ?B) => apply (@or_introl A B) + | _ => fail + end. + +Ltac I_ou_d := + match goal with + | |- (?A \/ ?B) => apply (@or_intror A B) + | _ => fail + end. + +Ltac I_exists' := + match goal with + | |- exists (x : ?A), (@?P x) => eapply (@ex_intro A P _) + | _ => fail + end. + +Ltac I_exists t := + match goal with + | |- exists (x : ?A), (@?P x) => apply (@ex_intro _ P t) + | _ => fail + end. + +Theorem E_exists_th : forall (A : Type) (phi : A -> Prop) (chi : Prop), (exists x, phi x) -> (forall a, phi a -> chi) -> chi. +Proof. +firstorder. +Qed. +(* +Ltac E_exists phi := + match goal with + | |- ?P => apply (E_exists_th _ phi P) + end. +*) +Ltac E_exists phi := + match goal with + | |- ?P => apply (E_exists_th _ phi P); [ idtac | let t := fresh "t" in let ht := fresh "Ht" in intros t ht ] + end. + +Ltac TE := + unfold not; + match goal with + | |- (?P \/ (?P -> False)) => exact (classic P) + | _ => fail + end. + +Theorem E_antiT_th : forall (phi : Prop), False -> phi. +intros Pphi F. +elim F. +Qed. + +Ltac E_antiT := + match goal with + | |- ?P => apply (E_antiT_th P) + end. + +Theorem I_antiT_th : forall (phi : Prop), phi -> (~phi) -> False. +unfold not. +intro Pphi. +intros Hphi Hnphi. +cut Pphi. +Hyp Hnphi. +Hyp Hphi. +Qed. + +Ltac I_antiT phi := + match goal with + | |- False => apply (I_antiT_th phi) + end. + +Theorem I_non_th : forall (phi : Prop), (phi -> False) -> ~phi. +intros. +unfold not. +exact H. +Qed. + +Ltac I_non Nom := + match goal with + | |- ~ ?P => apply (I_non_th P); intro Nom + end. + +Ltac E_non phi := + apply (I_antiT_th phi). + +Ltac absurde Nom := + match goal with + | |- ?P => apply (NNPP P); intro Nom + end. + +(* +Ltac I_antiT phi := apply (I_antiT_th phi). + +Ltac absurde Nom phi := +match goal with +| |- phi => +cut (phi \/ ~phi); +[ +intros L; +elim L; +[ +auto +| +clear L; +intro Nom; +apply (E_antiT_th) +] +| +apply (classic phi) +] +| _ => fail +end. +*) + +Variable E Y R : Prop. + +Theorem Yoga : ((E -> (Y \/ R)) /\ (Y -> R)) -> ~R -> ~E. +Proof. +I_imp H1. +I_imp H2. +I_non H3. +I_antiT R. + E_ou Y R. + E_imp E. + E_et_g (Y -> R). + Hyp H1. + + Hyp H3. + + E_et_d (E -> Y \/ R). + Hyp H1. + + I_imp H4. + Hyp H4. + Hyp H2. +Qed. + +Variable phi psi : Prop. + +Theorem contra : (phi -> psi) -> (~psi -> ~phi). +I_imp H1. +I_imp H2. +I_non H3. +I_antiT psi. +E_imp phi. +Hyp H1. +Hyp H3. +Hyp H2. +Qed. + +Theorem P2nnP : phi -> ~~phi. +I_imp H1. +I_non H2. +I_antiT phi. +Hyp H1. +Hyp H2. +Qed. + +Theorem nnP2P : ~~ phi -> phi. +I_imp H1. +absurde H2. +E_non (~phi). +Hyp H2. +Hyp H1. +Qed. + +Variable A : Type. +Variable chi : A -> A -> Prop. + +Theorem Swap : (exists y, forall x, chi x y) -> (forall x, exists y, chi x y). +Proof. +I_imp H1. +I_forall x. +E_exists (fun y => forall x : A, chi x y). + Hyp H1. + + I_exists t. + E_forall x. + Hyp Ht. +Qed. + diff --git a/BE2019/coq-exercice-1.v b/BE2019/coq-exercice-1.v new file mode 100755 index 0000000..896ed57 --- /dev/null +++ b/BE2019/coq-exercice-1.v @@ -0,0 +1,23 @@ +Require Import Naturelle. +Section Session1_2019_Logique_Exercice_1. + +Variable A B C : Prop. + +Theorem Exercice_1_Coq : (A -> B -> C) -> ((A /\ B) -> C). +intros. +cut B. +cut A. +exact H. +destruct H0. +exact H0. +destruct H0. +exact H1. +Qed. + +Theorem Exercice_1_Naturelle : (A -> B -> C) -> ((A /\ B) -> C). +Proof. +(* A COMPLETER *) +Qed. + +End Session1_2019_Logique_Exercice_1. + diff --git a/BE2019/coq-exercice-2.v b/BE2019/coq-exercice-2.v new file mode 100755 index 0000000..78282cd --- /dev/null +++ b/BE2019/coq-exercice-2.v @@ -0,0 +1,19 @@ +Require Import Naturelle. +Section Session1_2019_Logique_Exercice_2. + +Variable A B : Prop. + +Theorem Exercice_2_Coq : (~A) \/ B -> (~A) \/ (A /\ B). +intros. +right. +split. + +Qed. + +Theorem Exercice_2_Naturelle : (~A) \/ B -> (~A) \/ (A /\ B). +Proof. +(* A COMPLETER *) +Qed. + +End Session1_2019_Logique_Exercice_2. + diff --git a/BE2019/coq-exercice-3.v b/BE2019/coq-exercice-3.v new file mode 100755 index 0000000..c4c74e0 --- /dev/null +++ b/BE2019/coq-exercice-3.v @@ -0,0 +1,102 @@ +Section Session1_2019_Induction_Exercice_3. + +(* Déclaration d’un domaine pour les éléments des listes *) +Variable A : Set. + +(* Déclaration d'un type liste générique d'éléments de type E *) +Inductive liste (E : Set) : Set := +Nil +: liste E +| Cons : E -> liste E -> liste E. + +(* Déclaration du nom de la fonction append *) +Variable append_spec : forall E : Set, liste E -> liste E -> liste E. + +(* Spécification du comportement de append pour Nil en premier paramètre *) +Axiom append_Nil : forall E : Set, forall (l : liste E), append_spec E (Nil E) l = l. + +(* Spécification du comportement de append pour Cons en premier paramètre *) +Axiom append_Cons : forall E : Set, forall (t : E), forall (q l : liste E), + append_spec E ((Cons E) t q) l = (Cons E) t (append_spec E q l). + +(* Spécification du comportement de append pour Nil en second paramètre *) +Axiom append_Nil_right : forall E : Set, forall (l : liste E), (append_spec E l (Nil E)) = l. + +(* append est associative à gauche et à droite *) +Axiom append_associative : forall E : Set, forall (l1 l2 l3 : liste E), + (append_spec E l1 (append_spec E l2 l3)) = (append_spec E (append_spec E l1 l2) l3). + +(* Déclaration du nom de la fonction flatten *) +Variable flatten_spec : forall E : Set, liste (liste E) -> liste E. + +(* Spécification du comportement de flatten pour Nil *) +Axiom flatten_Nil : forall E : Set, flatten_spec E (Nil (liste E)) = (Nil E). + +(* Spécification du comportement de flatten pour Cons *) +Axiom flatten_Cons : forall E : Set, forall (t : liste E), forall (q : liste (liste E)), + flatten_spec E (Cons (liste E) t q) = append_spec E t (flatten_spec E q). + +(* Déclaration du nom de la fonction split *) +Variable split_spec : forall E : Set, liste E -> liste (liste E). + +(* Spécification du comportement de split pour Nil *) +Axiom split_Nil : forall E : Set, split_spec E (Nil E) = (Nil (liste E)). + +(* Spécification du comportement de split pour Cons *) +Axiom split_Cons : forall E : Set, forall (t : E), forall (q : liste E), + split_spec E (Cons E t q) = Cons (liste E) (Cons E t (Nil E)) (split_spec E q). + +(* Cohérence de flatten et de split : flatten(split(l)) = l*) +Theorem flatten_split_consistency : forall E : Set, forall (l : liste E), + flatten_spec E (split_spec E l) = l. +intros. +induction l. +rewrite split_Nil. +rewrite flatten_Nil. +reflexivity. +rewrite split_Cons. +rewrite flatten_Cons. +rewrite IHl. +rewrite append_Cons. +rewrite append_Nil. +reflexivity. +Qed. + +(* Implantation de la fonction append *) +Fixpoint append_impl (E : Set) (l1 l2 : liste E) {struct l1} : liste E := +match l1 with +Nil _ => l2 +| (Cons _ t1 q1) => (Cons E t1 (append_impl E q1 l2)) +end. + +Theorem append_correctness : forall E : Set, forall (l1 l2 : liste E), +(append_spec E l1 l2) = (append_impl E l1 l2). +intro TE. +induction l1. +intro Hl2. +rewrite append_Nil. +simpl. +reflexivity. +intro Hl2. +rewrite append_Cons. +simpl. +rewrite IHl1. +reflexivity. +Qed. + +(* Implantation de la fonction flatten *) +Fixpoint flatten_impl (E : Set) (l : liste (liste E)) {struct l} : liste E := + match l with + Nil => Nil + | (Cons t1 q1) => (Cons t1 (flatten_impl q1 l2)) +end. + + +(* Correction de l'implantation de flatten par rapport à sa spécification *) +Theorem flatten_correctness : forall E : Set, forall (l : liste (liste E)), + (flatten_spec E l) = (flatten_impl E l). +Proof. +(* A COMPLETER *) +Qed. + +End Session1_2019_Induction_Exercice_3. diff --git a/BE2019/why3-exercice-4.mlw b/BE2019/why3-exercice-4.mlw new file mode 100755 index 0000000..335f087 --- /dev/null +++ b/BE2019/why3-exercice-4.mlw @@ -0,0 +1,24 @@ +(* BE : Session 1 2019 *) +(* Implémentation de la fonction somme des premiers entiers par un algorithme ascendant *) + +module Somme + + use int.Int + use int.ComputerDivision + use ref.Refint + + let somme (n: int) : int + requires { n >= 0 } + ensures { 2*result = n*(n+1) } + = + let i = ref 0 in + let r = ref 0 in + while (!i < n) do + invariant { 2*!r = !i*(!i+1) } + variant { n - !i } + i := (!i) + 1; + r := (!r) + (!i) + done; + !r + +end diff --git a/BE2019/why3-exercice-4/why3mnexercicemn4_Somme_VC_somme_1.v b/BE2019/why3-exercice-4/why3mnexercicemn4_Somme_VC_somme_1.v new file mode 100755 index 0000000..f9ef867 --- /dev/null +++ b/BE2019/why3-exercice-4/why3mnexercicemn4_Somme_VC_somme_1.v @@ -0,0 +1,44 @@ +(* This file is generated by Why3's Coq driver *) +(* Beware! Only edit allowed sections below *) +Require Import BuiltIn. +Require BuiltIn. +Require int.Int. +Require int.Abs. +Require int.ComputerDivision. + +(* Why3 assumption *) +Inductive ref (a:Type) := + | mk_ref : a -> ref a. +Axiom ref_WhyType : forall (a:Type) {a_WT:WhyType a}, WhyType (ref a). +Existing Instance ref_WhyType. +Arguments mk_ref {a}. + +(* Why3 assumption *) +Definition contents {a:Type} {a_WT:WhyType a} (v:ref a) : a := + match v with + | mk_ref x => x + end. + +Parameter n: Z. + +Parameter r: Z. + +Parameter i: Z. + +Axiom H : (i < n)%Z. + +Parameter i1: Z. + +Axiom H1 : (i1 = (i + 1%Z)%Z). + +Parameter r1: Z. + +Axiom H2 : (r1 = (r + i1)%Z). + +(* Why3 goal *) +Theorem VC_somme : False. +Proof. + + +Qed. + diff --git a/BE2019/why3-exercice-4/why3mnexercicemn4_Somme_VC_somme_2.v b/BE2019/why3-exercice-4/why3mnexercicemn4_Somme_VC_somme_2.v new file mode 100755 index 0000000..f9ef867 --- /dev/null +++ b/BE2019/why3-exercice-4/why3mnexercicemn4_Somme_VC_somme_2.v @@ -0,0 +1,44 @@ +(* This file is generated by Why3's Coq driver *) +(* Beware! Only edit allowed sections below *) +Require Import BuiltIn. +Require BuiltIn. +Require int.Int. +Require int.Abs. +Require int.ComputerDivision. + +(* Why3 assumption *) +Inductive ref (a:Type) := + | mk_ref : a -> ref a. +Axiom ref_WhyType : forall (a:Type) {a_WT:WhyType a}, WhyType (ref a). +Existing Instance ref_WhyType. +Arguments mk_ref {a}. + +(* Why3 assumption *) +Definition contents {a:Type} {a_WT:WhyType a} (v:ref a) : a := + match v with + | mk_ref x => x + end. + +Parameter n: Z. + +Parameter r: Z. + +Parameter i: Z. + +Axiom H : (i < n)%Z. + +Parameter i1: Z. + +Axiom H1 : (i1 = (i + 1%Z)%Z). + +Parameter r1: Z. + +Axiom H2 : (r1 = (r + i1)%Z). + +(* Why3 goal *) +Theorem VC_somme : False. +Proof. + + +Qed. + diff --git a/BE2019/why3-exercice-4/why3session.xml b/BE2019/why3-exercice-4/why3session.xml new file mode 100755 index 0000000..b5b65e5 --- /dev/null +++ b/BE2019/why3-exercice-4/why3session.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BE2020/.Naturelle.aux b/BE2020/.Naturelle.aux new file mode 100755 index 0000000..c422526 --- /dev/null +++ b/BE2020/.Naturelle.aux @@ -0,0 +1,40 @@ +COQAUX1 3e03a7b5b5c26232f0f3e8f10219c975 /home/lfainsin/1A/Modé/BE2020/Naturelle.v +383 387 proof_build_time "0.000" +0 0 E_imp_th "0.000" +383 387 context_used "" +383 387 proof_check_time "0.000" +0 0 VernacProof "tac:no using:no" +916 920 proof_build_time "0.000" +0 0 E_forall_th "0.000" +916 920 context_used "" +916 920 proof_check_time "0.000" +1291 1295 proof_build_time "0.001" +0 0 E_et_g_th "0.001" +1291 1295 context_used "" +1291 1295 proof_check_time "0.000" +1601 1605 proof_build_time "0.000" +0 0 E_et_d_th "0.000" +1601 1605 context_used "" +1601 1605 proof_check_time "0.000" +1983 1987 proof_build_time "0.001" +0 0 E_ou_th "0.001" +1983 1987 context_used "" +1983 1987 proof_check_time "0.000" +0 0 VernacProof "tac:no using:no" +2806 2810 proof_build_time "0.001" +0 0 E_exists_th "0.001" +2806 2810 context_used "" +2806 2810 proof_check_time "0.000" +3280 3284 proof_build_time "0.000" +0 0 E_antiT_th "0.000" +3280 3284 context_used "" +3280 3284 proof_check_time "0.000" +3502 3506 proof_build_time "0.001" +0 0 I_antiT_th "0.001" +3502 3506 context_used "" +3502 3506 proof_check_time "0.000" +3683 3687 proof_build_time "0.000" +0 0 I_non_th "0.000" +3683 3687 context_used "" +3683 3687 proof_check_time "0.000" +0 0 vo_compile_time "0.107" diff --git a/BE2020/Naturelle.glob b/BE2020/Naturelle.glob new file mode 100755 index 0000000..3c23cb5 --- /dev/null +++ b/BE2020/Naturelle.glob @@ -0,0 +1,150 @@ +DIGEST 3e03a7b5b5c26232f0f3e8f10219c975 +FNaturelle +R15:23 Coq.Logic.Classical <> <> lib +R97:100 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R97:100 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R218:221 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R218:221 Coq.Init.Logic <> ::type_scope:x_'->'_x not +prf 278:285 <> E_imp_th +R314:314 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R325:329 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R333:336 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R337:339 Naturelle <> psi var +R330:332 Naturelle <> phi var +R318:321 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R322:324 Naturelle <> psi var +R315:317 Naturelle <> phi var +R443:450 Naturelle <> E_imp_th thm +R521:528 Naturelle <> E_imp_th thm +prf 816:826 <> E_forall_th +R856:859 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R855:855 Naturelle <> A var +R869:869 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R885:889 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R890:892 Naturelle <> phi var +R894:894 Naturelle <> a var +R880:882 Naturelle <> phi var +R884:884 Naturelle <> x var +R996:1006 Naturelle <> E_forall_th thm +R1086:1089 Coq.Init.Logic <> ::type_scope:x_'/\'_x not +R1086:1089 Coq.Init.Logic <> ::type_scope:x_'/\'_x not +R1105:1108 Coq.Init.Logic <> conj constr +prf 1157:1165 <> E_et_g_th +R1194:1194 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1205:1209 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1210:1212 Naturelle <> phi var +R1198:1201 Coq.Init.Logic <> ::type_scope:x_'/\'_x not +R1195:1197 Naturelle <> phi var +R1202:1204 Naturelle <> psi var +R1352:1360 Naturelle <> E_et_g_th thm +R1432:1440 Naturelle <> E_et_g_th thm +prf 1465:1473 <> E_et_d_th +R1502:1502 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1513:1517 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1518:1520 Naturelle <> psi var +R1506:1509 Coq.Init.Logic <> ::type_scope:x_'/\'_x not +R1503:1505 Naturelle <> phi var +R1510:1512 Naturelle <> psi var +R1662:1670 Naturelle <> E_et_d_th thm +R1743:1751 Naturelle <> E_et_d_th thm +prf 1776:1782 <> E_ou_th +R1815:1815 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1826:1830 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1831:1831 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1842:1846 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1847:1847 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1858:1862 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1863:1865 Naturelle <> chi var +R1851:1854 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1855:1857 Naturelle <> chi var +R1848:1850 Naturelle <> psi var +R1835:1838 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1839:1841 Naturelle <> chi var +R1832:1834 Naturelle <> phi var +R1819:1822 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R1816:1818 Naturelle <> phi var +R1823:1825 Naturelle <> psi var +R2042:2048 Naturelle <> E_ou_th thm +R2124:2130 Naturelle <> E_ou_th thm +R2194:2197 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R2194:2197 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R2213:2221 Coq.Init.Logic <> or_introl constr +R2305:2308 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R2305:2308 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R2324:2332 Coq.Init.Logic <> or_intror constr +R2416:2423 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2430:2433 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2439:2439 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2438:2438 Naturelle <> x var +R2416:2423 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2430:2433 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2439:2439 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2438:2438 Naturelle <> x var +R2453:2460 Coq.Init.Logic <> ex_intro constr +R2561:2568 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2575:2578 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2584:2584 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2583:2583 Naturelle <> x var +R2561:2568 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2575:2578 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2584:2584 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2583:2583 Naturelle <> x var +R2597:2604 Coq.Init.Logic <> ex_intro constr +prf 2669:2679 <> E_exists_th +R2709:2712 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R2708:2708 Naturelle <> A var +R2733:2733 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R2749:2753 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R2754:2754 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R2777:2781 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R2782:2784 Naturelle <> chi var +R2770:2773 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R2774:2776 Naturelle <> chi var +R2765:2767 Naturelle <> phi var +R2769:2769 Naturelle <> a var +R2734:2740 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2742:2743 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2744:2746 Naturelle <> phi var +R2748:2748 Naturelle <> x var +R2963:2973 Naturelle <> E_exists_th thm +R3083:3085 Coq.Init.Logic <> not def +R3116:3120 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R3132:3132 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R3123:3126 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3127:3131 Coq.Init.Logic <> False ind +R3116:3120 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R3132:3132 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R3123:3126 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3127:3131 Coq.Init.Logic <> False ind +R3145:3151 Coq.Logic.Classical_Prop <> classic prfax +prf 3209:3218 <> E_antiT_th +R3248:3251 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3252:3254 Naturelle <> phi var +R3243:3247 Coq.Init.Logic <> False ind +R3340:3349 Naturelle <> E_antiT_th thm +prf 3370:3379 <> I_antiT_th +R3407:3410 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3411:3411 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3416:3420 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3421:3425 Coq.Init.Logic <> False ind +R3412:3412 Coq.Init.Logic <> ::type_scope:'~'_x not +R3413:3415 Naturelle <> phi var +R3404:3406 Naturelle <> phi var +R3435:3437 Coq.Init.Logic <> not def +R3551:3555 Coq.Init.Logic <> False ind +R3551:3555 Coq.Init.Logic <> False ind +R3567:3576 Naturelle <> I_antiT_th thm +prf 3598:3605 <> I_non_th +R3630:3630 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3643:3647 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3648:3648 Coq.Init.Logic <> ::type_scope:'~'_x not +R3649:3651 Naturelle <> phi var +R3634:3637 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3638:3642 Coq.Init.Logic <> False ind +R3631:3633 Naturelle <> phi var +R3669:3671 Coq.Init.Logic <> not def +R3730:3731 Coq.Init.Logic <> ::type_scope:'~'_x not +R3730:3731 Coq.Init.Logic <> ::type_scope:'~'_x not +R3745:3752 Naturelle <> I_non_th thm +R3801:3810 Naturelle <> I_antiT_th thm +R3875:3878 Coq.Logic.Classical_Prop <> NNPP thm diff --git a/BE2020/Naturelle.v b/BE2020/Naturelle.v new file mode 100755 index 0000000..b1d6533 --- /dev/null +++ b/BE2020/Naturelle.v @@ -0,0 +1,224 @@ +Require Export Classical. + +Ltac Hyp Nom := exact Nom. + +Ltac I_imp' := + match goal with + | |- ?A -> ?B => let hyp := fresh "H" in intro hyp + | _ => fail + end. + +Ltac I_imp Nom := + match goal with + | |- ?A -> ?B => intro Nom + | _ => fail + end. + +Theorem E_imp_th : forall (phi psi : Prop), (phi -> psi) -> phi -> psi. +intros Pphi Ppsi Hphi2psi. +Hyp Hphi2psi. +Qed. + +Ltac E_imp' := + match goal with + | |- ?P => eapply (E_imp_th _ P) + end. + +Ltac E_imp phi := + match goal with + | |- ?P => apply (E_imp_th phi P) + end. + +Ltac I_forall' := + match goal with + | |- forall (x : ?A), ?P => let hyp := fresh x in intro hyp + | _ => fail + end. + +Ltac I_forall Nom := + match goal with + | |- forall (x : ?A), ?P => intro Nom + | _ => fail + end. + +Theorem E_forall_th : forall (A : Type) (phi : A -> Prop) a, (forall x, phi x) -> phi a. +Proof. +firstorder. +Qed. + +Ltac E_forall x := + pattern x; + match goal with + | |- (?P x) => apply (E_forall_th _ P x) + | _ => fail + end. + +Ltac I_et := + match goal with + | |- (?A /\ ?B) => apply (@conj A B) + | _ => fail + end. + +Theorem E_et_g_th : forall (phi psi : Prop), (phi /\ psi) -> phi. +intros Pphi Ppsi Hphi_et_psi. +elim Hphi_et_psi. +intros Hphi Hpsi. +Hyp Hphi. +Qed. + +Ltac E_et_g' := + match goal with + | |- ?P => eapply (E_et_g_th P _) + end. + +Ltac E_et_g psi := + match goal with + | |- ?P => apply (E_et_g_th P psi) + end. + +Theorem E_et_d_th : forall (phi psi : Prop), (phi /\ psi) -> psi. +intros Pphi Ppsi H_phi_et_psi. +elim H_phi_et_psi. +intros Hphi Hpsi. +Hyp Hpsi. +Qed. + +Ltac E_et_d' := + match goal with + | |- ?P => eapply (E_et_d_th _ P) + end. + +Ltac E_et_d phi := + match goal with + | |- ?P => eapply (E_et_d_th phi P) + end. + +Theorem E_ou_th : forall (phi psi chi : Prop), (phi \/ psi) -> (phi -> chi) -> (psi -> chi) -> chi. +intros Pphi Ppsi Pchi Hphi_ou_psi Hphi_imp_chi Hpsi_imp_chi. +elim Hphi_ou_psi. +Hyp Hphi_imp_chi. +Hyp Hpsi_imp_chi. +Qed. + +Ltac E_ou' := + match goal with + | |- ?P => eapply (E_ou_th _ _ P) + end. + +Ltac E_ou phi psi := + match goal with + | |- ?P => apply (E_ou_th phi psi P) + end. + +Ltac I_ou_g := + match goal with + | |- (?A \/ ?B) => apply (@or_introl A B) + | _ => fail + end. + +Ltac I_ou_d := + match goal with + | |- (?A \/ ?B) => apply (@or_intror A B) + | _ => fail + end. + +Ltac I_exists' := + match goal with + | |- exists (x : ?A), (@?P x) => eapply (@ex_intro A P _) + | _ => fail + end. + +Ltac I_exists t := + match goal with + | |- exists (x : ?A), (@?P x) => apply (@ex_intro _ P t) + | _ => fail + end. + +Theorem E_exists_th : forall (A : Type) (phi : A -> Prop) (chi : Prop), (exists x, phi x) -> (forall a, phi a -> chi) -> chi. +Proof. +firstorder. +Qed. +(* +Ltac E_exists phi := + match goal with + | |- ?P => apply (E_exists_th _ phi P) + end. +*) +Ltac E_exists phi := + match goal with + | |- ?P => apply (E_exists_th _ phi P); [ idtac | let t := fresh "t" in let ht := fresh "Ht" in intros t ht ] + end. + +Ltac TE := + unfold not; + match goal with + | |- (?P \/ (?P -> False)) => exact (classic P) + | _ => fail + end. + +Theorem E_antiT_th : forall (phi : Prop), False -> phi. +intros Pphi F. +elim F. +Qed. + +Ltac E_antiT := + match goal with + | |- ?P => apply (E_antiT_th P) + end. + +Theorem I_antiT_th : forall (phi : Prop), phi -> (~phi) -> False. +unfold not. +intro Pphi. +intros Hphi Hnphi. +cut Pphi. +Hyp Hnphi. +Hyp Hphi. +Qed. + +Ltac I_antiT phi := + match goal with + | |- False => apply (I_antiT_th phi) + end. + +Theorem I_non_th : forall (phi : Prop), (phi -> False) -> ~phi. +intros. +unfold not. +exact H. +Qed. + +Ltac I_non Nom := + match goal with + | |- ~ ?P => apply (I_non_th P); intro Nom + end. + +Ltac E_non phi := + apply (I_antiT_th phi). + +Ltac absurde Nom := + match goal with + | |- ?P => apply (NNPP P); intro Nom + end. + +(* +Ltac I_antiT phi := apply (I_antiT_th phi). + +Ltac absurde Nom phi := +match goal with +| |- phi => +cut (phi \/ ~phi); +[ +intros L; +elim L; +[ +auto +| +clear L; +intro Nom; +apply (E_antiT_th) +] +| +apply (classic phi) +] +| _ => fail +end. +*) diff --git a/BE2020/coq_exercice_1.v b/BE2020/coq_exercice_1.v new file mode 100755 index 0000000..5b67f60 --- /dev/null +++ b/BE2020/coq_exercice_1.v @@ -0,0 +1,41 @@ +Require Import Naturelle. +Section Session1_2020_Logique_Exercice_1. + +Variable A B C : Prop. + +Theorem Exercice_1_Naturelle : ((A -> C) \/ (B -> C)) -> ((A /\ B) -> C). +I_imp H1. +I_imp H2. +E_imp A. +E_ou (A -> C) (B -> C). +Hyp H1. +trivial. +I_imp H3. +I_imp H4. +E_imp B. +Hyp H3. +E_et_d A. +Hyp H2. +E_et_g B. +Hyp H2. +Qed. + +Theorem Exercice_1_Coq : ((A -> C) \/ (B -> C)) -> ((A /\ B) -> C). +intros. +destruct H. +destruct H0. +cut A. +exact H. +exact H0. +cut B. +exact H. +cut (A /\ B). +intro H2. +elim H2. +intros HA HB. +exact HB. +exact H0. +Qed. + +End Session1_2020_Logique_Exercice_1. + diff --git a/BE2020/coq_exercice_2.v b/BE2020/coq_exercice_2.v new file mode 100755 index 0000000..46e448e --- /dev/null +++ b/BE2020/coq_exercice_2.v @@ -0,0 +1,17 @@ +Require Import Naturelle. +Section Session1_2020_Logique_Exercice_2. + +Variable A B : Prop. + +Theorem Exercice_2_Naturelle : (A -> B) -> ((~A) \/ B). +Proof. +(* A COMPLETER *) +Qed. + +Theorem Exercice_2_Coq : (A -> B) -> ((~A) \/ B). +Proof. +(* A COMPLETER *) +Qed. + +End Session1_2020_Logique_Exercice_2. + diff --git a/BE2020/coq_exercice_3.v b/BE2020/coq_exercice_3.v new file mode 100755 index 0000000..6237cb2 --- /dev/null +++ b/BE2020/coq_exercice_3.v @@ -0,0 +1,91 @@ +Section Session1_2020_Induction_Exercice_3. + +(* Déclaration d’un domaine pour les éléments des listes *) +Variable A : Set. + +Inductive entier : Set := +Zero : entier +| Succ : entier -> entier. + +(* Déclaration du nom de la fonction somme *) +Variable somme_spec : entier -> entier -> entier. + +(* Spécification du comportement de somme pour Zero en premier paramètre *) +Axiom somme_Zero : forall (n : entier), somme_spec Zero n = n. + +(* Spécification du comportement de somme pour Succ en premier paramètre *) +Axiom somme_Succ : forall (n m : entier), + somme_spec (Succ n) m = Succ (somme_spec n m). + +(* somme est associative à gauche et à droite *) +Axiom somme_associative : forall (n1 n2 n3 : entier), + (somme_spec n1 (somme_spec n2 n3)) = (somme_spec (somme_spec n1 n2) n3). + +Inductive liste : Set := +Nil +: liste +| Cons : A -> liste -> liste. + +(* Déclaration du nom de la fonction append *) +Variable append_spec : liste -> liste -> liste. + +(* Spécification du comportement de append pour Nil en premier paramètre *) +Axiom append_Nil : forall (l : liste), append_spec Nil l = l. + +(* Spécification du comportement de append pour Cons en premier paramètre *) +Axiom append_Cons : forall (t : A), forall (q l : liste), + append_spec (Cons t q) l = Cons t (append_spec q l). + +(* append est associative à gauche et à droite *) +Axiom append_associative : forall (l1 l2 l3 : liste), + (append_spec l1 (append_spec l2 l3)) = (append_spec (append_spec l1 l2) l3). + +(* Déclaration du nom de la fonction taille *) +Variable taille_spec : liste -> entier. + +(* Spécification du comportement de taille pour Nil en paramètre *) +Axiom taille_Nil : taille_spec Nil = Zero . + +(* Spécification du comportement de taille pour Cons en paramètre *) +Axiom taille_Cons : forall (t : A), forall (q : liste), + taille_spec (Cons t q) = Succ (taille_spec q) . + + +(* taille commute avec append *) +Theorem taille_append : forall (l1 l2 : liste), +(taille_spec (append_spec l1 l2)) = (somme_spec (taille_spec l1) (taille_spec l2)). +intros. +induction l1. +rewrite append_Nil. +rewrite taille_Nil. +rewrite somme_Zero. +reflexivity. +rewrite append_Cons. +rewrite taille_Cons. +rewrite taille_Cons. +rewrite somme_Succ. +rewrite IHl1. +reflexivity. +Qed. + +(* Implantation de la fonction taille *) +Fixpoint taille_impl (l : liste) {struct l} : entier := + match l with + Nil => Zero + | (Cons t q) => (Succ (taille_impl q)) +end. + +Theorem taille_correctness : forall (l : liste), + (taille_spec l) = (taille_impl l). +intros. +induction l. +simpl taille_impl. +rewrite taille_Nil. +reflexivity. +simpl taille_impl. +rewrite taille_Cons. +rewrite IHl. +reflexivity. +Qed. + +End Session1_2020_Induction_Exercice_3. diff --git a/BE2020/why3_exercice_4.mlw b/BE2020/why3_exercice_4.mlw new file mode 100755 index 0000000..3ab8361 --- /dev/null +++ b/BE2020/why3_exercice_4.mlw @@ -0,0 +1,23 @@ +(* BE : Session 1 2020 *) +(* Implémentation de la fonction carre d'un entier naturel par un algorithme inspiré des identités remarquables *) + +module Carre + + use int.Int + use ref.Refint + + let carre (n: int) : int + requires { 0 <= n } + ensures { !r = n*n } + = + let x = ref n in + let r = ref 0 in + while (!x <> 0) do + invariant { !r + (!x)*(!x) = n*n && 0 <= !x } + variant { !x } + r := (!r) + 2 * (!x) - 1; + x := (!x) - 1 + done; + !r + +end \ No newline at end of file diff --git a/BE2020/why3_exercice_4/why3session.xml b/BE2020/why3_exercice_4/why3session.xml new file mode 100755 index 0000000..22a58ee --- /dev/null +++ b/BE2020/why3_exercice_4/why3session.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TP1/.Naturelle.aux b/TP1/.Naturelle.aux new file mode 100755 index 0000000..a8bbca0 --- /dev/null +++ b/TP1/.Naturelle.aux @@ -0,0 +1,40 @@ +COQAUX1 f13e540aa0997388dd1408b0662438d6 /home/lfainsin/1A/Modé/TP1/Naturelle.v +383 387 proof_build_time "0.001" +0 0 E_imp_th "0.001" +383 387 context_used "" +383 387 proof_check_time "0.000" +0 0 VernacProof "tac:no using:no" +916 920 proof_build_time "0.001" +0 0 E_forall_th "0.001" +916 920 context_used "" +916 920 proof_check_time "0.000" +1291 1295 proof_build_time "0.001" +0 0 E_et_g_th "0.001" +1291 1295 context_used "" +1291 1295 proof_check_time "0.000" +1601 1605 proof_build_time "0.001" +0 0 E_et_d_th "0.001" +1601 1605 context_used "" +1601 1605 proof_check_time "0.000" +1983 1987 proof_build_time "0.001" +0 0 E_ou_th "0.001" +1983 1987 context_used "" +1983 1987 proof_check_time "0.000" +0 0 VernacProof "tac:no using:no" +2806 2810 proof_build_time "0.001" +0 0 E_exists_th "0.001" +2806 2810 context_used "" +2806 2810 proof_check_time "0.000" +3280 3284 proof_build_time "0.000" +0 0 E_antiT_th "0.000" +3280 3284 context_used "" +3280 3284 proof_check_time "0.000" +3502 3506 proof_build_time "0.001" +0 0 I_antiT_th "0.001" +3502 3506 context_used "" +3502 3506 proof_check_time "0.000" +3683 3687 proof_build_time "0.000" +0 0 I_non_th "0.000" +3683 3687 context_used "" +3683 3687 proof_check_time "0.000" +0 0 vo_compile_time "0.713" diff --git a/TP1/Naturelle.glob b/TP1/Naturelle.glob new file mode 100755 index 0000000..df9312d --- /dev/null +++ b/TP1/Naturelle.glob @@ -0,0 +1,150 @@ +DIGEST f13e540aa0997388dd1408b0662438d6 +FNaturelle +R15:23 Coq.Logic.Classical <> <> lib +R97:100 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R97:100 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R218:221 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R218:221 Coq.Init.Logic <> ::type_scope:x_'->'_x not +prf 278:285 <> E_imp_th +R314:314 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R325:329 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R333:336 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R337:339 Naturelle <> psi var +R330:332 Naturelle <> phi var +R318:321 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R322:324 Naturelle <> psi var +R315:317 Naturelle <> phi var +R443:450 Naturelle <> E_imp_th thm +R521:528 Naturelle <> E_imp_th thm +prf 816:826 <> E_forall_th +R856:859 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R855:855 Naturelle <> A var +R869:869 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R885:889 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R890:892 Naturelle <> phi var +R894:894 Naturelle <> a var +R880:882 Naturelle <> phi var +R884:884 Naturelle <> x var +R996:1006 Naturelle <> E_forall_th thm +R1086:1089 Coq.Init.Logic <> ::type_scope:x_'/\'_x not +R1086:1089 Coq.Init.Logic <> ::type_scope:x_'/\'_x not +R1105:1108 Coq.Init.Logic <> conj constr +prf 1157:1165 <> E_et_g_th +R1194:1194 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1205:1209 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1210:1212 Naturelle <> phi var +R1198:1201 Coq.Init.Logic <> ::type_scope:x_'/\'_x not +R1195:1197 Naturelle <> phi var +R1202:1204 Naturelle <> psi var +R1352:1360 Naturelle <> E_et_g_th thm +R1432:1440 Naturelle <> E_et_g_th thm +prf 1465:1473 <> E_et_d_th +R1502:1502 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1513:1517 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1518:1520 Naturelle <> psi var +R1506:1509 Coq.Init.Logic <> ::type_scope:x_'/\'_x not +R1503:1505 Naturelle <> phi var +R1510:1512 Naturelle <> psi var +R1662:1670 Naturelle <> E_et_d_th thm +R1743:1751 Naturelle <> E_et_d_th thm +prf 1776:1782 <> E_ou_th +R1815:1815 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1826:1830 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1831:1831 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1842:1846 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1847:1847 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1858:1862 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1863:1865 Naturelle <> chi var +R1851:1854 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1855:1857 Naturelle <> chi var +R1848:1850 Naturelle <> psi var +R1835:1838 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1839:1841 Naturelle <> chi var +R1832:1834 Naturelle <> phi var +R1819:1822 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R1816:1818 Naturelle <> phi var +R1823:1825 Naturelle <> psi var +R2042:2048 Naturelle <> E_ou_th thm +R2124:2130 Naturelle <> E_ou_th thm +R2194:2197 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R2194:2197 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R2213:2221 Coq.Init.Logic <> or_introl constr +R2305:2308 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R2305:2308 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R2324:2332 Coq.Init.Logic <> or_intror constr +R2416:2423 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2430:2433 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2439:2439 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2438:2438 Naturelle <> x var +R2416:2423 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2430:2433 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2439:2439 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2438:2438 Naturelle <> x var +R2453:2460 Coq.Init.Logic <> ex_intro constr +R2561:2568 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2575:2578 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2584:2584 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2583:2583 Naturelle <> x var +R2561:2568 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2575:2578 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2584:2584 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2583:2583 Naturelle <> x var +R2597:2604 Coq.Init.Logic <> ex_intro constr +prf 2669:2679 <> E_exists_th +R2709:2712 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R2708:2708 Naturelle <> A var +R2733:2733 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R2749:2753 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R2754:2754 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R2777:2781 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R2782:2784 Naturelle <> chi var +R2770:2773 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R2774:2776 Naturelle <> chi var +R2765:2767 Naturelle <> phi var +R2769:2769 Naturelle <> a var +R2734:2740 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2742:2743 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2744:2746 Naturelle <> phi var +R2748:2748 Naturelle <> x var +R2963:2973 Naturelle <> E_exists_th thm +R3083:3085 Coq.Init.Logic <> not def +R3116:3120 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R3132:3132 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R3123:3126 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3127:3131 Coq.Init.Logic <> False ind +R3116:3120 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R3132:3132 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R3123:3126 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3127:3131 Coq.Init.Logic <> False ind +R3145:3151 Coq.Logic.Classical_Prop <> classic prfax +prf 3209:3218 <> E_antiT_th +R3248:3251 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3252:3254 Naturelle <> phi var +R3243:3247 Coq.Init.Logic <> False ind +R3340:3349 Naturelle <> E_antiT_th thm +prf 3370:3379 <> I_antiT_th +R3407:3410 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3411:3411 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3416:3420 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3421:3425 Coq.Init.Logic <> False ind +R3412:3412 Coq.Init.Logic <> ::type_scope:'~'_x not +R3413:3415 Naturelle <> phi var +R3404:3406 Naturelle <> phi var +R3435:3437 Coq.Init.Logic <> not def +R3551:3555 Coq.Init.Logic <> False ind +R3551:3555 Coq.Init.Logic <> False ind +R3567:3576 Naturelle <> I_antiT_th thm +prf 3598:3605 <> I_non_th +R3630:3630 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3643:3647 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3648:3648 Coq.Init.Logic <> ::type_scope:'~'_x not +R3649:3651 Naturelle <> phi var +R3634:3637 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3638:3642 Coq.Init.Logic <> False ind +R3631:3633 Naturelle <> phi var +R3669:3671 Coq.Init.Logic <> not def +R3730:3731 Coq.Init.Logic <> ::type_scope:'~'_x not +R3730:3731 Coq.Init.Logic <> ::type_scope:'~'_x not +R3745:3752 Naturelle <> I_non_th thm +R3801:3810 Naturelle <> I_antiT_th thm +R3875:3878 Coq.Logic.Classical_Prop <> NNPP thm diff --git a/TP1/Naturelle.v b/TP1/Naturelle.v new file mode 100755 index 0000000..0546e4d --- /dev/null +++ b/TP1/Naturelle.v @@ -0,0 +1,225 @@ +Require Export Classical. + +Ltac Hyp Nom := exact Nom. + +Ltac I_imp' := + match goal with + | |- ?A -> ?B => let hyp := fresh "H" in intro hyp + | _ => fail + end. + +Ltac I_imp Nom := + match goal with + | |- ?A -> ?B => intro Nom + | _ => fail + end. + +Theorem E_imp_th : forall (phi psi : Prop), (phi -> psi) -> phi -> psi. +intros Pphi Ppsi Hphi2psi. +Hyp Hphi2psi. +Qed. + +Ltac E_imp' := + match goal with + | |- ?P => eapply (E_imp_th _ P) + end. + +Ltac E_imp phi := + match goal with + | |- ?P => apply (E_imp_th phi P) + end. + +Ltac I_forall' := + match goal with + | |- forall (x : ?A), ?P => let hyp := fresh x in intro hyp + | _ => fail + end. + +Ltac I_forall Nom := + match goal with + | |- forall (x : ?A), ?P => intro Nom + | _ => fail + end. + +Theorem E_forall_th : forall (A : Type) (phi : A -> Prop) a, (forall x, phi x) -> phi a. +Proof. +firstorder. +Qed. + +Ltac E_forall x := + pattern x; + match goal with + | |- (?P x) => apply (E_forall_th _ P x) + | _ => fail + end. + +Ltac I_et := + match goal with + | |- (?A /\ ?B) => apply (@conj A B) + | _ => fail + end. + +Theorem E_et_g_th : forall (phi psi : Prop), (phi /\ psi) -> phi. +intros Pphi Ppsi Hphi_et_psi. +elim Hphi_et_psi. +intros Hphi Hpsi. +Hyp Hphi. +Qed. + +Ltac E_et_g' := + match goal with + | |- ?P => eapply (E_et_g_th P _) + end. + +Ltac E_et_g psi := + match goal with + | |- ?P => apply (E_et_g_th P psi) + end. + +Theorem E_et_d_th : forall (phi psi : Prop), (phi /\ psi) -> psi. +intros Pphi Ppsi H_phi_et_psi. +elim H_phi_et_psi. +intros Hphi Hpsi. +Hyp Hpsi. +Qed. + +Ltac E_et_d' := + match goal with + | |- ?P => eapply (E_et_d_th _ P) + end. + +Ltac E_et_d phi := + match goal with + | |- ?P => eapply (E_et_d_th phi P) + end. + +Theorem E_ou_th : forall (phi psi chi : Prop), (phi \/ psi) -> (phi -> chi) -> (psi -> chi) -> chi. +intros Pphi Ppsi Pchi Hphi_ou_psi Hphi_imp_chi Hpsi_imp_chi. +elim Hphi_ou_psi. +Hyp Hphi_imp_chi. +Hyp Hpsi_imp_chi. +Qed. + +Ltac E_ou' := + match goal with + | |- ?P => eapply (E_ou_th _ _ P) + end. + +Ltac E_ou phi psi := + match goal with + | |- ?P => apply (E_ou_th phi psi P) + end. + +Ltac I_ou_g := + match goal with + | |- (?A \/ ?B) => apply (@or_introl A B) + | _ => fail + end. + +Ltac I_ou_d := + match goal with + | |- (?A \/ ?B) => apply (@or_intror A B) + | _ => fail + end. + +Ltac I_exists' := + match goal with + | |- exists (x : ?A), (@?P x) => eapply (@ex_intro A P _) + | _ => fail + end. + +Ltac I_exists t := + match goal with + | |- exists (x : ?A), (@?P x) => apply (@ex_intro _ P t) + | _ => fail + end. + +Theorem E_exists_th : forall (A : Type) (phi : A -> Prop) (chi : Prop), (exists x, phi x) -> (forall a, phi a -> chi) -> chi. +Proof. +firstorder. +Qed. +(* +Ltac E_exists phi := + match goal with + | |- ?P => apply (E_exists_th _ phi P) + end. +*) +Ltac E_exists phi := + match goal with + | |- ?P => apply (E_exists_th _ phi P); [ idtac | let t := fresh "t" in let ht := fresh "Ht" in intros t ht ] + end. + +Ltac TE := + unfold not; + match goal with + | |- (?P \/ (?P -> False)) => exact (classic P) + | _ => fail + end. + +Theorem E_antiT_th : forall (phi : Prop), False -> phi. +intros Pphi F. +elim F. +Qed. + +Ltac E_antiT := + match goal with + | |- ?P => apply (E_antiT_th P) + end. + +Theorem I_antiT_th : forall (phi : Prop), phi -> (~phi) -> False. +unfold not. +intro Pphi. +intros Hphi Hnphi. +cut Pphi. +Hyp Hnphi. +Hyp Hphi. +Qed. + +Ltac I_antiT phi := + match goal with + | |- False => apply (I_antiT_th phi) + end. + +Theorem I_non_th : forall (phi : Prop), (phi -> False) -> ~phi. +intros. +unfold not. +exact H. +Qed. + +Ltac I_non Nom := + match goal with + | |- ~ ?P => apply (I_non_th P); intro Nom + end. + +Ltac E_non phi := + apply (I_antiT_th phi). + +Ltac absurde Nom := + match goal with + | |- ?P => apply (NNPP P); intro Nom + end. + +(* +Ltac I_antiT phi := apply (I_antiT_th phi). + +Ltac absurde Nom phi := +match goal with +| |- phi => +cut (phi \/ ~phi); +[ +intros L; +elim L; +[ +auto +| +clear L; +intro Nom; +apply (E_antiT_th) +] +| +apply (classic phi) +] +| _ => fail +end. +*) + diff --git a/TP1/TP1.v b/TP1/TP1.v new file mode 100755 index 0000000..731bbef --- /dev/null +++ b/TP1/TP1.v @@ -0,0 +1,119 @@ +(* Les règles de la déduction naturelle doivent être ajoutées à Coq. *) +Require Import Naturelle. + +(* Ouverture d\u2019une section *) +Section CalculPropositionnel. + +(* Déclaration de variables propositionnelles *) +Variable A B C E Y R : Prop. + +(*Exerice 1*) + +Theorem Thm00 : A /\ B -> B /\ A. +I_imp H. +I_et. +E_et_d A. +Hyp H. +E_et_g B. +Hyp H. +Qed. + +Theorem Thm_1 : ((A \/ B) -> C) -> (B -> C). +I_imp H. +I_imp H2. +E_imp (A \/ B). +Hyp H. +I_ou_d. +Hyp H2. +Qed. + +Theorem Thm_2 : A -> ~~A. +I_imp H. +I_non H2. +I_antiT A. +Hyp H. +Hyp H2. +Qed. + +Theorem Thm_3 : (A -> B) -> (~B -> ~A). +I_imp H. +I_imp H2. +I_non H3. +I_antiT B. +E_imp A. +Hyp H. +Hyp H3. +Hyp H2. +Qed. + +Theorem Thm_4 : ~~A -> A. +I_imp H. +absurde H2. +I_antiT (~A). +Hyp H2. +Hyp H. +Qed. + +Theorem Thm_5 : (~B -> ~A) -> (A -> B). + +I_imp H. +I_imp H2. +absurde H3. +I_antiT (A). +Hyp H2. +E_imp (~B). +trivial. +trivial. +Qed. + +Theorem Thm_6 : ((E -> (Y \/ R)) /\ (Y -> R)) -> (~R -> ~E). +intros. +I_non H1. +I_antiT (R). +E_ou Y R. +E_imp E. +E_et_g (Y -> R). +Hyp H. +Hyp H1. +E_et_d (E -> Y \/ R). +Hyp H. +I_imp H2. +tauto. +tauto. +Qed. + +(*Exerice 2*) + +Theorem Coq_E_imp : ((A -> B) /\ A) -> B. +intros. +destruct H as (H1,H2). +tauto. +Qed. + +Theorem Coq_E_et_g : (A /\ B) -> A. +intros. +destruct H as (H1,H2). +trivial. +Qed. + +Theorem Coq_E_ou : ((A \/ B) /\ (A -> C) /\ (B -> C)) -> C. +intros. +destruct H as (H1,H2). +destruct H2 as (H2,H3). +destruct H1 as [H4 | H5]. +E_imp A. +Hyp H2. +Hyp H4. +E_imp B. +trivial. +trivial. +Qed. + +Theorem Thm_7 : ((E -> (Y \/ R)) /\ (Y -> R)) -> (~R -> ~E). +intros. +destruct H as (H1,H2). +tauto. (* à détailler *) +Qed. + +End CalculPropositionnel. + diff --git a/TP2-3/TP2-enigme.mlw b/TP2-3/TP2-enigme.mlw new file mode 100644 index 0000000..c557982 --- /dev/null +++ b/TP2-3/TP2-enigme.mlw @@ -0,0 +1,29 @@ +theory Enigme + + predicate a + predicate b + predicate c + + predicate da = b /\ (not c) + predicate db = a -> c + predicate dc = (not c) /\ ( a \/ b ) + + goal Q1: not (da /\ db /\ dc) + (* on demande ensuite un contre exemple *) + + goal Q2c: da /\ db -> dc (* vrai *) + goal Q2b: dc /\ da -> db (* faux *) + goal Q2a: db /\ dc -> da (* vrai *) + + goal Q3a: (not a) /\ (not b) /\ (not c) -> da (* faux, a ment *) + goal Q3b: (not a) /\ (not b) /\ (not c) -> db (* b dit la vérité *) + goal Q3c: (not a) /\ (not b) /\ (not c) -> dc (* faux, c ment *) + + goal Q4a: da /\ db /\ dc -> a (* faux, a innocent *) + goal Q4b: da /\ db /\ dc -> b (* b coupable *) + goal Q4c: da /\ db /\ dc -> c (* faux, c innocent *) + + goal Q5: not ( (a -> (not da)) /\ (b -> (not db)) /\ (c -> (not dc)) ) + (* on demande ensuite un contre exemple *) + +end diff --git a/TP2-3/TP2.v b/TP2-3/TP2.v new file mode 100644 index 0000000..3a8ef43 --- /dev/null +++ b/TP2-3/TP2.v @@ -0,0 +1,45 @@ +(* Ouverture d’une section *) +Section CalculPredicats. +(* Définition de 2 domaines pour les prédicats *) +Variable A B : Type. + +(* Formule du second ordre : Quantification des prédicats phi et psi *) +Theorem Thm_8 : forall (P Q : A -> Prop), + (forall x1 : A, (P x1) /\ (Q x1)) + -> (forall x2 : A, (P x2)) /\ (forall x3 : A, (Q x3)). +intros. +split. +intro x2. +destruct (H x2). +exact H0. +intro x3. +destruct (H x3). +exact H1. +Qed. + +(* Formule du second ordre : Quantification des prédicats phi et psi *) +Theorem Thm_9 : forall (P : A -> B -> Prop), + (exists x1 : A, forall y1 : B, (P x1 y1)) + -> forall y2 : B, exists x2 : A, (P x2 y2). +intros. +destruct H. +exists x. +generalize y2. +exact H. +Qed. + + +(* Formule du second ordre : Quantification des prédicats phi et psi *) +Theorem Thm_10 : forall (P Q : A -> Prop), + (exists x1 : A, (P x1) -> (Q x1)) + -> (forall x2 : A, (P x2)) -> exists x3 : A, (Q x3). +intros. +destruct H. +exists x. +cut (P x). +exact H. +generalize x. +exact H0. +Qed. + +End CalculPredicats. \ No newline at end of file diff --git a/TP2-3/TP2.v.crashcoqide b/TP2-3/TP2.v.crashcoqide new file mode 100644 index 0000000..5aaba17 --- /dev/null +++ b/TP2-3/TP2.v.crashcoqide @@ -0,0 +1,49 @@ +(* Ouverture d’une section *) +Section CalculPredicats. +(* Définition de 2 domaines pour les prédicats *) +Variable A B : Type. + +(* Formule du second ordre : Quantification des prédicats phi et psi *) +Theorem Thm_8 : forall (P Q : A -> Prop), + (forall x1 : A, (P x1) /\ (Q x1)) + -> (forall x2 : A, (P x2)) /\ (forall x3 : A, (Q x3)). +intros. +split. +intro x2. +exists. + + + + + + + + + + + + + + + + + + + + + + +(* Formule du second ordre : Quantification des prédicats phi et psi +Theorem Thm_9 : forall (P : A -> B -> Prop), + (exists x1 : A, forall y1 : B, (P x1 y1)) + -> forall y2 : B, exists x2 : A, (P x2 y2). +intros.*) + +(* Formule du second ordre : Quantification des prédicats phi et psi +Theorem Thm_10 : forall (P Q : A -> Prop), + (exists x1 : A, (P x1) -> (Q x1)) + -> (forall x2 : A, (P x2)) -> exists x3 : A, (Q x3). +intros. +exists x2.*) + +End CalculPredicats. \ No newline at end of file diff --git a/TP2-3/enigme.mlw b/TP2-3/enigme.mlw new file mode 100644 index 0000000..c557982 --- /dev/null +++ b/TP2-3/enigme.mlw @@ -0,0 +1,29 @@ +theory Enigme + + predicate a + predicate b + predicate c + + predicate da = b /\ (not c) + predicate db = a -> c + predicate dc = (not c) /\ ( a \/ b ) + + goal Q1: not (da /\ db /\ dc) + (* on demande ensuite un contre exemple *) + + goal Q2c: da /\ db -> dc (* vrai *) + goal Q2b: dc /\ da -> db (* faux *) + goal Q2a: db /\ dc -> da (* vrai *) + + goal Q3a: (not a) /\ (not b) /\ (not c) -> da (* faux, a ment *) + goal Q3b: (not a) /\ (not b) /\ (not c) -> db (* b dit la vérité *) + goal Q3c: (not a) /\ (not b) /\ (not c) -> dc (* faux, c ment *) + + goal Q4a: da /\ db /\ dc -> a (* faux, a innocent *) + goal Q4b: da /\ db /\ dc -> b (* b coupable *) + goal Q4c: da /\ db /\ dc -> c (* faux, c innocent *) + + goal Q5: not ( (a -> (not da)) /\ (b -> (not db)) /\ (c -> (not dc)) ) + (* on demande ensuite un contre exemple *) + +end diff --git a/TP2-3/enigme/enigme-Predicats-Thm01_1.cvc b/TP2-3/enigme/enigme-Predicats-Thm01_1.cvc new file mode 100644 index 0000000..a91fa97 --- /dev/null +++ b/TP2-3/enigme/enigme-Predicats-Thm01_1.cvc @@ -0,0 +1,83 @@ +%%% this is a prelude for CVC3 +uni : TYPE; + +ty : TYPE; + +sort: (ty, uni) -> BOOLEAN; + +witness: (ty) -> uni; + +% witness_sort + ASSERT (FORALL (a : ty): (sort(a, witness(a)))); + +int: ty; + +real: ty; + +bool: ty; + +match_bool: (ty, BITVECTOR(1), uni, uni) -> uni; + +% match_bool_sort + ASSERT + (FORALL (a : ty): + (FORALL (x : BITVECTOR(1), x1 : uni, x2 : uni): (sort(a, match_bool(a, x, + x1, x2))))); + +% match_bool_True + ASSERT + (FORALL (a : ty): + (FORALL (z : uni, z1 : uni): + ((sort(a, z)) => (match_bool(a, 0bin1, z, z1) = z)))); + +% match_bool_False + ASSERT + (FORALL (a : ty): + (FORALL (z : uni, z1 : uni): + ((sort(a, z1)) => (match_bool(a, 0bin0, z, z1) = z1)))); + +index_bool: (BITVECTOR(1)) -> INT; + +% index_bool_True + ASSERT (index_bool(0bin1) = 0); + +% index_bool_False + ASSERT (index_bool(0bin0) = 1); + +% bool_inversion + ASSERT (FORALL (u : BITVECTOR(1)): ((u = 0bin1) OR (u = 0bin0))); + +tuple0 : TYPE; + +tuple01: ty; + +Tuple0: tuple0; + +% tuple0_inversion + ASSERT (FORALL (u : tuple0): (u = Tuple0)); + +a: BOOLEAN; + +b: BOOLEAN; + +c: BOOLEAN; + +da: BOOLEAN; + +% da_def + ASSERT (da <=> (b AND (NOT c))); + +db: BOOLEAN; + +% db_def + ASSERT (db <=> (a => c)); + +dc: BOOLEAN; + +% dc_def + ASSERT (dc <=> ((NOT c) AND (a OR b))); + +QUERY +% Thm01 + % File "enigme.mlw", line 13, characters 7-12 + (da AND (db AND dc)); diff --git a/TP2-3/enigme/enigme-Predicats-Thm01_1.smt2 b/TP2-3/enigme/enigme-Predicats-Thm01_1.smt2 new file mode 100644 index 0000000..d170dce --- /dev/null +++ b/TP2-3/enigme/enigme-Predicats-Thm01_1.smt2 @@ -0,0 +1,29 @@ +;;; generated by SMT-LIB2 driver +;;; SMT-LIB2 driver: bit-vectors, common part +(declare-datatypes () ((tuple0 (Tuple0)))) +(declare-fun a () Bool) + +(declare-fun b () Bool) + +(declare-fun c () Bool) + +(declare-fun da () Bool) + +;; da_def + (assert (= da (and b (not c)))) + +(declare-fun db () Bool) + +;; db_def + (assert (= db (=> a c))) + +(declare-fun dc () Bool) + +;; dc_def + (assert (= dc (and (not c) (or a b)))) + +(assert +;; Thm01 + ;; File "enigme.mlw", line 13, characters 7-12 + (not (and da (and db dc)))) +(check-sat) diff --git a/TP2-3/enigme/enigme-Proposition-Q1_1.smt2 b/TP2-3/enigme/enigme-Proposition-Q1_1.smt2 new file mode 100644 index 0000000..baa492f --- /dev/null +++ b/TP2-3/enigme/enigme-Proposition-Q1_1.smt2 @@ -0,0 +1,34 @@ +;;; generated by SMT-LIB2 driver +;;; SMT-LIB2 driver: bit-vectors, common part +(declare-datatypes () ((tuple0 (Tuple0)))) +(declare-fun a () Bool) + +(declare-fun b () Bool) + +(declare-fun c () Bool) + +(declare-fun da () Bool) + +;; da_def + (assert (= da (and b (not c)))) + +(declare-fun db () Bool) + +;; db_def + (assert (= db (=> a c))) + +(declare-fun dc () Bool) + +;; dc_def + (assert (= dc (and (not c) (or a b)))) + +(declare-fun compat () Bool) + +;; compat_def + (assert (= compat (and da (and db dc)))) + +(assert +;; Q1 + ;; File "enigme/../enigme.mlw", line 15, characters 7-9 + (not (not compat))) +(check-sat) diff --git a/TP2-3/enigme/enigme_Predicats_Thm01_1.v b/TP2-3/enigme/enigme_Predicats_Thm01_1.v new file mode 100644 index 0000000..da62a14 --- /dev/null +++ b/TP2-3/enigme/enigme_Predicats_Thm01_1.v @@ -0,0 +1,27 @@ +(* This file is generated by Why3's Coq driver *) +(* Beware! Only edit allowed sections below *) +Require Import BuiltIn. +Require BuiltIn. + +Parameter a: Prop. + +Parameter b: Prop. + +Parameter c: Prop. + +(* Why3 assumption *) +Definition da : Prop := b /\ ~ c. + +(* Why3 assumption *) +Definition db : Prop := a -> c. + +(* Why3 assumption *) +Definition dc : Prop := ~ c /\ (a \/ b). + +(* Why3 goal *) +Theorem Thm01 : da /\ (db /\ dc). +Proof. + + +Qed. + diff --git a/TP2-3/enigme/why3session.xml b/TP2-3/enigme/why3session.xml new file mode 100644 index 0000000..683e08b --- /dev/null +++ b/TP2-3/enigme/why3session.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TP2-3/sujet.pdf b/TP2-3/sujet.pdf new file mode 100644 index 0000000000000000000000000000000000000000..22138a7251f848536792686d0b7ae5383360e18a GIT binary patch literal 114125 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 z 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

S3nVFDX))s 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 Prop), + (forall x1 : A, (P x1) /\ (Q x1)) + -> (forall x2 : A, (P x2)) /\ (forall x3 : A, (Q x3)). +intros. +split. +intro x2. +destruct (H x2). +exact H0. +intro x3. +destruct (H x3). +exact H1. +Qed. + +(* Formule du second ordre : Quantification des prédicats phi et psi *) +Theorem Thm_9 : forall (P : A -> B -> Prop), + (exists x1 : A, forall y1 : B, (P x1 y1)) + -> forall y2 : B, exists x2 : A, (P x2 y2). +intros. +destruct H. +exists x. +generalize y2. +exact H. +Qed. + + +(* Formule du second ordre : Quantification des prédicats phi et psi *) +Theorem Thm_10 : forall (P Q : A -> Prop), + (exists x1 : A, (P x1) -> (Q x1)) + -> (forall x2 : A, (P x2)) -> exists x3 : A, (Q x3). +intros. +destruct H. +exists x. +cut (P x). +exact H. +generalize x. +exact H0. +Qed. + +End CalculPredicats. \ No newline at end of file diff --git a/TP2/TP2.v.crashcoqide b/TP2/TP2.v.crashcoqide new file mode 100755 index 0000000..5aaba17 --- /dev/null +++ b/TP2/TP2.v.crashcoqide @@ -0,0 +1,49 @@ +(* Ouverture d’une section *) +Section CalculPredicats. +(* Définition de 2 domaines pour les prédicats *) +Variable A B : Type. + +(* Formule du second ordre : Quantification des prédicats phi et psi *) +Theorem Thm_8 : forall (P Q : A -> Prop), + (forall x1 : A, (P x1) /\ (Q x1)) + -> (forall x2 : A, (P x2)) /\ (forall x3 : A, (Q x3)). +intros. +split. +intro x2. +exists. + + + + + + + + + + + + + + + + + + + + + + +(* Formule du second ordre : Quantification des prédicats phi et psi +Theorem Thm_9 : forall (P : A -> B -> Prop), + (exists x1 : A, forall y1 : B, (P x1 y1)) + -> forall y2 : B, exists x2 : A, (P x2 y2). +intros.*) + +(* Formule du second ordre : Quantification des prédicats phi et psi +Theorem Thm_10 : forall (P Q : A -> Prop), + (exists x1 : A, (P x1) -> (Q x1)) + -> (forall x2 : A, (P x2)) -> exists x3 : A, (Q x3). +intros. +exists x2.*) + +End CalculPredicats. \ No newline at end of file diff --git a/TP2/enigme.mlw b/TP2/enigme.mlw new file mode 100755 index 0000000..c557982 --- /dev/null +++ b/TP2/enigme.mlw @@ -0,0 +1,29 @@ +theory Enigme + + predicate a + predicate b + predicate c + + predicate da = b /\ (not c) + predicate db = a -> c + predicate dc = (not c) /\ ( a \/ b ) + + goal Q1: not (da /\ db /\ dc) + (* on demande ensuite un contre exemple *) + + goal Q2c: da /\ db -> dc (* vrai *) + goal Q2b: dc /\ da -> db (* faux *) + goal Q2a: db /\ dc -> da (* vrai *) + + goal Q3a: (not a) /\ (not b) /\ (not c) -> da (* faux, a ment *) + goal Q3b: (not a) /\ (not b) /\ (not c) -> db (* b dit la vérité *) + goal Q3c: (not a) /\ (not b) /\ (not c) -> dc (* faux, c ment *) + + goal Q4a: da /\ db /\ dc -> a (* faux, a innocent *) + goal Q4b: da /\ db /\ dc -> b (* b coupable *) + goal Q4c: da /\ db /\ dc -> c (* faux, c innocent *) + + goal Q5: not ( (a -> (not da)) /\ (b -> (not db)) /\ (c -> (not dc)) ) + (* on demande ensuite un contre exemple *) + +end diff --git a/TP2/enigme/enigme-Predicats-Thm01_1.cvc b/TP2/enigme/enigme-Predicats-Thm01_1.cvc new file mode 100755 index 0000000..a91fa97 --- /dev/null +++ b/TP2/enigme/enigme-Predicats-Thm01_1.cvc @@ -0,0 +1,83 @@ +%%% this is a prelude for CVC3 +uni : TYPE; + +ty : TYPE; + +sort: (ty, uni) -> BOOLEAN; + +witness: (ty) -> uni; + +% witness_sort + ASSERT (FORALL (a : ty): (sort(a, witness(a)))); + +int: ty; + +real: ty; + +bool: ty; + +match_bool: (ty, BITVECTOR(1), uni, uni) -> uni; + +% match_bool_sort + ASSERT + (FORALL (a : ty): + (FORALL (x : BITVECTOR(1), x1 : uni, x2 : uni): (sort(a, match_bool(a, x, + x1, x2))))); + +% match_bool_True + ASSERT + (FORALL (a : ty): + (FORALL (z : uni, z1 : uni): + ((sort(a, z)) => (match_bool(a, 0bin1, z, z1) = z)))); + +% match_bool_False + ASSERT + (FORALL (a : ty): + (FORALL (z : uni, z1 : uni): + ((sort(a, z1)) => (match_bool(a, 0bin0, z, z1) = z1)))); + +index_bool: (BITVECTOR(1)) -> INT; + +% index_bool_True + ASSERT (index_bool(0bin1) = 0); + +% index_bool_False + ASSERT (index_bool(0bin0) = 1); + +% bool_inversion + ASSERT (FORALL (u : BITVECTOR(1)): ((u = 0bin1) OR (u = 0bin0))); + +tuple0 : TYPE; + +tuple01: ty; + +Tuple0: tuple0; + +% tuple0_inversion + ASSERT (FORALL (u : tuple0): (u = Tuple0)); + +a: BOOLEAN; + +b: BOOLEAN; + +c: BOOLEAN; + +da: BOOLEAN; + +% da_def + ASSERT (da <=> (b AND (NOT c))); + +db: BOOLEAN; + +% db_def + ASSERT (db <=> (a => c)); + +dc: BOOLEAN; + +% dc_def + ASSERT (dc <=> ((NOT c) AND (a OR b))); + +QUERY +% Thm01 + % File "enigme.mlw", line 13, characters 7-12 + (da AND (db AND dc)); diff --git a/TP2/enigme/enigme-Predicats-Thm01_1.smt2 b/TP2/enigme/enigme-Predicats-Thm01_1.smt2 new file mode 100755 index 0000000..d170dce --- /dev/null +++ b/TP2/enigme/enigme-Predicats-Thm01_1.smt2 @@ -0,0 +1,29 @@ +;;; generated by SMT-LIB2 driver +;;; SMT-LIB2 driver: bit-vectors, common part +(declare-datatypes () ((tuple0 (Tuple0)))) +(declare-fun a () Bool) + +(declare-fun b () Bool) + +(declare-fun c () Bool) + +(declare-fun da () Bool) + +;; da_def + (assert (= da (and b (not c)))) + +(declare-fun db () Bool) + +;; db_def + (assert (= db (=> a c))) + +(declare-fun dc () Bool) + +;; dc_def + (assert (= dc (and (not c) (or a b)))) + +(assert +;; Thm01 + ;; File "enigme.mlw", line 13, characters 7-12 + (not (and da (and db dc)))) +(check-sat) diff --git a/TP2/enigme/enigme-Proposition-Q1_1.smt2 b/TP2/enigme/enigme-Proposition-Q1_1.smt2 new file mode 100755 index 0000000..baa492f --- /dev/null +++ b/TP2/enigme/enigme-Proposition-Q1_1.smt2 @@ -0,0 +1,34 @@ +;;; generated by SMT-LIB2 driver +;;; SMT-LIB2 driver: bit-vectors, common part +(declare-datatypes () ((tuple0 (Tuple0)))) +(declare-fun a () Bool) + +(declare-fun b () Bool) + +(declare-fun c () Bool) + +(declare-fun da () Bool) + +;; da_def + (assert (= da (and b (not c)))) + +(declare-fun db () Bool) + +;; db_def + (assert (= db (=> a c))) + +(declare-fun dc () Bool) + +;; dc_def + (assert (= dc (and (not c) (or a b)))) + +(declare-fun compat () Bool) + +;; compat_def + (assert (= compat (and da (and db dc)))) + +(assert +;; Q1 + ;; File "enigme/../enigme.mlw", line 15, characters 7-9 + (not (not compat))) +(check-sat) diff --git a/TP2/enigme/enigme_Predicats_Thm01_1.v b/TP2/enigme/enigme_Predicats_Thm01_1.v new file mode 100755 index 0000000..da62a14 --- /dev/null +++ b/TP2/enigme/enigme_Predicats_Thm01_1.v @@ -0,0 +1,27 @@ +(* This file is generated by Why3's Coq driver *) +(* Beware! Only edit allowed sections below *) +Require Import BuiltIn. +Require BuiltIn. + +Parameter a: Prop. + +Parameter b: Prop. + +Parameter c: Prop. + +(* Why3 assumption *) +Definition da : Prop := b /\ ~ c. + +(* Why3 assumption *) +Definition db : Prop := a -> c. + +(* Why3 assumption *) +Definition dc : Prop := ~ c /\ (a \/ b). + +(* Why3 goal *) +Theorem Thm01 : da /\ (db /\ dc). +Proof. + + +Qed. + diff --git a/TP2/enigme/why3session.xml b/TP2/enigme/why3session.xml new file mode 100755 index 0000000..683e08b --- /dev/null +++ b/TP2/enigme/why3session.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TP4/induction-etu.mlw b/TP4/induction-etu.mlw new file mode 100644 index 0000000..7970ca3 --- /dev/null +++ b/TP4/induction-etu.mlw @@ -0,0 +1,23 @@ +theory Induction + +(* Définition du type inductif liste *) +type liste 'a = Nil | Cons 'a (liste 'a) + +(* Concaténation de deux listes *) +function append (l1 l2 : liste 'a) : liste 'a = + match l1 with + | Nil -> l2 + | Cons t q -> Cons t (append q l2) + end + +lemma append_Nil_left : forall l : liste 'a. append Nil l = l + +lemma append_Cons_left : forall e : 'a. forall l1 l2 : liste 'a. + append (Cons e l1) l2 = Cons e (append l1 l2) + +lemma append_Nil_right: forall l : liste 'a. append l Nil = l + +lemma append_associative : forall l1 [@induction] l2 l3 : liste 'a. + append l1 (append l2 l3) = append (append l1 l2) l3 + +end \ No newline at end of file diff --git a/TP4/induction-etu.v b/TP4/induction-etu.v new file mode 100644 index 0000000..954c5a4 --- /dev/null +++ b/TP4/induction-etu.v @@ -0,0 +1,121 @@ +Require Import Extraction. +(* Ouverture d’une section *) +Section Induction. +(* Déclaration d’un domaine pour les éléments des listes *) +Variable A : Set. + +Inductive liste : Set := + Nil : liste +| Cons : A -> liste -> liste. + +(* Déclaration du nom de la fonction *) +Variable append_spec : liste -> liste -> liste. + +(* Spécification du comportement pour Nil *) +Axiom append_Nil : forall (l : liste), append_spec Nil l = l. + +(* Spécification du comportement pour Cons *) +Axiom append_Cons : forall (t : A), forall (q l : liste), + append_spec (Cons t q) l = Cons t (append_spec q l). + +Theorem append_Nil_right : forall (l : liste), (append_spec l Nil) = l. +intros. +induction l. +(*cas de base*) +apply append_Nil. +(*cas general*) +rewrite append_Cons. +rewrite IHl. +reflexivity. +Qed. + +Theorem append_associative : forall (l1 l2 l3 : liste), + (append_spec l1 (append_spec l2 l3)) = (append_spec (append_spec l1 l2) l3). +intros. +induction l1. +(*cas de base*) +rewrite append_Nil. +rewrite append_Nil. +reflexivity. +(*cas general*) +rewrite append_Cons. +rewrite IHl1. +rewrite append_Cons. +rewrite append_Cons. +reflexivity. +Qed. + +(* Implantation de la fonction append *) +Fixpoint append_impl (l1 l2 : liste) {struct l1} : liste := + match l1 with + Nil => l2 + | (Cons t1 q1) => (Cons t1 (append_impl q1 l2)) +end. + +Theorem append_correctness : forall (l1 l2 : liste), + (append_spec l1 l2) = (append_impl l1 l2). +intros. +induction l1. +(*cas de base*) +rewrite append_Nil. +simpl append_impl. +reflexivity. +(*cas general*) +rewrite append_Cons. +simpl append_impl. +rewrite IHl1. +reflexivity. +Qed. + +(* Implantation de la fonction rev (reverse d'une liste) *) +Fixpoint rev_impl (l : liste) : liste := + match l with + Nil => Nil + | (Cons t1 q1) => (append_impl (rev_impl q1)( Cons t1 Nil)) +end. + +Lemma rev_append : forall (l1 l2 : liste), + (rev_impl (append_impl l1 l2)) = (append_impl (rev_impl l2) (rev_impl l1)). +intros. +induction l1. +(*cas de base *) +simpl append_impl. +rewrite <- append_correctness. +rewrite append_Nil_right. +reflexivity. +(*cas general*) +simpl rev_impl. +rewrite IHl1. +rewrite <- append_correctness. +rewrite <- append_correctness. +rewrite <- append_correctness. +rewrite <- append_correctness. +rewrite append_associative. +reflexivity. +Qed. + +Theorem rev_rev : forall (l : liste), (rev_impl (rev_impl l)) = l. +intros. +induction l. +(*Cas de base*) +simpl rev_impl. +reflexivity. +(*cas general*) +simpl rev_impl. +rewrite rev_append. +rewrite IHl. +simpl rev_impl. +rewrite <- append_correctness. +rewrite append_Cons. +rewrite append_Nil. +reflexivity. +Qed. + +End Induction. + +Extraction Language Ocaml. +Extraction "/tmp/induction" append_impl rev_impl. +Extraction Language Haskell. +Extraction "/tmp/induction" append_impl rev_impl. +Extraction Language Scheme. +Extraction "/tmp/induction" append_impl rev_impl. diff --git a/TP4/readme.txt b/TP4/readme.txt new file mode 100644 index 0000000..b626354 --- /dev/null +++ b/TP4/readme.txt @@ -0,0 +1,9 @@ +2020-10-13 +Modélisation TP4 +http://moodle-n7.inp-toulouse.fr/pluginfile.php/90409/mod_resource/content/4/equipes-TD5TD6.txt + +Membres de groupe G-5: +EL HADFI Younes +HAMMAMI Linda +HAUTEVILLE Leane +FAINSIN Laurent diff --git a/TP5/induction-etu.mlw b/TP5/induction-etu.mlw new file mode 100755 index 0000000..7970ca3 --- /dev/null +++ b/TP5/induction-etu.mlw @@ -0,0 +1,23 @@ +theory Induction + +(* Définition du type inductif liste *) +type liste 'a = Nil | Cons 'a (liste 'a) + +(* Concaténation de deux listes *) +function append (l1 l2 : liste 'a) : liste 'a = + match l1 with + | Nil -> l2 + | Cons t q -> Cons t (append q l2) + end + +lemma append_Nil_left : forall l : liste 'a. append Nil l = l + +lemma append_Cons_left : forall e : 'a. forall l1 l2 : liste 'a. + append (Cons e l1) l2 = Cons e (append l1 l2) + +lemma append_Nil_right: forall l : liste 'a. append l Nil = l + +lemma append_associative : forall l1 [@induction] l2 l3 : liste 'a. + append l1 (append l2 l3) = append (append l1 l2) l3 + +end \ No newline at end of file diff --git a/TP5/induction-etu.v b/TP5/induction-etu.v new file mode 100755 index 0000000..d93cb9f --- /dev/null +++ b/TP5/induction-etu.v @@ -0,0 +1,123 @@ +Require Import Extraction. +(* Ouverture d’une section *) +Section Induction. +(* Déclaration d’un domaine pour les éléments des listes *) +Variable A : Set. + +Inductive liste : Set := + Nil : liste +| Cons : A -> liste -> liste. + +(* Déclaration du nom de la fonction *) +Variable append_spec : liste -> liste -> liste. + +(* Spécification du comportement pour Nil *) +Axiom append_Nil : forall (l : liste), append_spec Nil l = l. + +(* Spécification du comportement pour Cons *) +Axiom append_Cons : forall (t : A), forall (q l : liste), + append_spec (Cons t q) l = Cons t (append_spec q l). + +Theorem append_Nil_right : forall (l : liste), (append_spec l Nil) = l. +intros. +induction l. +(* cas de base *) +apply append_Nil. +(* cas général *) +rewrite append_Cons. +rewrite IHl. +reflexivity. +Qed. + + +Theorem append_associative : forall (l1 l2 l3 : liste), + (append_spec l1 (append_spec l2 l3)) = (append_spec (append_spec l1 l2) l3). +intros. +induction l1. +(* cas de base *) +rewrite append_Nil. +rewrite append_Nil. +reflexivity. +(* cas général *) +rewrite append_Cons. +rewrite append_Cons. +rewrite append_Cons. +rewrite IHl1. +reflexivity. +Qed. + + +(* Implantation de la fonction append *) +Fixpoint append_impl (l1 l2 : liste) {struct l1} : liste := + match l1 with + Nil => l2 + | (Cons t1 q1) => (Cons t1 (append_impl q1 l2)) +end. + +Theorem append_correctness : forall (l1 l2 : liste), + (append_spec l1 l2) = (append_impl l1 l2). +intros. +induction l1. +(* cas de base *) +rewrite append_Nil. +simpl append_impl. +reflexivity. +(* cas général *) +rewrite append_Cons. +simpl append_impl. +rewrite IHl1. +reflexivity. +Qed. + +(* Implantation de la fonction rev (reverse d'une liste) *) +Fixpoint rev_impl (l : liste) : liste := + match l with + Nil => l + | (Cons x y) => ( append_impl (rev_impl y) (Cons x Nil) ) +end. + + +Lemma rev_append : forall (l1 l2 : liste), + (rev_impl (append_impl l1 l2)) = (append_impl (rev_impl l2) (rev_impl l1)). +intros. +induction l1. +(* cas de base *) +simpl rev_impl. +rewrite <- append_correctness. +rewrite append_Nil_right. +reflexivity. +(* cas général *) +simpl rev_impl. +rewrite IHl1. +rewrite <- append_correctness. +rewrite <- append_correctness. +rewrite <- append_correctness. +rewrite <- append_correctness. +rewrite append_associative. +reflexivity. +Qed. + +Theorem rev_rev : forall (l : liste), (rev_impl (rev_impl l)) = l. +intros. +induction l. +(* cas de base *) +simpl rev_impl. +reflexivity. +(* cas général *) +simpl rev_impl. +rewrite rev_append. +rewrite IHl. +simpl rev_impl. +rewrite <- append_correctness. +rewrite append_Cons. +rewrite append_Nil. +reflexivity. +Qed. + +End Induction. +Extraction Language Ocaml. +Extraction "/tmp/induction" append_impl rev_impl. +Extraction Language Haskell. +Extraction "/tmp/induction" append_impl rev_impl. +Extraction Language Scheme. +Extraction "/tmp/induction" append_impl rev_impl. diff --git a/TP5/induction-etu.wlm b/TP5/induction-etu.wlm new file mode 100755 index 0000000..7970ca3 --- /dev/null +++ b/TP5/induction-etu.wlm @@ -0,0 +1,23 @@ +theory Induction + +(* Définition du type inductif liste *) +type liste 'a = Nil | Cons 'a (liste 'a) + +(* Concaténation de deux listes *) +function append (l1 l2 : liste 'a) : liste 'a = + match l1 with + | Nil -> l2 + | Cons t q -> Cons t (append q l2) + end + +lemma append_Nil_left : forall l : liste 'a. append Nil l = l + +lemma append_Cons_left : forall e : 'a. forall l1 l2 : liste 'a. + append (Cons e l1) l2 = Cons e (append l1 l2) + +lemma append_Nil_right: forall l : liste 'a. append l Nil = l + +lemma append_associative : forall l1 [@induction] l2 l3 : liste 'a. + append l1 (append l2 l3) = append (append l1 l2) l3 + +end \ No newline at end of file diff --git a/TP5/induction-etu/why3session.xml b/TP5/induction-etu/why3session.xml new file mode 100755 index 0000000..a0ad9c4 --- /dev/null +++ b/TP5/induction-etu/why3session.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TP6/ascendant.mlw b/TP6/ascendant.mlw new file mode 100755 index 0000000..8666063 --- /dev/null +++ b/TP6/ascendant.mlw @@ -0,0 +1,37 @@ +(* Spécification de la fonction factorielle *) + +theory Factorielle + + use int.Int + + function factorielle( n : int ) : int + + axiom factorielle_zero : (factorielle zero) = one + + axiom factorielle_succ : forall n : int. (n > 0) -> (factorielle n) = (n * (factorielle (n - 1))) + +end + +(* Implémentation de la fonction factorielle par un algorithme ascendant *) + +module FactorielleAscendant + + use int.Int + use ref.Refint + use Factorielle + + let factorielle_ascendant (n: int) : int + requires { 0 <= n } + ensures { result = (factorielle n) } + = + let i = ref 0 in + let r = ref 1 in + while (!i < n) do + invariant { !r = (factorielle !i) && ( 0 <= !i <= n ) } + variant { n - !i } + i := (!i) + 1; + r := (!i) * (!r) + done; + !r + +end diff --git a/TP6/ascendant/ascendant_FactorielleAscendant_VC_factorielle_ascendant_1.v b/TP6/ascendant/ascendant_FactorielleAscendant_VC_factorielle_ascendant_1.v new file mode 100755 index 0000000..2a3167a --- /dev/null +++ b/TP6/ascendant/ascendant_FactorielleAscendant_VC_factorielle_ascendant_1.v @@ -0,0 +1,42 @@ +(* This file is generated by Why3's Coq driver *) +(* Beware! Only edit allowed sections below *) +Require Import BuiltIn. +Require BuiltIn. +Require int.Int. + +(* Why3 assumption *) +Inductive ref (a:Type) := + | mk_ref : a -> ref a. +Axiom ref_WhyType : forall (a:Type) {a_WT:WhyType a}, WhyType (ref a). +Existing Instance ref_WhyType. +Arguments mk_ref {a}. + +(* Why3 assumption *) +Definition contents {a:Type} {a_WT:WhyType a} (v:ref a) : a := + match v with + | mk_ref x => x + end. + +Parameter factorielle: Z -> Z. + +Axiom factorielle_zero : ((factorielle 0%Z) = 1%Z). + +Axiom factorielle_succ : + forall (n:Z), (0%Z < n)%Z -> + ((factorielle n) = (n * (factorielle (n - 1%Z)%Z))%Z). + +Parameter n: Z. + +Axiom H : (0%Z <= n)%Z. + +(* Why3 goal *) +Theorem VC_factorielle_ascendant : + (1%Z = (factorielle 0%Z)) /\ ((0%Z <= 0%Z)%Z /\ (0%Z <= n)%Z). +split. +rewrite factorielle_zero. +reflexivity. +split. +omega. +apply H. +Qed. + diff --git a/TP6/ascendant/ascendant_FactorielleAscendant_VC_factorielle_ascendant_2.v b/TP6/ascendant/ascendant_FactorielleAscendant_VC_factorielle_ascendant_2.v new file mode 100755 index 0000000..ee12c35 --- /dev/null +++ b/TP6/ascendant/ascendant_FactorielleAscendant_VC_factorielle_ascendant_2.v @@ -0,0 +1,67 @@ +(* This file is generated by Why3's Coq driver *) +(* Beware! Only edit allowed sections below *) +Require Import BuiltIn. +Require BuiltIn. +Require int.Int. + +(* Why3 assumption *) +Inductive ref (a:Type) := + | mk_ref : a -> ref a. +Axiom ref_WhyType : forall (a:Type) {a_WT:WhyType a}, WhyType (ref a). +Existing Instance ref_WhyType. +Arguments mk_ref {a}. + +(* Why3 assumption *) +Definition contents {a:Type} {a_WT:WhyType a} (v:ref a) : a := + match v with + | mk_ref x => x + end. + +Parameter factorielle: Z -> Z. + +Axiom factorielle_zero : ((factorielle 0%Z) = 1%Z). + +Axiom factorielle_succ : + forall (n:Z), (0%Z < n)%Z -> + ((factorielle n) = (n * (factorielle (n - 1%Z)%Z))%Z). + +Parameter n: Z. + +Axiom H : (0%Z <= n)%Z. + +Parameter r: Z. + +Parameter i: Z. + +Axiom H1 : (r = (factorielle i)). + +Axiom H2 : (0%Z <= i)%Z. + +Axiom H3 : (i <= n)%Z. + +Axiom H4 : (i < n)%Z. + +Parameter i1: Z. + +Axiom H5 : (i1 = (i + 1%Z)%Z). + +Parameter r1: Z. + +Axiom H6 : (r1 = (i1 * r)%Z). + +(* Why3 goal *) +Theorem VC_factorielle_ascendant : + (0%Z <= (n - i)%Z)%Z /\ ((n - i1)%Z < (n - i)%Z)%Z. +split. +generalize H. +intros. +generalize H3. +intros. +omega. +generalize H. +intros. +generalize H5. +intros. +omega. +Qed. + diff --git a/TP6/ascendant/ascendant_FactorielleAscendant_VC_factorielle_ascendant_3.v b/TP6/ascendant/ascendant_FactorielleAscendant_VC_factorielle_ascendant_3.v new file mode 100755 index 0000000..750c948 --- /dev/null +++ b/TP6/ascendant/ascendant_FactorielleAscendant_VC_factorielle_ascendant_3.v @@ -0,0 +1,70 @@ +(* This file is generated by Why3's Coq driver *) +(* Beware! Only edit allowed sections below *) +Require Import BuiltIn. +Require BuiltIn. +Require int.Int. + +(* Why3 assumption *) +Inductive ref (a:Type) := + | mk_ref : a -> ref a. +Axiom ref_WhyType : forall (a:Type) {a_WT:WhyType a}, WhyType (ref a). +Existing Instance ref_WhyType. +Arguments mk_ref {a}. + +(* Why3 assumption *) +Definition contents {a:Type} {a_WT:WhyType a} (v:ref a) : a := + match v with + | mk_ref x => x + end. + +Parameter factorielle: Z -> Z. + +Axiom factorielle_zero : ((factorielle 0%Z) = 1%Z). + +Axiom factorielle_succ : + forall (n:Z), (0%Z < n)%Z -> + ((factorielle n) = (n * (factorielle (n - 1%Z)%Z))%Z). + +Parameter n: Z. + +Axiom H : (0%Z <= n)%Z. + +Parameter r: Z. + +Parameter i: Z. + +Axiom H1 : (r = (factorielle i)). + +Axiom H2 : (0%Z <= i)%Z. + +Axiom H3 : (i <= n)%Z. + +Axiom H4 : (i < n)%Z. + +Parameter i1: Z. + +Axiom H5 : (i1 = (i + 1%Z)%Z). + +Parameter r1: Z. + +Axiom H6 : (r1 = (i1 * r)%Z). + +Axiom H7 : ((i+1-1) = i)%Z. + +(* Why3 goal *) +Theorem VC_factorielle_ascendant : + (r1 = (factorielle i1)) /\ ((0%Z <= i1)%Z /\ (i1 <= n)%Z). +split. +generalize H1. +intros. +rewrite H6. +rewrite -> factorielle_succ. +rewrite H5. +rewrite H0. +rewrite H7. +reflexivity. +generalize H2. +intros. +rewrite H5. +Qed. + diff --git a/TP6/ascendant/ascendant_FactorielleAscendant_VC_factorielle_ascendant_4.v b/TP6/ascendant/ascendant_FactorielleAscendant_VC_factorielle_ascendant_4.v new file mode 100755 index 0000000..1165424 --- /dev/null +++ b/TP6/ascendant/ascendant_FactorielleAscendant_VC_factorielle_ascendant_4.v @@ -0,0 +1,52 @@ +(* This file is generated by Why3's Coq driver *) +(* Beware! Only edit allowed sections below *) +Require Import BuiltIn. +Require BuiltIn. +Require int.Int. + +(* Why3 assumption *) +Inductive ref (a:Type) := + | mk_ref : a -> ref a. +Axiom ref_WhyType : forall (a:Type) {a_WT:WhyType a}, WhyType (ref a). +Existing Instance ref_WhyType. +Arguments mk_ref {a}. + +(* Why3 assumption *) +Definition contents {a:Type} {a_WT:WhyType a} (v:ref a) : a := + match v with + | mk_ref x => x + end. + +Parameter factorielle: Z -> Z. + +Axiom factorielle_zero : ((factorielle 0%Z) = 1%Z). + +Axiom factorielle_succ : + forall (n:Z), (0%Z < n)%Z -> + ((factorielle n) = (n * (factorielle (n - 1%Z)%Z))%Z). + +Parameter n: Z. + +Axiom H : (0%Z <= n)%Z. + +Parameter r: Z. + +Parameter i: Z. + +Axiom H1 : (r = (factorielle i)). + +Axiom H2 : (0%Z <= i)%Z. + +Axiom H3 : (i <= n)%Z. +Axiom H4 : ~ (i < n)%Z. + +(* H3 et H4 implique H43 *) +Axiom H34 : ( i = n )%Z. + +(* Why3 goal *) +Theorem VC_factorielle_ascendant : (r = (factorielle n)). +rewrite H1. +rewrite H34. +reflexivity. +Qed. + diff --git a/TP6/ascendant/why3session.xml b/TP6/ascendant/why3session.xml new file mode 100755 index 0000000..bb94a95 --- /dev/null +++ b/TP6/ascendant/why3session.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TP6/descendant.mlw b/TP6/descendant.mlw new file mode 100755 index 0000000..4d7c0f2 --- /dev/null +++ b/TP6/descendant.mlw @@ -0,0 +1,37 @@ +(* Spécification de la fonction factorielle *) + +theory Factorielle + + use int.Int + + function factorielle( n : int ) : int + + axiom factorielle_zero : (factorielle zero) = one + + axiom factorielle_succ : forall n : int. (n > 0) -> (factorielle n) = (n * (factorielle (n - 1))) + +end + +(* Implémentation de la fonction factorielle par un algorithme descendant *) + +module FactorielleDescendant + + use int.Int + use Factorielle + use ref.Refint + + let factorielle_descendant (n: int) : int + requires { 0 <= n } + ensures { result = (factorielle n) } + = + let i = ref n in + let r = ref 1 in + while (0 < !i) do + invariant { !r * factorielle !i = factorielle n && 0 <= !i } + variant { !i } + r := !i * !r; + i := !i - 1 + done; + !r + +end diff --git a/TP6/descendant/why3session.xml b/TP6/descendant/why3session.xml new file mode 100755 index 0000000..dd7a418 --- /dev/null +++ b/TP6/descendant/why3session.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TP6/division.mlw b/TP6/division.mlw new file mode 100755 index 0000000..418b256 --- /dev/null +++ b/TP6/division.mlw @@ -0,0 +1,23 @@ + +(* Division entière par l'algorithme d'Euclide *) + +module Division + + use int.Int + use ref.Refint + + let division (a b: int) (* renvoie une paire d'entiers (quotient,reste) *) + requires { 0 <= a && 0 < b } + ensures { let (q,r) = result in q * b + r = a && 0 <= r < b } + = + let q = ref 0 in + let r = ref a in + while !r >= b do + invariant { a = !q * b + !r && 0 <= !q && 0 <= !r } + variant { !r - b } + q := (!q) + 1; + r := (!r) - b + done; + (!q,!r) + +end diff --git a/TP6/division/why3session.xml b/TP6/division/why3session.xml new file mode 100755 index 0000000..86c96fa --- /dev/null +++ b/TP6/division/why3session.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TP6/pgcd.mlw b/TP6/pgcd.mlw new file mode 100755 index 0000000..8a1d401 --- /dev/null +++ b/TP6/pgcd.mlw @@ -0,0 +1,38 @@ + +(* PGCD : Algorithme Euclide *) + +theory PGCD + + use int.Int + + function pgcd(a b : int) : int + + axiom A1 : forall a: int. (a>0) -> ( pgcd a a ) = a + axiom A2 : forall a,b: int. (a>0 && b>0) -> ( pgcd a b ) = ( pgcd b a ) + axiom A3 : forall a,b: int. (a>b>0) -> ( pgcd a b ) = (pgcd (a-b) b ) + +end + +module PGCDEuclide + + use import int.Int + use import ref.Refint + use import PGCD + + let pgcd_euclide (a b: int) : int + requires { 0 < a && 0 < b } + ensures { result = (pgcd a b)} + = + let ap = ref a in + let bp = ref b in + while (!ap <> !bp) do + invariant { (pgcd a b ) = ( pgcd !ap !bp ) && !ap > 0 && !bp > 0 } + variant { !ap + !bp } + if (!ap <= !bp) then + bp := !bp - !ap + else + ap := !ap - !bp + done; + !ap + +end diff --git a/TP6/pgcd/why3session.xml b/TP6/pgcd/why3session.xml new file mode 100755 index 0000000..92cf434 --- /dev/null +++ b/TP6/pgcd/why3session.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TP7/.Naturelle.aux b/TP7/.Naturelle.aux new file mode 100755 index 0000000..9986a4a --- /dev/null +++ b/TP7/.Naturelle.aux @@ -0,0 +1,40 @@ +COQAUX1 f13e540aa0997388dd1408b0662438d6 /home/lfainsin/1A/Modé/TP7/Naturelle.v +383 387 proof_build_time "0.000" +0 0 E_imp_th "0.000" +383 387 context_used "" +383 387 proof_check_time "0.000" +0 0 VernacProof "tac:no using:no" +916 920 proof_build_time "0.000" +0 0 E_forall_th "0.000" +916 920 context_used "" +916 920 proof_check_time "0.000" +1291 1295 proof_build_time "0.001" +0 0 E_et_g_th "0.001" +1291 1295 context_used "" +1291 1295 proof_check_time "0.000" +1601 1605 proof_build_time "0.000" +0 0 E_et_d_th "0.000" +1601 1605 context_used "" +1601 1605 proof_check_time "0.000" +1983 1987 proof_build_time "0.001" +0 0 E_ou_th "0.001" +1983 1987 context_used "" +1983 1987 proof_check_time "0.000" +0 0 VernacProof "tac:no using:no" +2806 2810 proof_build_time "0.001" +0 0 E_exists_th "0.001" +2806 2810 context_used "" +2806 2810 proof_check_time "0.000" +3280 3284 proof_build_time "0.000" +0 0 E_antiT_th "0.000" +3280 3284 context_used "" +3280 3284 proof_check_time "0.000" +3502 3506 proof_build_time "0.001" +0 0 I_antiT_th "0.001" +3502 3506 context_used "" +3502 3506 proof_check_time "0.000" +3683 3687 proof_build_time "0.000" +0 0 I_non_th "0.000" +3683 3687 context_used "" +3683 3687 proof_check_time "0.000" +0 0 vo_compile_time "0.107" diff --git a/TP7/._Naturelle.v b/TP7/._Naturelle.v new file mode 100755 index 0000000000000000000000000000000000000000..9f9b07ea97ac48dd81da8a1109088c5954607172 GIT binary patch literal 630 zcma)(!A`a#ge&|p09CzC((XTHg7mK>ZN5|NM=A4vBdsVA+q%*YXzMu_O5V=vCpcaYQVw)3$i zA=I&~KiGbrFSnNm<4EC?$q1APGVb$?TNrt($cuP5@-Txo3?Q6?zgi^3Xvkjd#&#gi za_$Z7m5|au+)K;7%^-RlLITZX9Hlra;_U=)KmDDb&UnJ(ER2ElC!;XURFyiPUms66 zS-?UGLhfYa>z15s5f2#eOuP%?o>x5Y@p%Y|)E$ONIG!z}`eGF***dri5&$JgF5B*% zSF|EXQ~nHAiQX_ysZj}Z*`$6=Hu`!^Hn|bVKA0wDffn?2Z9|u6qj1dZ{Oq6C;Gb=2 wF)gbqqjr_4z*NfZ7XFp(x`x}JCX<_*doAlV>d3XKZpv!aWCnG#My2VJZwoMjr~m)} literal 0 HcmV?d00001 diff --git a/TP7/Naturelle.glob b/TP7/Naturelle.glob new file mode 100755 index 0000000..df9312d --- /dev/null +++ b/TP7/Naturelle.glob @@ -0,0 +1,150 @@ +DIGEST f13e540aa0997388dd1408b0662438d6 +FNaturelle +R15:23 Coq.Logic.Classical <> <> lib +R97:100 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R97:100 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R218:221 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R218:221 Coq.Init.Logic <> ::type_scope:x_'->'_x not +prf 278:285 <> E_imp_th +R314:314 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R325:329 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R333:336 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R337:339 Naturelle <> psi var +R330:332 Naturelle <> phi var +R318:321 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R322:324 Naturelle <> psi var +R315:317 Naturelle <> phi var +R443:450 Naturelle <> E_imp_th thm +R521:528 Naturelle <> E_imp_th thm +prf 816:826 <> E_forall_th +R856:859 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R855:855 Naturelle <> A var +R869:869 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R885:889 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R890:892 Naturelle <> phi var +R894:894 Naturelle <> a var +R880:882 Naturelle <> phi var +R884:884 Naturelle <> x var +R996:1006 Naturelle <> E_forall_th thm +R1086:1089 Coq.Init.Logic <> ::type_scope:x_'/\'_x not +R1086:1089 Coq.Init.Logic <> ::type_scope:x_'/\'_x not +R1105:1108 Coq.Init.Logic <> conj constr +prf 1157:1165 <> E_et_g_th +R1194:1194 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1205:1209 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1210:1212 Naturelle <> phi var +R1198:1201 Coq.Init.Logic <> ::type_scope:x_'/\'_x not +R1195:1197 Naturelle <> phi var +R1202:1204 Naturelle <> psi var +R1352:1360 Naturelle <> E_et_g_th thm +R1432:1440 Naturelle <> E_et_g_th thm +prf 1465:1473 <> E_et_d_th +R1502:1502 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1513:1517 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1518:1520 Naturelle <> psi var +R1506:1509 Coq.Init.Logic <> ::type_scope:x_'/\'_x not +R1503:1505 Naturelle <> phi var +R1510:1512 Naturelle <> psi var +R1662:1670 Naturelle <> E_et_d_th thm +R1743:1751 Naturelle <> E_et_d_th thm +prf 1776:1782 <> E_ou_th +R1815:1815 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1826:1830 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1831:1831 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1842:1846 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1847:1847 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1858:1862 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1863:1865 Naturelle <> chi var +R1851:1854 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1855:1857 Naturelle <> chi var +R1848:1850 Naturelle <> psi var +R1835:1838 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R1839:1841 Naturelle <> chi var +R1832:1834 Naturelle <> phi var +R1819:1822 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R1816:1818 Naturelle <> phi var +R1823:1825 Naturelle <> psi var +R2042:2048 Naturelle <> E_ou_th thm +R2124:2130 Naturelle <> E_ou_th thm +R2194:2197 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R2194:2197 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R2213:2221 Coq.Init.Logic <> or_introl constr +R2305:2308 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R2305:2308 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R2324:2332 Coq.Init.Logic <> or_intror constr +R2416:2423 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2430:2433 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2439:2439 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2438:2438 Naturelle <> x var +R2416:2423 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2430:2433 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2439:2439 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2438:2438 Naturelle <> x var +R2453:2460 Coq.Init.Logic <> ex_intro constr +R2561:2568 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2575:2578 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2584:2584 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2583:2583 Naturelle <> x var +R2561:2568 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2575:2578 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2584:2584 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2583:2583 Naturelle <> x var +R2597:2604 Coq.Init.Logic <> ex_intro constr +prf 2669:2679 <> E_exists_th +R2709:2712 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R2708:2708 Naturelle <> A var +R2733:2733 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R2749:2753 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R2754:2754 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R2777:2781 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R2782:2784 Naturelle <> chi var +R2770:2773 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R2774:2776 Naturelle <> chi var +R2765:2767 Naturelle <> phi var +R2769:2769 Naturelle <> a var +R2734:2740 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2742:2743 Coq.Init.Logic <> ::type_scope:'exists'_x_'..'_x_','_x not +R2744:2746 Naturelle <> phi var +R2748:2748 Naturelle <> x var +R2963:2973 Naturelle <> E_exists_th thm +R3083:3085 Coq.Init.Logic <> not def +R3116:3120 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R3132:3132 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R3123:3126 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3127:3131 Coq.Init.Logic <> False ind +R3116:3120 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R3132:3132 Coq.Init.Logic <> ::type_scope:x_'\/'_x not +R3123:3126 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3127:3131 Coq.Init.Logic <> False ind +R3145:3151 Coq.Logic.Classical_Prop <> classic prfax +prf 3209:3218 <> E_antiT_th +R3248:3251 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3252:3254 Naturelle <> phi var +R3243:3247 Coq.Init.Logic <> False ind +R3340:3349 Naturelle <> E_antiT_th thm +prf 3370:3379 <> I_antiT_th +R3407:3410 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3411:3411 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3416:3420 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3421:3425 Coq.Init.Logic <> False ind +R3412:3412 Coq.Init.Logic <> ::type_scope:'~'_x not +R3413:3415 Naturelle <> phi var +R3404:3406 Naturelle <> phi var +R3435:3437 Coq.Init.Logic <> not def +R3551:3555 Coq.Init.Logic <> False ind +R3551:3555 Coq.Init.Logic <> False ind +R3567:3576 Naturelle <> I_antiT_th thm +prf 3598:3605 <> I_non_th +R3630:3630 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3643:3647 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3648:3648 Coq.Init.Logic <> ::type_scope:'~'_x not +R3649:3651 Naturelle <> phi var +R3634:3637 Coq.Init.Logic <> ::type_scope:x_'->'_x not +R3638:3642 Coq.Init.Logic <> False ind +R3631:3633 Naturelle <> phi var +R3669:3671 Coq.Init.Logic <> not def +R3730:3731 Coq.Init.Logic <> ::type_scope:'~'_x not +R3730:3731 Coq.Init.Logic <> ::type_scope:'~'_x not +R3745:3752 Naturelle <> I_non_th thm +R3801:3810 Naturelle <> I_antiT_th thm +R3875:3878 Coq.Logic.Classical_Prop <> NNPP thm diff --git a/TP7/Naturelle.v b/TP7/Naturelle.v new file mode 100755 index 0000000..0546e4d --- /dev/null +++ b/TP7/Naturelle.v @@ -0,0 +1,225 @@ +Require Export Classical. + +Ltac Hyp Nom := exact Nom. + +Ltac I_imp' := + match goal with + | |- ?A -> ?B => let hyp := fresh "H" in intro hyp + | _ => fail + end. + +Ltac I_imp Nom := + match goal with + | |- ?A -> ?B => intro Nom + | _ => fail + end. + +Theorem E_imp_th : forall (phi psi : Prop), (phi -> psi) -> phi -> psi. +intros Pphi Ppsi Hphi2psi. +Hyp Hphi2psi. +Qed. + +Ltac E_imp' := + match goal with + | |- ?P => eapply (E_imp_th _ P) + end. + +Ltac E_imp phi := + match goal with + | |- ?P => apply (E_imp_th phi P) + end. + +Ltac I_forall' := + match goal with + | |- forall (x : ?A), ?P => let hyp := fresh x in intro hyp + | _ => fail + end. + +Ltac I_forall Nom := + match goal with + | |- forall (x : ?A), ?P => intro Nom + | _ => fail + end. + +Theorem E_forall_th : forall (A : Type) (phi : A -> Prop) a, (forall x, phi x) -> phi a. +Proof. +firstorder. +Qed. + +Ltac E_forall x := + pattern x; + match goal with + | |- (?P x) => apply (E_forall_th _ P x) + | _ => fail + end. + +Ltac I_et := + match goal with + | |- (?A /\ ?B) => apply (@conj A B) + | _ => fail + end. + +Theorem E_et_g_th : forall (phi psi : Prop), (phi /\ psi) -> phi. +intros Pphi Ppsi Hphi_et_psi. +elim Hphi_et_psi. +intros Hphi Hpsi. +Hyp Hphi. +Qed. + +Ltac E_et_g' := + match goal with + | |- ?P => eapply (E_et_g_th P _) + end. + +Ltac E_et_g psi := + match goal with + | |- ?P => apply (E_et_g_th P psi) + end. + +Theorem E_et_d_th : forall (phi psi : Prop), (phi /\ psi) -> psi. +intros Pphi Ppsi H_phi_et_psi. +elim H_phi_et_psi. +intros Hphi Hpsi. +Hyp Hpsi. +Qed. + +Ltac E_et_d' := + match goal with + | |- ?P => eapply (E_et_d_th _ P) + end. + +Ltac E_et_d phi := + match goal with + | |- ?P => eapply (E_et_d_th phi P) + end. + +Theorem E_ou_th : forall (phi psi chi : Prop), (phi \/ psi) -> (phi -> chi) -> (psi -> chi) -> chi. +intros Pphi Ppsi Pchi Hphi_ou_psi Hphi_imp_chi Hpsi_imp_chi. +elim Hphi_ou_psi. +Hyp Hphi_imp_chi. +Hyp Hpsi_imp_chi. +Qed. + +Ltac E_ou' := + match goal with + | |- ?P => eapply (E_ou_th _ _ P) + end. + +Ltac E_ou phi psi := + match goal with + | |- ?P => apply (E_ou_th phi psi P) + end. + +Ltac I_ou_g := + match goal with + | |- (?A \/ ?B) => apply (@or_introl A B) + | _ => fail + end. + +Ltac I_ou_d := + match goal with + | |- (?A \/ ?B) => apply (@or_intror A B) + | _ => fail + end. + +Ltac I_exists' := + match goal with + | |- exists (x : ?A), (@?P x) => eapply (@ex_intro A P _) + | _ => fail + end. + +Ltac I_exists t := + match goal with + | |- exists (x : ?A), (@?P x) => apply (@ex_intro _ P t) + | _ => fail + end. + +Theorem E_exists_th : forall (A : Type) (phi : A -> Prop) (chi : Prop), (exists x, phi x) -> (forall a, phi a -> chi) -> chi. +Proof. +firstorder. +Qed. +(* +Ltac E_exists phi := + match goal with + | |- ?P => apply (E_exists_th _ phi P) + end. +*) +Ltac E_exists phi := + match goal with + | |- ?P => apply (E_exists_th _ phi P); [ idtac | let t := fresh "t" in let ht := fresh "Ht" in intros t ht ] + end. + +Ltac TE := + unfold not; + match goal with + | |- (?P \/ (?P -> False)) => exact (classic P) + | _ => fail + end. + +Theorem E_antiT_th : forall (phi : Prop), False -> phi. +intros Pphi F. +elim F. +Qed. + +Ltac E_antiT := + match goal with + | |- ?P => apply (E_antiT_th P) + end. + +Theorem I_antiT_th : forall (phi : Prop), phi -> (~phi) -> False. +unfold not. +intro Pphi. +intros Hphi Hnphi. +cut Pphi. +Hyp Hnphi. +Hyp Hphi. +Qed. + +Ltac I_antiT phi := + match goal with + | |- False => apply (I_antiT_th phi) + end. + +Theorem I_non_th : forall (phi : Prop), (phi -> False) -> ~phi. +intros. +unfold not. +exact H. +Qed. + +Ltac I_non Nom := + match goal with + | |- ~ ?P => apply (I_non_th P); intro Nom + end. + +Ltac E_non phi := + apply (I_antiT_th phi). + +Ltac absurde Nom := + match goal with + | |- ?P => apply (NNPP P); intro Nom + end. + +(* +Ltac I_antiT phi := apply (I_antiT_th phi). + +Ltac absurde Nom phi := +match goal with +| |- phi => +cut (phi \/ ~phi); +[ +intros L; +elim L; +[ +auto +| +clear L; +intro Nom; +apply (E_antiT_th) +] +| +apply (classic phi) +] +| _ => fail +end. +*) + diff --git a/TP7/Unnamed_coqscript_1.crashcoqide b/TP7/Unnamed_coqscript_1.crashcoqide new file mode 100755 index 0000000..e69de29 diff --git a/TP7/coq-exercice-1.v b/TP7/coq-exercice-1.v new file mode 100755 index 0000000..55f33e1 --- /dev/null +++ b/TP7/coq-exercice-1.v @@ -0,0 +1,29 @@ +Require Import Naturelle. +Section Session1_2019_Logique_Exercice_1. + +Variable A B C : Prop. + +Theorem Exercice_1_Naturelle : (A -> B -> C) -> ((A /\ B) -> C). +I_imp H. +I_imp H0. +E_imp B. +E_imp A. +exact H. +E_et_g B. +exact H0. +E_et_d A. +exact H0. +Qed. + +Theorem Exercice_1_Coq : (A -> B -> C) -> ((A /\ B) -> C). +intros. +destruct H0. +cut B. +cut A. +exact H. +exact H0. +exact H1. +Qed. + +End Session1_2019_Logique_Exercice_1. + diff --git a/TP7/coq-exercice-2.v b/TP7/coq-exercice-2.v new file mode 100755 index 0000000..3b10b1b --- /dev/null +++ b/TP7/coq-exercice-2.v @@ -0,0 +1,15 @@ +Require Import Naturelle. +Section Session1_2019_Logique_Exercice_2. + +Variable A B : Prop. + +Theorem Exercice_2_Naturelle : (~A) \/ B -> (~A) \/ (A /\ B). + +Theorem Exercice_2_Coq : (~A) \/ B -> (~A) \/ (A /\ B). +intros. + + +Qed. + +End Session1_2019_Logique_Exercice_2. + diff --git a/TP7/coq-exercice-3.v b/TP7/coq-exercice-3.v new file mode 100755 index 0000000..3c3108e --- /dev/null +++ b/TP7/coq-exercice-3.v @@ -0,0 +1,113 @@ +Section Session1_2019_Induction_Exercice_3. + +(* Déclaration d’un domaine pour les éléments des listes *) +Variable A : Set. + +(* Déclaration d'un type liste générique d'éléments de type E *) +Inductive liste (E : Set) : Set := +Nil +: liste E +| Cons : E -> liste E -> liste E. + +(* Déclaration du nom de la fonction append *) +Variable append_spec : forall E : Set, liste E -> liste E -> liste E. + +(* Spécification du comportement de append pour Nil en premier paramètre *) +Axiom append_Nil : forall E : Set, forall (l : liste E), append_spec E (Nil E) l = l. + +(* Spécification du comportement de append pour Cons en premier paramètre *) +Axiom append_Cons : forall E : Set, forall (t : E), forall (q l : liste E), + append_spec E ((Cons E) t q) l = (Cons E) t (append_spec E q l). + +(* Spécification du comportement de append pour Nil en second paramètre *) +Axiom append_Nil_right : forall E : Set, forall (l : liste E), (append_spec E l (Nil E)) = l. + +(* append est associative à gauche et à droite *) +Axiom append_associative : forall E : Set, forall (l1 l2 l3 : liste E), + (append_spec E l1 (append_spec E l2 l3)) = (append_spec E (append_spec E l1 l2) l3). + +(* Déclaration du nom de la fonction flatten *) +Variable flatten_spec : forall E : Set, liste (liste E) -> liste E. + +(* Spécification du comportement de flatten pour Nil *) +Axiom flatten_Nil : forall E : Set, flatten_spec E (Nil (liste E)) = (Nil E). + +(* Spécification du comportement de flatten pour Cons *) +Axiom flatten_Cons : forall E : Set, forall (t : liste E), forall (q : liste (liste E)), + flatten_spec E (Cons (liste E) t q) = append_spec E t (flatten_spec E q). + +(* Déclaration du nom de la fonction split *) +Variable split_spec : forall E : Set, liste E -> liste (liste E). + +(* Spécification du comportement de split pour Nil *) +Axiom split_Nil : forall E : Set, split_spec E (Nil E) = (Nil (liste E)). + +(* Spécification du comportement de split pour Cons *) +Axiom split_Cons : forall E : Set, forall (t : E), forall (q : liste E), + split_spec E (Cons E t q) = Cons (liste E) (Cons E t (Nil E)) (split_spec E q). + +(* Cohérence de flatten et de split : flatten(split(l)) = l*) +Theorem flatten_split_consistency : forall E : Set, forall (l : liste E), + flatten_spec E (split_spec E l) = l. +intros. +induction l. +(* cas de base *) +rewrite split_Nil. +rewrite flatten_Nil. +reflexivity. +(* cas général *) +rewrite split_Cons. +rewrite flatten_Cons. +rewrite append_Cons. +rewrite append_Nil. +rewrite IHl. +reflexivity. +Qed. + +(* Implantation de la fonction append *) +Fixpoint append_impl (E : Set) (l1 l2 : liste E) {struct l1} : liste E := +match l1 with +Nil _ => l2 +| (Cons _ t1 q1) => (Cons E t1 (append_impl E q1 l2)) +end. + +Theorem append_correctness : forall E : Set, forall (l1 l2 : liste E), +(append_spec E l1 l2) = (append_impl E l1 l2). +intro TE. +induction l1. +intro Hl2. +rewrite append_Nil. +simpl. +reflexivity. +intro Hl2. +rewrite append_Cons. +simpl. +rewrite IHl1. +reflexivity. +Qed. + +(* Implantation de la fonction flatten *) +Fixpoint flatten_impl (E : Set) (l : liste (liste E)) {struct l} : liste E := + match l with + Nil _ => Nil _ + | (Cons _ t q) => (append_impl E t (flatten_impl E q )) +end. + +(* Correction de l'implantation de flatten par rapport à sa spécification *) +Theorem flatten_correctness : forall E : Set, forall (l : liste (liste E)), + (flatten_spec E l) = (flatten_impl E l). +intros. +induction l. +(* cas de base *) +rewrite flatten_Nil. +simpl flatten_impl. +reflexivity. +(* cas général *) +rewrite flatten_Cons. +simpl flatten_impl. +rewrite append_correctness. +rewrite IHl. +reflexivity. +Qed. + +End Session1_2019_Induction_Exercice_3. diff --git a/TP7/why3-exercice-4.mlw b/TP7/why3-exercice-4.mlw new file mode 100755 index 0000000..ea8fff6 --- /dev/null +++ b/TP7/why3-exercice-4.mlw @@ -0,0 +1,24 @@ +(* BE : Session 1 2019 *) +(* Implémentation de la fonction somme des premiers entiers par un algorithme ascendant *) + +module Somme + + use int.Int + use int.ComputerDivision + use ref.Refint + + let somme (n: int) : int + requires { n >= 0 } + ensures { 2 * result = n * (n+1) } + = + let i = ref 0 in + let r = ref 0 in + while (!i < n) do + invariant { !r * 2 = !i * ( !i + 1 ) && n >= !i} + variant { n - !i } + i := (!i) + 1; + r := (!r) + (!i) + done; + !r + +end diff --git a/TP7/why3-exercice-4/why3session.xml b/TP7/why3-exercice-4/why3session.xml new file mode 100755 index 0000000..e2a07be --- /dev/null +++ b/TP7/why3-exercice-4/why3session.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TP8-9/outils-unix/cmd-sed.txt b/TP8-9/outils-unix/cmd-sed.txt new file mode 100755 index 0000000..0a48d78 --- /dev/null +++ b/TP8-9/outils-unix/cmd-sed.txt @@ -0,0 +1,2 @@ +sed -E -e "s/<\/?[a-z]+>//g" < enseignant-element.xml-sed +sed -E -e "s/<\/?[a-z]+>//g" < enseignant-attribut.xml-sed \ No newline at end of file diff --git a/TP8-9/outils-unix/commandes-TP5.sh b/TP8-9/outils-unix/commandes-TP5.sh new file mode 100755 index 0000000..7a5cc32 --- /dev/null +++ b/TP8-9/outils-unix/commandes-TP5.sh @@ -0,0 +1,11 @@ +#!/bin/sh +echo "Affichage des lignes contenant des nombres entiers naturels :" +egrep -e "\ ([0-9]+)$" exemple.txt +echo "Affichage des lignes contenant des nombres entiers relatifs :" +egrep -e "\ ([+-]+[0-9]+)$" exemple.txt +echo "Affichage des lignes contenant des nombres décimaux :" +egrep -e "\ ([+-]?[0-9]+[.][0-9]+([eE][-+]?[1-9][0-9]*)?)$" exemple.txt +echo "Affichage des lignes contenant des nombres rationnels :" +egrep -e "\ ([+-]?[0-9]+/[1-9][0-9]*)$" exemple.txt +echo "Affichage des lignes contenant des nombres complexes rationnels :" +egrep -e "\ (([+-]?[0-9]+/[1-9][0-9]*)?[+-]?[0-9]+/[1-9][0-9]*i?)$" exemple.txt diff --git a/TP8-9/outils-unix/enseignant-attribut.xml-sed.out b/TP8-9/outils-unix/enseignant-attribut.xml-sed.out new file mode 100755 index 0000000..8970742 --- /dev/null +++ b/TP8-9/outils-unix/enseignant-attribut.xml-sed.out @@ -0,0 +1,5 @@ + + + + + diff --git a/TP8-9/outils-unix/enseignant-attribut.xml-vim b/TP8-9/outils-unix/enseignant-attribut.xml-vim new file mode 100755 index 0000000..8970742 --- /dev/null +++ b/TP8-9/outils-unix/enseignant-attribut.xml-vim @@ -0,0 +1,5 @@ + + + + + diff --git a/TP8-9/outils-unix/enseignant-element.xml-sed.out b/TP8-9/outils-unix/enseignant-element.xml-sed.out new file mode 100755 index 0000000..034c83d --- /dev/null +++ b/TP8-9/outils-unix/enseignant-element.xml-sed.out @@ -0,0 +1,8 @@ + + + Marc + Pantel + + Traduction des langages + Sémantique formelle + diff --git a/TP8-9/outils-unix/enseignant-element.xml-vim b/TP8-9/outils-unix/enseignant-element.xml-vim new file mode 100755 index 0000000..1a04f6d --- /dev/null +++ b/TP8-9/outils-unix/enseignant-element.xml-vim @@ -0,0 +1,8 @@ + + + Marc + Pantel + + Traduction des langages + Sémantique formelle + diff --git a/TP8-9/outils-unix/exemple.txt b/TP8-9/outils-unix/exemple.txt new file mode 100755 index 0000000..21b2513 --- /dev/null +++ b/TP8-9/outils-unix/exemple.txt @@ -0,0 +1,23 @@ +Suite de chiffres : 0123456789 +Entier naturel : 0 +Entier naturel : 123 +Entier relatif : +123 +Entier relatif : -123 +Décimal : 0.123 +Décimal : -0.123 +Décimal : 0.123e10 +Décimal : 0.123E10 +Décimal : -0.123e10 +Décimal : -0.123E10 +Décimal : 0.123e-10 +Décimal : 0.123E-10 +Décimal : -0.123e-10 +Décimal : -0.123e-10 +Rationnel : 1/2 +Rationnel : -1/2 +Complexe : 1/2i +Complexe : -1/2i +Complexe : 2/3+1/2i +Complexe : 2/3+1/2i +Complexe : -2/3-1/2i +Complexe : -2/3-1/2i diff --git a/TP8-9/process-analysis/MainProcessus b/TP8-9/process-analysis/MainProcessus new file mode 100755 index 0000000000000000000000000000000000000000..392f61197f92f958e1ddf5d50294993f169ee10e GIT binary patch literal 164338 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 literal 0 HcmV?d00001 diff --git a/TP8-9/process-analysis/Makefile b/TP8-9/process-analysis/Makefile new file mode 100755 index 0000000..f436d80 --- /dev/null +++ b/TP8-9/process-analysis/Makefile @@ -0,0 +1,36 @@ + +OCAMLLEX = ocamllex +OCAMLYACC = menhir +OCAMLC = ocamlc +OCAMLLD = ocamlc + + +.SUFFIXES: .ml .mli .cmo .cmi .mll .mly + +%.cmi : %.mli + $(OCAMLC) -c $< + +%.cmo : %.ml %.cmi + $(OCAMLC) -c $< + +%.cmo : %.ml + $(OCAMLC) -c $< + +%.cmo : %.cmi + $(OCAMLC) -c $< + +%.ml : %.mll + $(OCAMLLEX) $< + +%.mli %.ml : %.mly + $(OCAMLYACC) $< + +all : mainProcessus + +lexerProcessus.ml : parserProcessus.cmi + +mainProcessus : lexerProcessus.cmo parserProcessus.cmo mainProcessus.cmo + $(OCAMLC) -o MainProcessus lexerProcessus.cmo parserProcessus.cmo mainProcessus.cmo + +clean : + -rm -f *.cmo *.cmi lexerProcessus.ml parserProcessus.ml MainProcessus diff --git a/TP8-9/process-analysis/lexerProcessus.ml b/TP8-9/process-analysis/lexerProcessus.ml new file mode 100755 index 0000000..01a031c --- /dev/null +++ b/TP8-9/process-analysis/lexerProcessus.ml @@ -0,0 +1,1279 @@ +# 1 "lexerProcessus.mll" + + +(* Partie recopiée dans le fichier CaML généré. *) +(* Ouverture de modules exploités dans les actions *) +(* Déclarations de types, de constantes, de fonctions, d'exceptions exploités dans les actions *) + + open ParserProcessus + exception LexicalError + + +# 13 "lexerProcessus.ml" +let __ocaml_lex_tables = { + Lexing.lex_base = + "\000\000\238\255\239\255\078\000\153\000\242\255\243\255\163\000\ + \238\000\057\001\132\001\207\001\026\002\016\000\002\000\003\000\ + \149\001\181\001\223\001\224\001\000\002\042\002\254\255\043\002\ + \075\002\108\002\160\002\235\002\061\003\136\003\211\003\030\004\ + \105\004\180\004\255\004\074\005\149\005\224\005\043\006\118\006\ + \193\006\012\007\087\007\162\007\237\007\056\008\131\008\206\008\ + \025\009\100\009\175\009\250\009\069\010\144\010\219\010\038\011\ + \113\011\188\011\007\012\082\012\157\012\232\012\051\013\126\013\ + \201\013\020\014\095\014\170\014\245\014\064\015\139\015\214\015\ + \033\016"; + Lexing.lex_backtrk = + "\255\255\255\255\255\255\015\000\014\000\255\255\255\255\015\000\ + \015\000\015\000\015\000\015\000\015\000\017\000\000\000\001\000\ + \255\255\255\255\001\000\255\255\255\255\001\000\255\255\255\255\ + \255\255\001\000\015\000\015\000\015\000\015\000\015\000\002\000\ + \015\000\015\000\015\000\015\000\015\000\015\000\015\000\003\000\ + \015\000\015\000\015\000\010\000\015\000\015\000\015\000\015\000\ + \015\000\004\000\007\000\015\000\015\000\015\000\015\000\015\000\ + \015\000\008\000\005\000\006\000\015\000\015\000\015\000\015\000\ + \015\000\015\000\015\000\009\000\015\000\015\000\015\000\015\000\ + \011\000"; + Lexing.lex_default = + "\001\000\000\000\000\000\255\255\255\255\000\000\000\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\015\000\ + \019\000\023\000\019\000\019\000\023\000\019\000\000\000\023\000\ + \023\000\023\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255"; + Lexing.lex_trans = + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\014\000\014\000\014\000\014\000\255\255\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \014\000\000\000\014\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\013\000\ + \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ + \004\000\004\000\016\000\000\000\000\000\000\000\000\000\015\000\ + \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\000\000\000\000\000\000\000\000\003\000\ + \000\000\011\000\003\000\003\000\003\000\003\000\009\000\003\000\ + \003\000\008\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \012\000\003\000\007\000\010\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\006\000\000\000\005\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\000\000\000\000\000\000\000\000\003\000\000\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ + \004\000\004\000\004\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ + \002\000\000\000\003\000\255\255\003\000\003\000\003\000\003\000\ + \060\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\000\000\000\000\000\000\000\000\003\000\000\000\003\000\ + \003\000\003\000\003\000\003\000\059\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ + \003\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\051\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\000\000\017\000\ + \000\000\000\000\000\000\000\000\018\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\017\000\ + \000\000\000\000\000\000\003\000\022\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \044\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\017\000\020\000\000\000\000\000\000\000\018\000\021\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\020\000\000\000\000\000\000\000\003\000\022\000\ + \003\000\003\000\033\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\032\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\020\000\024\000\000\000\000\000\ + \000\000\021\000\025\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\024\000\000\000\000\000\ + \000\000\003\000\022\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\026\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\255\255\024\000\000\000\ + \000\000\000\000\000\000\025\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\255\255\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\000\000\000\000\000\000\000\000\000\000\255\255\ + \255\255\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\000\000\000\000\000\000\000\000\003\000\ + \255\255\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\027\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ + \000\000\000\000\255\255\255\255\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ + \000\000\000\000\003\000\255\255\003\000\003\000\028\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\255\255\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \000\000\000\000\000\000\000\000\003\000\000\000\003\000\003\000\ + \003\000\003\000\029\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\000\000\000\000\000\000\000\000\003\000\ + \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\030\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ + \000\000\000\000\003\000\000\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\031\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\000\000\000\000\000\000\000\000\003\000\000\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ + \003\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \040\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ + \000\000\000\000\000\000\003\000\000\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \034\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\000\000\000\000\000\000\000\000\003\000\000\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \035\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ + \000\000\003\000\000\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \036\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \000\000\000\000\000\000\000\000\003\000\000\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\037\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\000\000\000\000\000\000\000\000\003\000\ + \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\038\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ + \000\000\000\000\003\000\000\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\039\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\000\000\000\000\000\000\000\000\003\000\000\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ + \003\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\041\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ + \000\000\000\000\000\000\003\000\000\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\042\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\000\000\000\000\000\000\000\000\003\000\000\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\043\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ + \000\000\003\000\000\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \000\000\000\000\000\000\000\000\003\000\000\000\045\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\000\000\000\000\000\000\000\000\003\000\ + \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\046\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ + \000\000\000\000\003\000\000\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\047\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\000\000\000\000\000\000\000\000\003\000\000\000\003\000\ + \003\000\003\000\003\000\048\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\049\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ + \003\000\000\000\003\000\003\000\003\000\050\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ + \000\000\000\000\000\000\003\000\000\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\000\000\000\000\000\000\000\000\003\000\000\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ + \000\000\003\000\000\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \052\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \000\000\000\000\000\000\000\000\003\000\000\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\053\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\000\000\000\000\000\000\000\000\003\000\ + \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\054\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ + \000\000\000\000\003\000\000\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\055\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\000\000\000\000\000\000\000\000\003\000\000\000\003\000\ + \003\000\003\000\003\000\056\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ + \003\000\000\000\003\000\003\000\003\000\057\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\058\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ + \000\000\000\000\000\000\003\000\000\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\000\000\000\000\000\000\000\000\003\000\000\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ + \000\000\003\000\000\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \000\000\000\000\000\000\000\000\003\000\000\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\061\000\003\000\ + \062\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\000\000\000\000\000\000\000\000\003\000\ + \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\068\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ + \000\000\000\000\003\000\000\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\063\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\000\000\000\000\000\000\000\000\003\000\000\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\064\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ + \003\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\065\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ + \000\000\000\000\000\000\003\000\000\000\003\000\003\000\066\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\000\000\000\000\000\000\000\000\003\000\000\000\ + \003\000\003\000\003\000\003\000\067\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ + \000\000\003\000\000\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \000\000\000\000\000\000\000\000\003\000\000\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\069\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\000\000\000\000\000\000\000\000\003\000\ + \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\070\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\ + \000\000\000\000\003\000\000\000\003\000\003\000\003\000\003\000\ + \071\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\000\000\000\000\000\000\000\000\003\000\000\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\072\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ + \003\000\000\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000"; + Lexing.lex_check = + "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\000\000\000\000\014\000\014\000\015\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \000\000\255\255\014\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\013\000\255\255\255\255\255\255\255\255\013\000\ + \255\255\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\255\255\255\255\255\255\255\255\000\000\ + \255\255\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\255\255\000\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\255\255\255\255\255\255\255\255\003\000\255\255\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ + \004\000\004\000\004\000\007\000\007\000\007\000\007\000\007\000\ + \007\000\007\000\007\000\007\000\007\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\007\000\007\000\007\000\007\000\ + \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\ + \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\ + \007\000\007\000\007\000\007\000\007\000\007\000\255\255\255\255\ + \000\000\255\255\007\000\015\000\007\000\007\000\007\000\007\000\ + \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\ + \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\ + \007\000\007\000\007\000\007\000\007\000\007\000\008\000\008\000\ + \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\008\000\ + \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\ + \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\ + \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\ + \008\000\255\255\255\255\255\255\255\255\008\000\255\255\008\000\ + \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\ + \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\ + \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\ + \008\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\ + \009\000\009\000\009\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\009\000\009\000\009\000\009\000\009\000\009\000\ + \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\ + \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\ + \009\000\009\000\009\000\009\000\255\255\255\255\255\255\255\255\ + \009\000\255\255\009\000\009\000\009\000\009\000\009\000\009\000\ + \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\ + \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\ + \009\000\009\000\009\000\009\000\010\000\010\000\010\000\010\000\ + \010\000\010\000\010\000\010\000\010\000\010\000\255\255\016\000\ + \255\255\255\255\255\255\255\255\016\000\010\000\010\000\010\000\ + \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ + \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ + \010\000\010\000\010\000\010\000\010\000\010\000\010\000\017\000\ + \255\255\255\255\255\255\010\000\017\000\010\000\010\000\010\000\ + \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ + \010\000\010\000\010\000\010\000\010\000\010\000\010\000\010\000\ + \010\000\010\000\010\000\010\000\010\000\010\000\010\000\011\000\ + \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\ + \011\000\018\000\019\000\255\255\255\255\255\255\018\000\019\000\ + \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\ + \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\ + \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\ + \011\000\011\000\020\000\255\255\255\255\255\255\011\000\020\000\ + \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\ + \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\ + \011\000\011\000\011\000\011\000\011\000\011\000\011\000\011\000\ + \011\000\011\000\012\000\012\000\012\000\012\000\012\000\012\000\ + \012\000\012\000\012\000\012\000\021\000\023\000\255\255\255\255\ + \255\255\021\000\023\000\012\000\012\000\012\000\012\000\012\000\ + \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ + \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ + \012\000\012\000\012\000\012\000\012\000\024\000\255\255\255\255\ + \255\255\012\000\024\000\012\000\012\000\012\000\012\000\012\000\ + \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ + \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ + \012\000\012\000\012\000\012\000\012\000\016\000\025\000\255\255\ + \255\255\255\255\255\255\025\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\017\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ + \026\000\026\000\255\255\255\255\255\255\255\255\255\255\018\000\ + \019\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ + \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ + \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ + \026\000\026\000\026\000\255\255\255\255\255\255\255\255\026\000\ + \020\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ + \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ + \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ + \026\000\026\000\026\000\027\000\027\000\027\000\027\000\027\000\ + \027\000\027\000\027\000\027\000\027\000\255\255\255\255\255\255\ + \255\255\255\255\021\000\023\000\027\000\027\000\027\000\027\000\ + \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ + \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ + \027\000\027\000\027\000\027\000\027\000\027\000\255\255\255\255\ + \255\255\255\255\027\000\024\000\027\000\027\000\027\000\027\000\ + \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ + \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ + \027\000\027\000\027\000\027\000\027\000\027\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\025\000\028\000\028\000\028\000\ + \028\000\028\000\028\000\028\000\028\000\028\000\028\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\028\000\028\000\ + \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ + \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ + \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ + \255\255\255\255\255\255\255\255\028\000\255\255\028\000\028\000\ + \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ + \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ + \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ + \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ + \029\000\029\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ + \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ + \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ + \029\000\029\000\029\000\255\255\255\255\255\255\255\255\029\000\ + \255\255\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ + \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ + \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ + \029\000\029\000\029\000\030\000\030\000\030\000\030\000\030\000\ + \030\000\030\000\030\000\030\000\030\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\030\000\030\000\030\000\030\000\ + \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\ + \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\ + \030\000\030\000\030\000\030\000\030\000\030\000\255\255\255\255\ + \255\255\255\255\030\000\255\255\030\000\030\000\030\000\030\000\ + \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\ + \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\ + \030\000\030\000\030\000\030\000\030\000\030\000\031\000\031\000\ + \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\031\000\ + \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ + \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ + \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ + \031\000\255\255\255\255\255\255\255\255\031\000\255\255\031\000\ + \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ + \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ + \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ + \031\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\255\255\255\255\255\255\255\255\ + \032\000\255\255\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\ + \032\000\032\000\032\000\032\000\033\000\033\000\033\000\033\000\ + \033\000\033\000\033\000\033\000\033\000\033\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\033\000\033\000\033\000\ + \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ + \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ + \033\000\033\000\033\000\033\000\033\000\033\000\033\000\255\255\ + \255\255\255\255\255\255\033\000\255\255\033\000\033\000\033\000\ + \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ + \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ + \033\000\033\000\033\000\033\000\033\000\033\000\033\000\034\000\ + \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\ + \034\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\ + \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\ + \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\ + \034\000\034\000\255\255\255\255\255\255\255\255\034\000\255\255\ + \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\ + \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\ + \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\ + \034\000\034\000\035\000\035\000\035\000\035\000\035\000\035\000\ + \035\000\035\000\035\000\035\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\035\000\035\000\035\000\035\000\035\000\ + \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\ + \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\ + \035\000\035\000\035\000\035\000\035\000\255\255\255\255\255\255\ + \255\255\035\000\255\255\035\000\035\000\035\000\035\000\035\000\ + \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\ + \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\ + \035\000\035\000\035\000\035\000\035\000\036\000\036\000\036\000\ + \036\000\036\000\036\000\036\000\036\000\036\000\036\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\036\000\036\000\ + \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\ + \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\ + \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\ + \255\255\255\255\255\255\255\255\036\000\255\255\036\000\036\000\ + \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\ + \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\ + \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\ + \037\000\037\000\037\000\037\000\037\000\037\000\037\000\037\000\ + \037\000\037\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\037\000\037\000\037\000\037\000\037\000\037\000\037\000\ + \037\000\037\000\037\000\037\000\037\000\037\000\037\000\037\000\ + \037\000\037\000\037\000\037\000\037\000\037\000\037\000\037\000\ + \037\000\037\000\037\000\255\255\255\255\255\255\255\255\037\000\ + \255\255\037\000\037\000\037\000\037\000\037\000\037\000\037\000\ + \037\000\037\000\037\000\037\000\037\000\037\000\037\000\037\000\ + \037\000\037\000\037\000\037\000\037\000\037\000\037\000\037\000\ + \037\000\037\000\037\000\038\000\038\000\038\000\038\000\038\000\ + \038\000\038\000\038\000\038\000\038\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\038\000\038\000\038\000\038\000\ + \038\000\038\000\038\000\038\000\038\000\038\000\038\000\038\000\ + \038\000\038\000\038\000\038\000\038\000\038\000\038\000\038\000\ + \038\000\038\000\038\000\038\000\038\000\038\000\255\255\255\255\ + \255\255\255\255\038\000\255\255\038\000\038\000\038\000\038\000\ + \038\000\038\000\038\000\038\000\038\000\038\000\038\000\038\000\ + \038\000\038\000\038\000\038\000\038\000\038\000\038\000\038\000\ + \038\000\038\000\038\000\038\000\038\000\038\000\039\000\039\000\ + \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\039\000\ + \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ + \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ + \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ + \039\000\255\255\255\255\255\255\255\255\039\000\255\255\039\000\ + \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ + \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ + \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ + \039\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ + \040\000\040\000\040\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\040\000\040\000\040\000\040\000\040\000\040\000\ + \040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ + \040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ + \040\000\040\000\040\000\040\000\255\255\255\255\255\255\255\255\ + \040\000\255\255\040\000\040\000\040\000\040\000\040\000\040\000\ + \040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ + \040\000\040\000\040\000\040\000\040\000\040\000\040\000\040\000\ + \040\000\040\000\040\000\040\000\041\000\041\000\041\000\041\000\ + \041\000\041\000\041\000\041\000\041\000\041\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\041\000\041\000\041\000\ + \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ + \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ + \041\000\041\000\041\000\041\000\041\000\041\000\041\000\255\255\ + \255\255\255\255\255\255\041\000\255\255\041\000\041\000\041\000\ + \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ + \041\000\041\000\041\000\041\000\041\000\041\000\041\000\041\000\ + \041\000\041\000\041\000\041\000\041\000\041\000\041\000\042\000\ + \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ + \042\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ + \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ + \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ + \042\000\042\000\255\255\255\255\255\255\255\255\042\000\255\255\ + \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ + \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ + \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ + \042\000\042\000\043\000\043\000\043\000\043\000\043\000\043\000\ + \043\000\043\000\043\000\043\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\043\000\043\000\043\000\043\000\043\000\ + \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ + \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ + \043\000\043\000\043\000\043\000\043\000\255\255\255\255\255\255\ + \255\255\043\000\255\255\043\000\043\000\043\000\043\000\043\000\ + \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ + \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ + \043\000\043\000\043\000\043\000\043\000\044\000\044\000\044\000\ + \044\000\044\000\044\000\044\000\044\000\044\000\044\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\044\000\044\000\ + \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ + \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ + \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ + \255\255\255\255\255\255\255\255\044\000\255\255\044\000\044\000\ + \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ + \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ + \044\000\044\000\044\000\044\000\044\000\044\000\044\000\044\000\ + \045\000\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ + \045\000\045\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ + \045\000\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ + \045\000\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ + \045\000\045\000\045\000\255\255\255\255\255\255\255\255\045\000\ + \255\255\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ + \045\000\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ + \045\000\045\000\045\000\045\000\045\000\045\000\045\000\045\000\ + \045\000\045\000\045\000\046\000\046\000\046\000\046\000\046\000\ + \046\000\046\000\046\000\046\000\046\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\046\000\046\000\046\000\046\000\ + \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\ + \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\ + \046\000\046\000\046\000\046\000\046\000\046\000\255\255\255\255\ + \255\255\255\255\046\000\255\255\046\000\046\000\046\000\046\000\ + \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\ + \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\ + \046\000\046\000\046\000\046\000\046\000\046\000\047\000\047\000\ + \047\000\047\000\047\000\047\000\047\000\047\000\047\000\047\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\047\000\ + \047\000\047\000\047\000\047\000\047\000\047\000\047\000\047\000\ + \047\000\047\000\047\000\047\000\047\000\047\000\047\000\047\000\ + \047\000\047\000\047\000\047\000\047\000\047\000\047\000\047\000\ + \047\000\255\255\255\255\255\255\255\255\047\000\255\255\047\000\ + \047\000\047\000\047\000\047\000\047\000\047\000\047\000\047\000\ + \047\000\047\000\047\000\047\000\047\000\047\000\047\000\047\000\ + \047\000\047\000\047\000\047\000\047\000\047\000\047\000\047\000\ + \047\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\ + \048\000\048\000\048\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\048\000\048\000\048\000\048\000\048\000\048\000\ + \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\ + \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\ + \048\000\048\000\048\000\048\000\255\255\255\255\255\255\255\255\ + \048\000\255\255\048\000\048\000\048\000\048\000\048\000\048\000\ + \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\ + \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\ + \048\000\048\000\048\000\048\000\049\000\049\000\049\000\049\000\ + \049\000\049\000\049\000\049\000\049\000\049\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\049\000\049\000\049\000\ + \049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\ + \049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\ + \049\000\049\000\049\000\049\000\049\000\049\000\049\000\255\255\ + \255\255\255\255\255\255\049\000\255\255\049\000\049\000\049\000\ + \049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\ + \049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\ + \049\000\049\000\049\000\049\000\049\000\049\000\049\000\050\000\ + \050\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\ + \050\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \050\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\ + \050\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\ + \050\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\ + \050\000\050\000\255\255\255\255\255\255\255\255\050\000\255\255\ + \050\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\ + \050\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\ + \050\000\050\000\050\000\050\000\050\000\050\000\050\000\050\000\ + \050\000\050\000\051\000\051\000\051\000\051\000\051\000\051\000\ + \051\000\051\000\051\000\051\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\051\000\051\000\051\000\051\000\051\000\ + \051\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\ + \051\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\ + \051\000\051\000\051\000\051\000\051\000\255\255\255\255\255\255\ + \255\255\051\000\255\255\051\000\051\000\051\000\051\000\051\000\ + \051\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\ + \051\000\051\000\051\000\051\000\051\000\051\000\051\000\051\000\ + \051\000\051\000\051\000\051\000\051\000\052\000\052\000\052\000\ + \052\000\052\000\052\000\052\000\052\000\052\000\052\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\052\000\052\000\ + \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ + \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ + \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ + \255\255\255\255\255\255\255\255\052\000\255\255\052\000\052\000\ + \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ + \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ + \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\ + \053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\ + \053\000\053\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\053\000\053\000\053\000\053\000\053\000\053\000\053\000\ + \053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\ + \053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\ + \053\000\053\000\053\000\255\255\255\255\255\255\255\255\053\000\ + \255\255\053\000\053\000\053\000\053\000\053\000\053\000\053\000\ + \053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\ + \053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\ + \053\000\053\000\053\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\255\255\255\255\ + \255\255\255\255\054\000\255\255\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\ + \054\000\054\000\054\000\054\000\054\000\054\000\055\000\055\000\ + \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\055\000\ + \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ + \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ + \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ + \055\000\255\255\255\255\255\255\255\255\055\000\255\255\055\000\ + \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ + \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ + \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\ + \055\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\ + \056\000\056\000\056\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\056\000\056\000\056\000\056\000\056\000\056\000\ + \056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\ + \056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\ + \056\000\056\000\056\000\056\000\255\255\255\255\255\255\255\255\ + \056\000\255\255\056\000\056\000\056\000\056\000\056\000\056\000\ + \056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\ + \056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\ + \056\000\056\000\056\000\056\000\057\000\057\000\057\000\057\000\ + \057\000\057\000\057\000\057\000\057\000\057\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\057\000\057\000\057\000\ + \057\000\057\000\057\000\057\000\057\000\057\000\057\000\057\000\ + \057\000\057\000\057\000\057\000\057\000\057\000\057\000\057\000\ + \057\000\057\000\057\000\057\000\057\000\057\000\057\000\255\255\ + \255\255\255\255\255\255\057\000\255\255\057\000\057\000\057\000\ + \057\000\057\000\057\000\057\000\057\000\057\000\057\000\057\000\ + \057\000\057\000\057\000\057\000\057\000\057\000\057\000\057\000\ + \057\000\057\000\057\000\057\000\057\000\057\000\057\000\058\000\ + \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ + \058\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ + \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ + \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ + \058\000\058\000\255\255\255\255\255\255\255\255\058\000\255\255\ + \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ + \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ + \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ + \058\000\058\000\059\000\059\000\059\000\059\000\059\000\059\000\ + \059\000\059\000\059\000\059\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\059\000\059\000\059\000\059\000\059\000\ + \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ + \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ + \059\000\059\000\059\000\059\000\059\000\255\255\255\255\255\255\ + \255\255\059\000\255\255\059\000\059\000\059\000\059\000\059\000\ + \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ + \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ + \059\000\059\000\059\000\059\000\059\000\060\000\060\000\060\000\ + \060\000\060\000\060\000\060\000\060\000\060\000\060\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\060\000\060\000\ + \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ + \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ + \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ + \255\255\255\255\255\255\255\255\060\000\255\255\060\000\060\000\ + \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ + \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ + \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\ + \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\ + \061\000\061\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\061\000\061\000\061\000\061\000\061\000\061\000\061\000\ + \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\ + \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\ + \061\000\061\000\061\000\255\255\255\255\255\255\255\255\061\000\ + \255\255\061\000\061\000\061\000\061\000\061\000\061\000\061\000\ + \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\ + \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\ + \061\000\061\000\061\000\062\000\062\000\062\000\062\000\062\000\ + \062\000\062\000\062\000\062\000\062\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\062\000\062\000\062\000\062\000\ + \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\ + \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\ + \062\000\062\000\062\000\062\000\062\000\062\000\255\255\255\255\ + \255\255\255\255\062\000\255\255\062\000\062\000\062\000\062\000\ + \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\ + \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\ + \062\000\062\000\062\000\062\000\062\000\062\000\063\000\063\000\ + \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\063\000\ + \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\ + \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\ + \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\ + \063\000\255\255\255\255\255\255\255\255\063\000\255\255\063\000\ + \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\ + \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\ + \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\ + \063\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ + \064\000\064\000\064\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\064\000\064\000\064\000\064\000\064\000\064\000\ + \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ + \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ + \064\000\064\000\064\000\064\000\255\255\255\255\255\255\255\255\ + \064\000\255\255\064\000\064\000\064\000\064\000\064\000\064\000\ + \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ + \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\ + \064\000\064\000\064\000\064\000\065\000\065\000\065\000\065\000\ + \065\000\065\000\065\000\065\000\065\000\065\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\065\000\065\000\065\000\ + \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ + \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ + \065\000\065\000\065\000\065\000\065\000\065\000\065\000\255\255\ + \255\255\255\255\255\255\065\000\255\255\065\000\065\000\065\000\ + \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ + \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\ + \065\000\065\000\065\000\065\000\065\000\065\000\065\000\066\000\ + \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ + \066\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ + \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ + \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ + \066\000\066\000\255\255\255\255\255\255\255\255\066\000\255\255\ + \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ + \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ + \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\ + \066\000\066\000\067\000\067\000\067\000\067\000\067\000\067\000\ + \067\000\067\000\067\000\067\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\067\000\067\000\067\000\067\000\067\000\ + \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ + \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ + \067\000\067\000\067\000\067\000\067\000\255\255\255\255\255\255\ + \255\255\067\000\255\255\067\000\067\000\067\000\067\000\067\000\ + \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ + \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\ + \067\000\067\000\067\000\067\000\067\000\068\000\068\000\068\000\ + \068\000\068\000\068\000\068\000\068\000\068\000\068\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\068\000\068\000\ + \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ + \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ + \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ + \255\255\255\255\255\255\255\255\068\000\255\255\068\000\068\000\ + \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ + \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ + \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\ + \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ + \069\000\069\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ + \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ + \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ + \069\000\069\000\069\000\255\255\255\255\255\255\255\255\069\000\ + \255\255\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ + \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ + \069\000\069\000\069\000\069\000\069\000\069\000\069\000\069\000\ + \069\000\069\000\069\000\070\000\070\000\070\000\070\000\070\000\ + \070\000\070\000\070\000\070\000\070\000\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\070\000\070\000\070\000\070\000\ + \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ + \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ + \070\000\070\000\070\000\070\000\070\000\070\000\255\255\255\255\ + \255\255\255\255\070\000\255\255\070\000\070\000\070\000\070\000\ + \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ + \070\000\070\000\070\000\070\000\070\000\070\000\070\000\070\000\ + \070\000\070\000\070\000\070\000\070\000\070\000\071\000\071\000\ + \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\071\000\ + \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ + \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ + \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ + \071\000\255\255\255\255\255\255\255\255\071\000\255\255\071\000\ + \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ + \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ + \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\ + \071\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\ + \072\000\072\000\072\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\072\000\072\000\072\000\072\000\072\000\072\000\ + \072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\ + \072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\ + \072\000\072\000\072\000\072\000\255\255\255\255\255\255\255\255\ + \072\000\255\255\072\000\072\000\072\000\072\000\072\000\072\000\ + \072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\ + \072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\ + \072\000\072\000\072\000\072\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255"; + Lexing.lex_base_code = + ""; + Lexing.lex_backtrk_code = + ""; + Lexing.lex_default_code = + ""; + Lexing.lex_trans_code = + ""; + Lexing.lex_check_code = + ""; + Lexing.lex_code = + ""; +} + +let rec main lexbuf = + __ocaml_lex_main_rec lexbuf 0 +and __ocaml_lex_main_rec lexbuf __ocaml_lex_state = + match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with + | 0 -> +# 25 "lexerProcessus.mll" + ( main lexbuf ) +# 1169 "lexerProcessus.ml" + + | 1 -> +# 26 "lexerProcessus.mll" + ( (main lexbuf) ) +# 1174 "lexerProcessus.ml" + + | 2 -> +# 27 "lexerProcessus.mll" + ( PROCESS ) +# 1179 "lexerProcessus.ml" + + | 3 -> +# 28 "lexerProcessus.mll" + ( ACTIVITY ) +# 1184 "lexerProcessus.ml" + + | 4 -> +# 29 "lexerProcessus.mll" + ( STARTS ) +# 1189 "lexerProcessus.ml" + + | 5 -> +# 30 "lexerProcessus.mll" + ( FINISHES ) +# 1194 "lexerProcessus.ml" + + | 6 -> +# 31 "lexerProcessus.mll" + ( IF ) +# 1199 "lexerProcessus.ml" + + | 7 -> +# 32 "lexerProcessus.mll" + ( STARTED ) +# 1204 "lexerProcessus.ml" + + | 8 -> +# 33 "lexerProcessus.mll" + ( FINISHED ) +# 1209 "lexerProcessus.ml" + + | 9 -> +# 34 "lexerProcessus.mll" + ( RESOURCE ) +# 1214 "lexerProcessus.ml" + + | 10 -> +# 35 "lexerProcessus.mll" + ( AMOUNT ) +# 1219 "lexerProcessus.ml" + + | 11 -> +# 36 "lexerProcessus.mll" + ( REQUIRES ) +# 1224 "lexerProcessus.ml" + + | 12 -> +# 37 "lexerProcessus.mll" + ( LEFT_BRACE ) +# 1229 "lexerProcessus.ml" + + | 13 -> +# 38 "lexerProcessus.mll" + ( RIGHT_BRACE ) +# 1234 "lexerProcessus.ml" + + | 14 -> +let +# 39 "lexerProcessus.mll" + texte +# 1240 "lexerProcessus.ml" += Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in +# 39 "lexerProcessus.mll" + ( (NUMBER (int_of_string texte)) ) +# 1244 "lexerProcessus.ml" + + | 15 -> +let +# 40 "lexerProcessus.mll" + texte +# 1250 "lexerProcessus.ml" += Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in +# 40 "lexerProcessus.mll" + ( (IDENTIFIER texte) ) +# 1254 "lexerProcessus.ml" + + | 16 -> +# 41 "lexerProcessus.mll" + ( END ) +# 1259 "lexerProcessus.ml" + + | 17 -> +let +# 42 "lexerProcessus.mll" + texte +# 1265 "lexerProcessus.ml" += Lexing.sub_lexeme_char lexbuf lexbuf.Lexing.lex_start_pos in +# 42 "lexerProcessus.mll" + ( (print_string "Erreur lexicale : ");(print_char texte);(print_newline ()); (main lexbuf) ) +# 1269 "lexerProcessus.ml" + + | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; + __ocaml_lex_main_rec lexbuf __ocaml_lex_state + +;; + +# 44 "lexerProcessus.mll" + + + +# 1280 "lexerProcessus.ml" diff --git a/TP8-9/process-analysis/lexerProcessus.mll b/TP8-9/process-analysis/lexerProcessus.mll new file mode 100755 index 0000000..e241443 --- /dev/null +++ b/TP8-9/process-analysis/lexerProcessus.mll @@ -0,0 +1,46 @@ +{ + +(* Partie recopiée dans le fichier CaML généré. *) +(* Ouverture de modules exploités dans les actions *) +(* Déclarations de types, de constantes, de fonctions, d'exceptions exploités dans les actions *) + + open ParserProcessus + exception LexicalError + +} + +(* Déclaration d'expressions régulières exploitées par la suite *) +let chiffre = ['0' - '9'] +let minuscule = ['a' - 'z'] +let majuscule = ['A' - 'Z'] +let lettre = minuscule | majuscule +let lettre_chiffre = lettre | chiffre | '_' +let commentaire = + (* Commentaire bloc à la C/C++/C#/Java/etc *) + ("/*" [^ '*']* '*'* ([^ '*' '/'] [^ '*']* '*'*)* '/') + (* Commentaire fin de ligne à la C/C++/C#/Java/etc *) + | "//" [^'\n']* + +rule main = parse + | ['\n' '\t' ' ']+ { main lexbuf } + | commentaire { (main lexbuf) } + | "process" { PROCESS } + | "activity" { ACTIVITY } + | "starts" { STARTS } + | "finishes" { FINISHES } + | "if" { IF } + | "started" { STARTED } + | "finished" { FINISHED } + | "resource" { RESOURCE } + | "amount" { AMOUNT } + | "requires" { REQUIRES } + | "{" { LEFT_BRACE } + | "}" { RIGHT_BRACE } + | chiffre+ as texte { (NUMBER (int_of_string texte)) } + | ('_' | lettre) lettre_chiffre* as texte { (IDENTIFIER texte) } + | eof { END } + | _ as texte { (print_string "Erreur lexicale : ");(print_char texte);(print_newline ()); (main lexbuf) } + +{ + +} diff --git a/TP8-9/process-analysis/mainProcessus.ml b/TP8-9/process-analysis/mainProcessus.ml new file mode 100755 index 0000000..6d9b005 --- /dev/null +++ b/TP8-9/process-analysis/mainProcessus.ml @@ -0,0 +1,42 @@ +open ParserProcessus + +(* Fonction d'affichage des unités lexicales et des données qu'elles contiennent *) +let printToken t = + (print_endline + ("token: " ^ (match t with + | PROCESS -> "process" + | IDENTIFIER (texte) -> ("identifier(" ^ texte ^ ")") + | ACTIVITY -> "activity" + | STARTS -> "starts" + | FINISHES -> "finishes" + | IF -> "if" + | STARTED -> "started" + | FINISHED -> "finished" + | RESOURCE -> "resource" + | REQUIRES -> "requires" + | AMOUNT -> "amount" + | LEFT_BRACE -> "{" + | RIGHT_BRACE -> "}" + | NUMBER (texte) -> ("number(" ^ (string_of_int texte) ^ ")") + | END -> "EOF" + )));; + +(* Analyse lexicale du fichier passé en paramètre de la ligne de commande *) +if (Array.length Sys.argv > 1) +then + let lexbuf = (Lexing.from_channel (open_in Sys.argv.(1))) in + let token = ref (LexerProcessus.main lexbuf) in + while ((!token) != END) do + (printToken (!token)); + (token := (LexerProcessus.main lexbuf)) + done +else + (print_endline "MainMuProcessus fichier");; + +(* Analyse lexicale, syntaxique et sémantique du fichier passé en paramètre de la ligne de commande *) +if (Array.length Sys.argv > 1) +then + let lexbuf = (Lexing.from_channel (open_in Sys.argv.(1))) in + (ParserProcessus.fichier LexerProcessus.main lexbuf) +else + (print_endline "MainProcessus fichier");; diff --git a/TP8-9/process-analysis/parserProcessus.ml b/TP8-9/process-analysis/parserProcessus.ml new file mode 100755 index 0000000..b7cb145 --- /dev/null +++ b/TP8-9/process-analysis/parserProcessus.ml @@ -0,0 +1,945 @@ + +module MenhirBasics = struct + + exception Error + + type token = + | STARTS + | STARTED + | RIGHT_BRACE + | RESOURCE + | REQUIRES + | PROCESS + | NUMBER of ( +# 15 "parserProcessus.mly" + (int) +# 17 "parserProcessus.ml" + ) + | LEFT_BRACE + | IF + | IDENTIFIER of ( +# 16 "parserProcessus.mly" + (string) +# 24 "parserProcessus.ml" + ) + | FINISHES + | FINISHED + | END + | AMOUNT + | ACTIVITY + +end + +include MenhirBasics + +let _eRR = + MenhirBasics.Error + +type _menhir_env = { + _menhir_lexer: Lexing.lexbuf -> token; + _menhir_lexbuf: Lexing.lexbuf; + _menhir_token: token; + mutable _menhir_error: bool +} + +and _menhir_state = + | MenhirState30 + | MenhirState21 + | MenhirState19 + | MenhirState17 + | MenhirState14 + | MenhirState9 + | MenhirState3 + +# 1 "parserProcessus.mly" + + +(* Partie recopiee dans le fichier CaML genere. *) +(* Ouverture de modules exploites dans les actions *) +(* Declarations de types, de constantes, de fonctions, d'exceptions exploites dans les actions *) + + +# 63 "parserProcessus.ml" + +let rec _menhir_goto_etat : _menhir_env -> 'ttv_tail -> 'tv_etat -> 'ttv_return = + fun _menhir_env _menhir_stack _v -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : (('freshtv155 * _menhir_state * 'tv_action)) * ( +# 16 "parserProcessus.mly" + (string) +# 71 "parserProcessus.ml" + )) = Obj.magic _menhir_stack in + let (_v : 'tv_etat) = _v in + ((let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : (('freshtv153 * _menhir_state * 'tv_action)) * ( +# 16 "parserProcessus.mly" + (string) +# 78 "parserProcessus.ml" + )) = Obj.magic _menhir_stack in + let ((_4 : 'tv_etat) : 'tv_etat) = _v in + ((let ((_menhir_stack, _menhir_s, (_1 : 'tv_action)), (_3 : ( +# 16 "parserProcessus.mly" + (string) +# 84 "parserProcessus.ml" + ))) = _menhir_stack in + let _2 = () in + let _v : 'tv_contrainte = +# 49 "parserProcessus.mly" + ( (print_endline "contrainte : action if IDENTIFIER etat") ) +# 90 "parserProcessus.ml" + in + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv151) = _menhir_stack in + let (_menhir_s : _menhir_state) = _menhir_s in + let (_v : 'tv_contrainte) = _v in + ((let _menhir_stack = (_menhir_stack, _menhir_s, _v) in + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv149 * _menhir_state * 'tv_contrainte) = Obj.magic _menhir_stack in + ((assert (not _menhir_env._menhir_error); + let _tok = _menhir_env._menhir_token in + match _tok with + | FINISHES -> + _menhir_run18 _menhir_env (Obj.magic _menhir_stack) MenhirState21 + | LEFT_BRACE -> + _menhir_run14 _menhir_env (Obj.magic _menhir_stack) MenhirState21 + | REQUIRES -> + _menhir_run11 _menhir_env (Obj.magic _menhir_stack) MenhirState21 + | STARTS -> + _menhir_run10 _menhir_env (Obj.magic _menhir_stack) MenhirState21 + | ACTIVITY | RESOURCE | RIGHT_BRACE -> + _menhir_reduce5 _menhir_env (Obj.magic _menhir_stack) MenhirState21 + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) MenhirState21) : 'freshtv150)) : 'freshtv152)) : 'freshtv154)) : 'freshtv156) + +and _menhir_fail : unit -> 'a = + fun () -> + Printf.fprintf stderr "Internal failure -- please contact the parser generator's developers.\n%!"; + assert false + +and _menhir_goto_contraintes : _menhir_env -> 'ttv_tail -> _menhir_state -> 'tv_contraintes -> 'ttv_return = + fun _menhir_env _menhir_stack _menhir_s _v -> + match _menhir_s with + | MenhirState19 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv129 * _menhir_state * 'tv_requires) = Obj.magic _menhir_stack in + let (_menhir_s : _menhir_state) = _menhir_s in + let (_v : 'tv_contraintes) = _v in + ((let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv127 * _menhir_state * 'tv_requires) = Obj.magic _menhir_stack in + let (_ : _menhir_state) = _menhir_s in + let ((_2 : 'tv_contraintes) : 'tv_contraintes) = _v in + ((let (_menhir_stack, _menhir_s, (_1 : 'tv_requires)) = _menhir_stack in + let _v : 'tv_contraintes = +# 43 "parserProcessus.mly" + ( (print_endline "contraintes : requires contraintes") ) +# 138 "parserProcessus.ml" + in + _menhir_goto_contraintes _menhir_env _menhir_stack _menhir_s _v) : 'freshtv128)) : 'freshtv130) + | MenhirState21 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv133 * _menhir_state * 'tv_contrainte) = Obj.magic _menhir_stack in + let (_menhir_s : _menhir_state) = _menhir_s in + let (_v : 'tv_contraintes) = _v in + ((let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv131 * _menhir_state * 'tv_contrainte) = Obj.magic _menhir_stack in + let (_ : _menhir_state) = _menhir_s in + let ((_2 : 'tv_contraintes) : 'tv_contraintes) = _v in + ((let (_menhir_stack, _menhir_s, (_1 : 'tv_contrainte)) = _menhir_stack in + let _v : 'tv_contraintes = +# 44 "parserProcessus.mly" + ( (print_endline "contraintes : contrainte contraintes") ) +# 154 "parserProcessus.ml" + in + _menhir_goto_contraintes _menhir_env _menhir_stack _menhir_s _v) : 'freshtv132)) : 'freshtv134) + | MenhirState17 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : (('freshtv137 * _menhir_state) * _menhir_state * 'tv_elements)) = Obj.magic _menhir_stack in + let (_menhir_s : _menhir_state) = _menhir_s in + let (_v : 'tv_contraintes) = _v in + ((let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : (('freshtv135 * _menhir_state) * _menhir_state * 'tv_elements)) = Obj.magic _menhir_stack in + let (_ : _menhir_state) = _menhir_s in + let ((_4 : 'tv_contraintes) : 'tv_contraintes) = _v in + ((let ((_menhir_stack, _menhir_s), _, (_2 : 'tv_elements)) = _menhir_stack in + let _3 = () in + let _1 = () in + let _v : 'tv_contraintes = +# 45 "parserProcessus.mly" + ( (print_endline "contraintes : { elements } contraintes") ) +# 172 "parserProcessus.ml" + in + _menhir_goto_contraintes _menhir_env _menhir_stack _menhir_s _v) : 'freshtv136)) : 'freshtv138) + | MenhirState9 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ('freshtv147 * _menhir_state) * ( +# 16 "parserProcessus.mly" + (string) +# 180 "parserProcessus.ml" + )) = Obj.magic _menhir_stack in + let (_menhir_s : _menhir_state) = _menhir_s in + let (_v : 'tv_contraintes) = _v in + ((let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ('freshtv145 * _menhir_state) * ( +# 16 "parserProcessus.mly" + (string) +# 188 "parserProcessus.ml" + )) = Obj.magic _menhir_stack in + let (_ : _menhir_state) = _menhir_s in + let ((_3 : 'tv_contraintes) : 'tv_contraintes) = _v in + ((let ((_menhir_stack, _menhir_s), (_2 : ( +# 16 "parserProcessus.mly" + (string) +# 195 "parserProcessus.ml" + ))) = _menhir_stack in + let _1 = () in + let _v : 'tv_activite = +# 40 "parserProcessus.mly" + ( (print_endline "activite : activity IDENTIFIER contraintes") ) +# 201 "parserProcessus.ml" + in + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv143) = _menhir_stack in + let (_menhir_s : _menhir_state) = _menhir_s in + let (_v : 'tv_activite) = _v in + ((let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv141) = Obj.magic _menhir_stack in + let (_menhir_s : _menhir_state) = _menhir_s in + let (_v : 'tv_activite) = _v in + ((let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv139) = Obj.magic _menhir_stack in + let (_menhir_s : _menhir_state) = _menhir_s in + let ((_1 : 'tv_activite) : 'tv_activite) = _v in + ((let _v : 'tv_element = +# 35 "parserProcessus.mly" + ( (print_endline "element : activite") ) +# 218 "parserProcessus.ml" + in + _menhir_goto_element _menhir_env _menhir_stack _menhir_s _v) : 'freshtv140)) : 'freshtv142)) : 'freshtv144)) : 'freshtv146)) : 'freshtv148) + | _ -> + _menhir_fail () + +and _menhir_goto_action : _menhir_env -> 'ttv_tail -> _menhir_state -> 'tv_action -> 'ttv_return = + fun _menhir_env _menhir_stack _menhir_s _v -> + let _menhir_stack = (_menhir_stack, _menhir_s, _v) in + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv125 * _menhir_state * 'tv_action) = Obj.magic _menhir_stack in + ((assert (not _menhir_env._menhir_error); + let _tok = _menhir_env._menhir_token in + match _tok with + | IF -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv121 * _menhir_state * 'tv_action) = Obj.magic _menhir_stack in + ((let _menhir_env = _menhir_discard _menhir_env in + let _tok = _menhir_env._menhir_token in + match _tok with + | IDENTIFIER _v -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ('freshtv117 * _menhir_state * 'tv_action)) = Obj.magic _menhir_stack in + let (_v : ( +# 16 "parserProcessus.mly" + (string) +# 244 "parserProcessus.ml" + )) = _v in + ((let _menhir_stack = (_menhir_stack, _v) in + let _menhir_env = _menhir_discard _menhir_env in + let _tok = _menhir_env._menhir_token in + match _tok with + | FINISHED -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv109) = Obj.magic _menhir_stack in + ((let _menhir_env = _menhir_discard _menhir_env in + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv107) = Obj.magic _menhir_stack in + ((let _1 = () in + let _v : 'tv_etat = +# 55 "parserProcessus.mly" + ( (print_endline "etat : FINISHED") ) +# 260 "parserProcessus.ml" + in + _menhir_goto_etat _menhir_env _menhir_stack _v) : 'freshtv108)) : 'freshtv110) + | STARTED -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv113) = Obj.magic _menhir_stack in + ((let _menhir_env = _menhir_discard _menhir_env in + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv111) = Obj.magic _menhir_stack in + ((let _1 = () in + let _v : 'tv_etat = +# 54 "parserProcessus.mly" + ( (print_endline "etat : STARTED") ) +# 273 "parserProcessus.ml" + in + _menhir_goto_etat _menhir_env _menhir_stack _v) : 'freshtv112)) : 'freshtv114) + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : (('freshtv115 * _menhir_state * 'tv_action)) * ( +# 16 "parserProcessus.mly" + (string) +# 283 "parserProcessus.ml" + )) = Obj.magic _menhir_stack in + ((let ((_menhir_stack, _menhir_s, _), _) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv116)) : 'freshtv118) + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ('freshtv119 * _menhir_state * 'tv_action)) = Obj.magic _menhir_stack in + ((let (_menhir_stack, _menhir_s, _) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv120)) : 'freshtv122) + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv123 * _menhir_state * 'tv_action) = Obj.magic _menhir_stack in + ((let (_menhir_stack, _menhir_s, _) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv124)) : 'freshtv126) + +and _menhir_goto_elements : _menhir_env -> 'ttv_tail -> _menhir_state -> 'tv_elements -> 'ttv_return = + fun _menhir_env _menhir_stack _menhir_s _v -> + let _menhir_stack = (_menhir_stack, _menhir_s, _v) in + match _menhir_s with + | MenhirState14 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ('freshtv77 * _menhir_state) * _menhir_state * 'tv_elements) = Obj.magic _menhir_stack in + ((assert (not _menhir_env._menhir_error); + let _tok = _menhir_env._menhir_token in + match _tok with + | RIGHT_BRACE -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ('freshtv73 * _menhir_state) * _menhir_state * 'tv_elements) = Obj.magic _menhir_stack in + ((let _menhir_env = _menhir_discard _menhir_env in + let _tok = _menhir_env._menhir_token in + match _tok with + | FINISHES -> + _menhir_run18 _menhir_env (Obj.magic _menhir_stack) MenhirState17 + | LEFT_BRACE -> + _menhir_run14 _menhir_env (Obj.magic _menhir_stack) MenhirState17 + | REQUIRES -> + _menhir_run11 _menhir_env (Obj.magic _menhir_stack) MenhirState17 + | STARTS -> + _menhir_run10 _menhir_env (Obj.magic _menhir_stack) MenhirState17 + | ACTIVITY | RESOURCE | RIGHT_BRACE -> + _menhir_reduce5 _menhir_env (Obj.magic _menhir_stack) MenhirState17 + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) MenhirState17) : 'freshtv74) + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ('freshtv75 * _menhir_state) * _menhir_state * 'tv_elements) = Obj.magic _menhir_stack in + ((let (_menhir_stack, _menhir_s, _) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv76)) : 'freshtv78) + | MenhirState30 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ('freshtv81 * _menhir_state * 'tv_element) * _menhir_state * 'tv_elements) = Obj.magic _menhir_stack in + ((let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ('freshtv79 * _menhir_state * 'tv_element) * _menhir_state * 'tv_elements) = Obj.magic _menhir_stack in + ((let ((_menhir_stack, _menhir_s, (_1 : 'tv_element)), _, (_2 : 'tv_elements)) = _menhir_stack in + let _v : 'tv_elements = +# 33 "parserProcessus.mly" + ( (print_endline "elements : element elements") ) +# 348 "parserProcessus.ml" + in + _menhir_goto_elements _menhir_env _menhir_stack _menhir_s _v) : 'freshtv80)) : 'freshtv82) + | MenhirState3 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ((('freshtv105) * ( +# 16 "parserProcessus.mly" + (string) +# 356 "parserProcessus.ml" + ))) * _menhir_state * 'tv_elements) = Obj.magic _menhir_stack in + ((assert (not _menhir_env._menhir_error); + let _tok = _menhir_env._menhir_token in + match _tok with + | RIGHT_BRACE -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ((('freshtv101) * ( +# 16 "parserProcessus.mly" + (string) +# 366 "parserProcessus.ml" + ))) * _menhir_state * 'tv_elements) = Obj.magic _menhir_stack in + ((let _menhir_env = _menhir_discard _menhir_env in + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ((('freshtv99) * ( +# 16 "parserProcessus.mly" + (string) +# 373 "parserProcessus.ml" + ))) * _menhir_state * 'tv_elements) = Obj.magic _menhir_stack in + ((let ((_menhir_stack, (_2 : ( +# 16 "parserProcessus.mly" + (string) +# 378 "parserProcessus.ml" + ))), _, (_4 : 'tv_elements)) = _menhir_stack in + let _5 = () in + let _3 = () in + let _1 = () in + let _v : 'tv_processus = +# 30 "parserProcessus.mly" + ( (print_endline "processus : process IDENTIFIER { elements }") ) +# 386 "parserProcessus.ml" + in + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv97) = _menhir_stack in + let (_v : 'tv_processus) = _v in + ((let _menhir_stack = (_menhir_stack, _v) in + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv95 * 'tv_processus) = Obj.magic _menhir_stack in + ((assert (not _menhir_env._menhir_error); + let _tok = _menhir_env._menhir_token in + match _tok with + | END -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv91 * 'tv_processus) = Obj.magic _menhir_stack in + ((let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv89 * 'tv_processus) = Obj.magic _menhir_stack in + ((let (_menhir_stack, (_1 : 'tv_processus)) = _menhir_stack in + let _2 = () in + let _v : ( +# 21 "parserProcessus.mly" + (unit) +# 407 "parserProcessus.ml" + ) = +# 28 "parserProcessus.mly" + ( (print_endline "fichier : processus END") ) +# 411 "parserProcessus.ml" + in + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv87) = _menhir_stack in + let (_v : ( +# 21 "parserProcessus.mly" + (unit) +# 418 "parserProcessus.ml" + )) = _v in + ((let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv85) = Obj.magic _menhir_stack in + let (_v : ( +# 21 "parserProcessus.mly" + (unit) +# 425 "parserProcessus.ml" + )) = _v in + ((let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv83) = Obj.magic _menhir_stack in + let ((_1 : ( +# 21 "parserProcessus.mly" + (unit) +# 432 "parserProcessus.ml" + )) : ( +# 21 "parserProcessus.mly" + (unit) +# 436 "parserProcessus.ml" + )) = _v in + (Obj.magic _1 : 'freshtv84)) : 'freshtv86)) : 'freshtv88)) : 'freshtv90)) : 'freshtv92) + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv93 * 'tv_processus) = Obj.magic _menhir_stack in + (raise _eRR : 'freshtv94)) : 'freshtv96)) : 'freshtv98)) : 'freshtv100)) : 'freshtv102) + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ((('freshtv103) * ( +# 16 "parserProcessus.mly" + (string) +# 452 "parserProcessus.ml" + ))) * _menhir_state * 'tv_elements) = Obj.magic _menhir_stack in + ((let (_menhir_stack, _menhir_s, _) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv104)) : 'freshtv106) + | _ -> + _menhir_fail () + +and _menhir_goto_element : _menhir_env -> 'ttv_tail -> _menhir_state -> 'tv_element -> 'ttv_return = + fun _menhir_env _menhir_stack _menhir_s _v -> + let _menhir_stack = (_menhir_stack, _menhir_s, _v) in + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv71 * _menhir_state * 'tv_element) = Obj.magic _menhir_stack in + ((assert (not _menhir_env._menhir_error); + let _tok = _menhir_env._menhir_token in + match _tok with + | ACTIVITY -> + _menhir_run8 _menhir_env (Obj.magic _menhir_stack) MenhirState30 + | RESOURCE -> + _menhir_run4 _menhir_env (Obj.magic _menhir_stack) MenhirState30 + | RIGHT_BRACE -> + _menhir_reduce11 _menhir_env (Obj.magic _menhir_stack) MenhirState30 + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) MenhirState30) : 'freshtv72) + +and _menhir_reduce5 : _menhir_env -> 'ttv_tail -> _menhir_state -> 'ttv_return = + fun _menhir_env _menhir_stack _menhir_s -> + let _v : 'tv_contraintes = +# 42 "parserProcessus.mly" + ( (print_endline "contraintes : /* Lambda, mot vide */") ) +# 483 "parserProcessus.ml" + in + _menhir_goto_contraintes _menhir_env _menhir_stack _menhir_s _v + +and _menhir_run10 : _menhir_env -> 'ttv_tail -> _menhir_state -> 'ttv_return = + fun _menhir_env _menhir_stack _menhir_s -> + let _menhir_env = _menhir_discard _menhir_env in + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv69) = Obj.magic _menhir_stack in + let (_menhir_s : _menhir_state) = _menhir_s in + ((let _1 = () in + let _v : 'tv_action = +# 51 "parserProcessus.mly" + ( (print_endline "action : STARTS") ) +# 497 "parserProcessus.ml" + in + _menhir_goto_action _menhir_env _menhir_stack _menhir_s _v) : 'freshtv70) + +and _menhir_run11 : _menhir_env -> 'ttv_tail -> _menhir_state -> 'ttv_return = + fun _menhir_env _menhir_stack _menhir_s -> + let _menhir_stack = (_menhir_stack, _menhir_s) in + let _menhir_env = _menhir_discard _menhir_env in + let _tok = _menhir_env._menhir_token in + match _tok with + | NUMBER _v -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv65 * _menhir_state) = Obj.magic _menhir_stack in + let (_v : ( +# 15 "parserProcessus.mly" + (int) +# 513 "parserProcessus.ml" + )) = _v in + ((let _menhir_stack = (_menhir_stack, _v) in + let _menhir_env = _menhir_discard _menhir_env in + let _tok = _menhir_env._menhir_token in + match _tok with + | IDENTIFIER _v -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ('freshtv61 * _menhir_state) * ( +# 15 "parserProcessus.mly" + (int) +# 524 "parserProcessus.ml" + )) = Obj.magic _menhir_stack in + let (_v : ( +# 16 "parserProcessus.mly" + (string) +# 529 "parserProcessus.ml" + )) = _v in + ((let _menhir_env = _menhir_discard _menhir_env in + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ('freshtv59 * _menhir_state) * ( +# 15 "parserProcessus.mly" + (int) +# 536 "parserProcessus.ml" + )) = Obj.magic _menhir_stack in + let ((_3 : ( +# 16 "parserProcessus.mly" + (string) +# 541 "parserProcessus.ml" + )) : ( +# 16 "parserProcessus.mly" + (string) +# 545 "parserProcessus.ml" + )) = _v in + ((let ((_menhir_stack, _menhir_s), (_2 : ( +# 15 "parserProcessus.mly" + (int) +# 550 "parserProcessus.ml" + ))) = _menhir_stack in + let _1 = () in + let _v : 'tv_requires = +# 47 "parserProcessus.mly" + ( (print_endline "requires : requires NUMBER IDENTIFIER") ) +# 556 "parserProcessus.ml" + in + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv57) = _menhir_stack in + let (_menhir_s : _menhir_state) = _menhir_s in + let (_v : 'tv_requires) = _v in + ((let _menhir_stack = (_menhir_stack, _menhir_s, _v) in + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv55 * _menhir_state * 'tv_requires) = Obj.magic _menhir_stack in + ((assert (not _menhir_env._menhir_error); + let _tok = _menhir_env._menhir_token in + match _tok with + | FINISHES -> + _menhir_run18 _menhir_env (Obj.magic _menhir_stack) MenhirState19 + | LEFT_BRACE -> + _menhir_run14 _menhir_env (Obj.magic _menhir_stack) MenhirState19 + | REQUIRES -> + _menhir_run11 _menhir_env (Obj.magic _menhir_stack) MenhirState19 + | STARTS -> + _menhir_run10 _menhir_env (Obj.magic _menhir_stack) MenhirState19 + | ACTIVITY | RESOURCE | RIGHT_BRACE -> + _menhir_reduce5 _menhir_env (Obj.magic _menhir_stack) MenhirState19 + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) MenhirState19) : 'freshtv56)) : 'freshtv58)) : 'freshtv60)) : 'freshtv62) + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ('freshtv63 * _menhir_state) * ( +# 15 "parserProcessus.mly" + (int) +# 589 "parserProcessus.ml" + )) = Obj.magic _menhir_stack in + ((let ((_menhir_stack, _menhir_s), _) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv64)) : 'freshtv66) + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv67 * _menhir_state) = Obj.magic _menhir_stack in + ((let (_menhir_stack, _menhir_s) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv68) + +and _menhir_run14 : _menhir_env -> 'ttv_tail -> _menhir_state -> 'ttv_return = + fun _menhir_env _menhir_stack _menhir_s -> + let _menhir_stack = (_menhir_stack, _menhir_s) in + let _menhir_env = _menhir_discard _menhir_env in + let _tok = _menhir_env._menhir_token in + match _tok with + | ACTIVITY -> + _menhir_run8 _menhir_env (Obj.magic _menhir_stack) MenhirState14 + | RESOURCE -> + _menhir_run4 _menhir_env (Obj.magic _menhir_stack) MenhirState14 + | RIGHT_BRACE -> + _menhir_reduce11 _menhir_env (Obj.magic _menhir_stack) MenhirState14 + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) MenhirState14 + +and _menhir_run18 : _menhir_env -> 'ttv_tail -> _menhir_state -> 'ttv_return = + fun _menhir_env _menhir_stack _menhir_s -> + let _menhir_env = _menhir_discard _menhir_env in + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv53) = Obj.magic _menhir_stack in + let (_menhir_s : _menhir_state) = _menhir_s in + ((let _1 = () in + let _v : 'tv_action = +# 52 "parserProcessus.mly" + ( (print_endline "action : FINISHES") ) +# 628 "parserProcessus.ml" + in + _menhir_goto_action _menhir_env _menhir_stack _menhir_s _v) : 'freshtv54) + +and _menhir_errorcase : _menhir_env -> 'ttv_tail -> _menhir_state -> 'ttv_return = + fun _menhir_env _menhir_stack _menhir_s -> + match _menhir_s with + | MenhirState30 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv39 * _menhir_state * 'tv_element) = Obj.magic _menhir_stack in + ((let (_menhir_stack, _menhir_s, _) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv40) + | MenhirState21 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv41 * _menhir_state * 'tv_contrainte) = Obj.magic _menhir_stack in + ((let (_menhir_stack, _menhir_s, _) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv42) + | MenhirState19 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv43 * _menhir_state * 'tv_requires) = Obj.magic _menhir_stack in + ((let (_menhir_stack, _menhir_s, _) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv44) + | MenhirState17 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : (('freshtv45 * _menhir_state) * _menhir_state * 'tv_elements)) = Obj.magic _menhir_stack in + ((let (_menhir_stack, _menhir_s, _) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv46) + | MenhirState14 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv47 * _menhir_state) = Obj.magic _menhir_stack in + ((let (_menhir_stack, _menhir_s) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv48) + | MenhirState9 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ('freshtv49 * _menhir_state) * ( +# 16 "parserProcessus.mly" + (string) +# 665 "parserProcessus.ml" + )) = Obj.magic _menhir_stack in + ((let ((_menhir_stack, _menhir_s), _) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv50) + | MenhirState3 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : (('freshtv51) * ( +# 16 "parserProcessus.mly" + (string) +# 674 "parserProcessus.ml" + ))) = Obj.magic _menhir_stack in + (raise _eRR : 'freshtv52) + +and _menhir_reduce11 : _menhir_env -> 'ttv_tail -> _menhir_state -> 'ttv_return = + fun _menhir_env _menhir_stack _menhir_s -> + let _v : 'tv_elements = +# 32 "parserProcessus.mly" + ( (print_endline "elements : /* Lambda, mot vide */") ) +# 683 "parserProcessus.ml" + in + _menhir_goto_elements _menhir_env _menhir_stack _menhir_s _v + +and _menhir_run4 : _menhir_env -> 'ttv_tail -> _menhir_state -> 'ttv_return = + fun _menhir_env _menhir_stack _menhir_s -> + let _menhir_stack = (_menhir_stack, _menhir_s) in + let _menhir_env = _menhir_discard _menhir_env in + let _tok = _menhir_env._menhir_token in + match _tok with + | IDENTIFIER _v -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv35 * _menhir_state) = Obj.magic _menhir_stack in + let (_v : ( +# 16 "parserProcessus.mly" + (string) +# 699 "parserProcessus.ml" + )) = _v in + ((let _menhir_stack = (_menhir_stack, _v) in + let _menhir_env = _menhir_discard _menhir_env in + let _tok = _menhir_env._menhir_token in + match _tok with + | AMOUNT -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ('freshtv31 * _menhir_state) * ( +# 16 "parserProcessus.mly" + (string) +# 710 "parserProcessus.ml" + )) = Obj.magic _menhir_stack in + ((let _menhir_env = _menhir_discard _menhir_env in + let _tok = _menhir_env._menhir_token in + match _tok with + | NUMBER _v -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : (('freshtv27 * _menhir_state) * ( +# 16 "parserProcessus.mly" + (string) +# 720 "parserProcessus.ml" + ))) = Obj.magic _menhir_stack in + let (_v : ( +# 15 "parserProcessus.mly" + (int) +# 725 "parserProcessus.ml" + )) = _v in + ((let _menhir_env = _menhir_discard _menhir_env in + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : (('freshtv25 * _menhir_state) * ( +# 16 "parserProcessus.mly" + (string) +# 732 "parserProcessus.ml" + ))) = Obj.magic _menhir_stack in + let ((_4 : ( +# 15 "parserProcessus.mly" + (int) +# 737 "parserProcessus.ml" + )) : ( +# 15 "parserProcessus.mly" + (int) +# 741 "parserProcessus.ml" + )) = _v in + ((let ((_menhir_stack, _menhir_s), (_2 : ( +# 16 "parserProcessus.mly" + (string) +# 746 "parserProcessus.ml" + ))) = _menhir_stack in + let _3 = () in + let _1 = () in + let _v : 'tv_resource = +# 38 "parserProcessus.mly" + ( (print_endline "resource : resource IDENTIFIER amount NUMBER") ) +# 753 "parserProcessus.ml" + in + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv23) = _menhir_stack in + let (_menhir_s : _menhir_state) = _menhir_s in + let (_v : 'tv_resource) = _v in + ((let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv21) = Obj.magic _menhir_stack in + let (_menhir_s : _menhir_state) = _menhir_s in + let (_v : 'tv_resource) = _v in + ((let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv19) = Obj.magic _menhir_stack in + let (_menhir_s : _menhir_state) = _menhir_s in + let ((_1 : 'tv_resource) : 'tv_resource) = _v in + ((let _v : 'tv_element = +# 36 "parserProcessus.mly" + ( (print_endline "element : resource") ) +# 770 "parserProcessus.ml" + in + _menhir_goto_element _menhir_env _menhir_stack _menhir_s _v) : 'freshtv20)) : 'freshtv22)) : 'freshtv24)) : 'freshtv26)) : 'freshtv28) + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : (('freshtv29 * _menhir_state) * ( +# 16 "parserProcessus.mly" + (string) +# 780 "parserProcessus.ml" + ))) = Obj.magic _menhir_stack in + ((let ((_menhir_stack, _menhir_s), _) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv30)) : 'freshtv32) + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ('freshtv33 * _menhir_state) * ( +# 16 "parserProcessus.mly" + (string) +# 791 "parserProcessus.ml" + )) = Obj.magic _menhir_stack in + ((let ((_menhir_stack, _menhir_s), _) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv34)) : 'freshtv36) + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv37 * _menhir_state) = Obj.magic _menhir_stack in + ((let (_menhir_stack, _menhir_s) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv38) + +and _menhir_run8 : _menhir_env -> 'ttv_tail -> _menhir_state -> 'ttv_return = + fun _menhir_env _menhir_stack _menhir_s -> + let _menhir_stack = (_menhir_stack, _menhir_s) in + let _menhir_env = _menhir_discard _menhir_env in + let _tok = _menhir_env._menhir_token in + match _tok with + | IDENTIFIER _v -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv15 * _menhir_state) = Obj.magic _menhir_stack in + let (_v : ( +# 16 "parserProcessus.mly" + (string) +# 815 "parserProcessus.ml" + )) = _v in + ((let _menhir_stack = (_menhir_stack, _v) in + let _menhir_env = _menhir_discard _menhir_env in + let _tok = _menhir_env._menhir_token in + match _tok with + | FINISHES -> + _menhir_run18 _menhir_env (Obj.magic _menhir_stack) MenhirState9 + | LEFT_BRACE -> + _menhir_run14 _menhir_env (Obj.magic _menhir_stack) MenhirState9 + | REQUIRES -> + _menhir_run11 _menhir_env (Obj.magic _menhir_stack) MenhirState9 + | STARTS -> + _menhir_run10 _menhir_env (Obj.magic _menhir_stack) MenhirState9 + | ACTIVITY | RESOURCE | RIGHT_BRACE -> + _menhir_reduce5 _menhir_env (Obj.magic _menhir_stack) MenhirState9 + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) MenhirState9) : 'freshtv16) + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv17 * _menhir_state) = Obj.magic _menhir_stack in + ((let (_menhir_stack, _menhir_s) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv18) + +and _menhir_discard : _menhir_env -> _menhir_env = + fun _menhir_env -> + let lexer = _menhir_env._menhir_lexer in + let lexbuf = _menhir_env._menhir_lexbuf in + let _tok = lexer lexbuf in + { + _menhir_lexer = lexer; + _menhir_lexbuf = lexbuf; + _menhir_token = _tok; + _menhir_error = false; + } + +and fichier : (Lexing.lexbuf -> token) -> Lexing.lexbuf -> ( +# 21 "parserProcessus.mly" + (unit) +# 858 "parserProcessus.ml" +) = + fun lexer lexbuf -> + let _menhir_env = + let (lexer : Lexing.lexbuf -> token) = lexer in + let (lexbuf : Lexing.lexbuf) = lexbuf in + ((let _tok = Obj.magic () in + { + _menhir_lexer = lexer; + _menhir_lexbuf = lexbuf; + _menhir_token = _tok; + _menhir_error = false; + }) : _menhir_env) + in + Obj.magic (let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv13) = ((), _menhir_env._menhir_lexbuf.Lexing.lex_curr_p) in + ((let _menhir_env = _menhir_discard _menhir_env in + let _tok = _menhir_env._menhir_token in + match _tok with + | PROCESS -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv9) = Obj.magic _menhir_stack in + ((let _menhir_env = _menhir_discard _menhir_env in + let _tok = _menhir_env._menhir_token in + match _tok with + | IDENTIFIER _v -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv5) = Obj.magic _menhir_stack in + let (_v : ( +# 16 "parserProcessus.mly" + (string) +# 889 "parserProcessus.ml" + )) = _v in + ((let _menhir_stack = (_menhir_stack, _v) in + let _menhir_env = _menhir_discard _menhir_env in + let _tok = _menhir_env._menhir_token in + match _tok with + | LEFT_BRACE -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ('freshtv1) * ( +# 16 "parserProcessus.mly" + (string) +# 900 "parserProcessus.ml" + )) = Obj.magic _menhir_stack in + ((let _menhir_env = _menhir_discard _menhir_env in + let _tok = _menhir_env._menhir_token in + match _tok with + | ACTIVITY -> + _menhir_run8 _menhir_env (Obj.magic _menhir_stack) MenhirState3 + | RESOURCE -> + _menhir_run4 _menhir_env (Obj.magic _menhir_stack) MenhirState3 + | RIGHT_BRACE -> + _menhir_reduce11 _menhir_env (Obj.magic _menhir_stack) MenhirState3 + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) MenhirState3) : 'freshtv2) + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ('freshtv3) * ( +# 16 "parserProcessus.mly" + (string) +# 922 "parserProcessus.ml" + )) = Obj.magic _menhir_stack in + (raise _eRR : 'freshtv4)) : 'freshtv6) + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv7) = Obj.magic _menhir_stack in + (raise _eRR : 'freshtv8)) : 'freshtv10) + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv11) = Obj.magic _menhir_stack in + (raise _eRR : 'freshtv12)) : 'freshtv14)) + +# 57 "parserProcessus.mly" + + +# 941 "parserProcessus.ml" + +# 269 "" + + +# 946 "parserProcessus.ml" diff --git a/TP8-9/process-analysis/parserProcessus.mli b/TP8-9/process-analysis/parserProcessus.mli new file mode 100755 index 0000000..a3f43f8 --- /dev/null +++ b/TP8-9/process-analysis/parserProcessus.mli @@ -0,0 +1,27 @@ + +(* The type of tokens. *) + +type token = + | STARTS + | STARTED + | RIGHT_BRACE + | RESOURCE + | REQUIRES + | PROCESS + | NUMBER of (int) + | LEFT_BRACE + | IF + | IDENTIFIER of (string) + | FINISHES + | FINISHED + | END + | AMOUNT + | ACTIVITY + +(* This exception is raised by the monolithic API functions. *) + +exception Error + +(* The monolithic API. *) + +val fichier: (Lexing.lexbuf -> token) -> Lexing.lexbuf -> (unit) diff --git a/TP8-9/process-analysis/parserProcessus.mly b/TP8-9/process-analysis/parserProcessus.mly new file mode 100755 index 0000000..9d27471 --- /dev/null +++ b/TP8-9/process-analysis/parserProcessus.mly @@ -0,0 +1,57 @@ +%{ + +(* Partie recopiee dans le fichier CaML genere. *) +(* Ouverture de modules exploites dans les actions *) +(* Declarations de types, de constantes, de fonctions, d'exceptions exploites dans les actions *) + +%} + +/* Declaration des unites lexicales et de leur type si une valeur particuliere leur est associee */ + +%token PROCESS ACTIVITY STARTS FINISHES IF STARTED FINISHED +%token RESOURCE AMOUNT REQUIRES +%token LEFT_BRACE RIGHT_BRACE +/* Defini le type des donnees associees a l'unite lexicale */ +%token NUMBER +%token IDENTIFIER +/* Unite lexicale particuliere qui represente la fin du fichier */ +%token END + +/* Type renvoye pour le nom terminal fichier */ +%type fichier + +/* Le non terminal fichier est l'axiome */ +%start fichier + +%% /* Regles de productions */ + +fichier : processus END { (print_endline "fichier : processus END") } + +processus : PROCESS IDENTIFIER LEFT_BRACE elements RIGHT_BRACE { (print_endline "processus : process IDENTIFIER { elements }") } + +elements : /* Lambda, mot vide */ { (print_endline "elements : /* Lambda, mot vide */") } + | element elements { (print_endline "elements : element elements") } + +element : activite { (print_endline "element : activite") } + | resource { (print_endline "element : resource") } + +resource : RESOURCE IDENTIFIER AMOUNT NUMBER { (print_endline "resource : resource IDENTIFIER amount NUMBER") } + +activite : ACTIVITY IDENTIFIER contraintes { (print_endline "activite : activity IDENTIFIER contraintes") } + +contraintes : /* Lambda, mot vide */ { (print_endline "contraintes : /* Lambda, mot vide */") } + | requires contraintes { (print_endline "contraintes : requires contraintes") } + | contrainte contraintes { (print_endline "contraintes : contrainte contraintes") } + | LEFT_BRACE elements RIGHT_BRACE contraintes { (print_endline "contraintes : { elements } contraintes") } + +requires : REQUIRES NUMBER IDENTIFIER { (print_endline "requires : requires NUMBER IDENTIFIER") } + +contrainte : action IF IDENTIFIER etat { (print_endline "contrainte : action if IDENTIFIER etat") } + +action : STARTS { (print_endline "action : STARTS") } + | FINISHES { (print_endline "action : FINISHES") } + +etat : STARTED { (print_endline "etat : STARTED") } + | FINISHED { (print_endline "etat : FINISHED") } + +%% diff --git a/TP8-9/process-analysis/tests/test00.processus b/TP8-9/process-analysis/tests/test00.processus new file mode 100755 index 0000000..5ad4150 --- /dev/null +++ b/TP8-9/process-analysis/tests/test00.processus @@ -0,0 +1,8 @@ +/* Un premier exemple de processus */ +process ABC { + activity A + activity B + activity C + starts if A started + finishes if B finished +} \ No newline at end of file diff --git a/TP8-9/process-analysis/tests/test01.processus b/TP8-9/process-analysis/tests/test01.processus new file mode 100755 index 0000000..27c76ff --- /dev/null +++ b/TP8-9/process-analysis/tests/test01.processus @@ -0,0 +1,11 @@ +/* Un deuxième exemple de processus avec des ressources */ +process ABC { + resource R amount 5 + activity A + requires 2 R + activity B + activity C + requires 3 R + starts if A started + finishes if B finished +} diff --git a/TP8-9/process-analysis/tests/test02.processus b/TP8-9/process-analysis/tests/test02.processus new file mode 100755 index 0000000..fda1aa3 --- /dev/null +++ b/TP8-9/process-analysis/tests/test02.processus @@ -0,0 +1,18 @@ +/* Un troisième exemple de processus hiérarchique avec des ressources */ +process ABC { + resource R amount 5 + activity A { + activity A1 { + activity A11 + } + requires 1 R + activity A2 + requires 2 R + starts if A1 finished + } + requires 2 R + activity B + activity C requires 3 R + starts if A started + finishes if B finished +} \ No newline at end of file