From 103edf0c84dec9b30ea9a938f9287ecb78426aed Mon Sep 17 00:00:00 2001 From: Per Lindgren <per.lindgren@ltu.se> Date: Tue, 2 Oct 2018 08:42:00 +0200 Subject: [PATCH] examples for lecture 8, stack machine --- examples/compiler_noproof.mlw | 168 ++++++++++ examples/compiler_noproof/why3session.xml | 300 ++++++++++++++++++ examples/compiler_noproof/why3session.xml.bak | 298 +++++++++++++++++ examples/compiler_noproof/why3shapes.gz | Bin 0 -> 3541 bytes examples/compiler_noproof/why3shapes.gz.bak | Bin 0 -> 3541 bytes examples/imp_per.mlw | 86 +++++ examples/state.mlw | 45 +++ examples/vm_ind.mlw | 110 +++++++ examples/vm_mem.mlw | 103 ++++++ examples/vm_mem/why3session.xml | 28 ++ examples/vm_mem/why3session.xml.bak | 26 ++ examples/vm_mem/why3shapes.gz | Bin 0 -> 218 bytes examples/vm_mem/why3shapes.gz.bak | Bin 0 -> 218 bytes examples/vm_per.mlw | 254 +++++++++++++++ examples/vm_simple.mlw | 95 ++++++ examples/vm_simple/why3session.xml | 132 ++++++++ examples/vm_simple/why3session.xml.bak | 36 +++ examples/vm_simple/why3shapes.gz | Bin 0 -> 1143 bytes examples/vm_simple/why3shapes.gz.bak | Bin 0 -> 322 bytes 19 files changed, 1681 insertions(+) create mode 100644 examples/compiler_noproof.mlw create mode 100644 examples/compiler_noproof/why3session.xml create mode 100644 examples/compiler_noproof/why3session.xml.bak create mode 100644 examples/compiler_noproof/why3shapes.gz create mode 100644 examples/compiler_noproof/why3shapes.gz.bak create mode 100644 examples/imp_per.mlw create mode 100644 examples/state.mlw create mode 100644 examples/vm_ind.mlw create mode 100644 examples/vm_mem.mlw create mode 100644 examples/vm_mem/why3session.xml create mode 100644 examples/vm_mem/why3session.xml.bak create mode 100644 examples/vm_mem/why3shapes.gz create mode 100644 examples/vm_mem/why3shapes.gz.bak create mode 100644 examples/vm_per.mlw create mode 100644 examples/vm_simple.mlw create mode 100644 examples/vm_simple/why3session.xml create mode 100644 examples/vm_simple/why3session.xml.bak create mode 100644 examples/vm_simple/why3shapes.gz create mode 100644 examples/vm_simple/why3shapes.gz.bak diff --git a/examples/compiler_noproof.mlw b/examples/compiler_noproof.mlw new file mode 100644 index 0000000..cdf47dc --- /dev/null +++ b/examples/compiler_noproof.mlw @@ -0,0 +1,168 @@ + + +(*Imp to Vm compiler *) +(**************************************************************************) + +(* Compiler for arithmetic expressions *) +module Compile_aexpr + + use int.Int + use list.List + use list.Length + use list.Append + use imp_per.Imp + use vm_per.Vm + use state.State + + function compile_aexpr (a:aexpr) : code = + match a with + | Anum n -> iconst n + | Avar x -> ivar x + | Aadd a1 a2 -> compile_aexpr a1 ++ compile_aexpr a2 ++ iadd + | Asub a1 a2 -> compile_aexpr a1 ++ compile_aexpr a2 ++ isub + end + + goal g_2_1 : (* 2 + 1 *) + let c_imp = Aadd (Anum 2) (Anum 1) in + let c_out = compile_aexpr c_imp in + c_out = iconst 2 ++ iconst 1 ++ iadd + + goal g_a_1 : (* a + 1 *) + let c_imp = Aadd (Avar (Id 1)) (Anum 1) in + let c_out = compile_aexpr c_imp in + c_out = ivar (Id 1) ++ iconst 1 ++ iadd + +end + + +(* Compiler for boolean expressions. *) +module Compile_bexpr + + use int.Int + use list.List + use list.Length + use list.Append + use imp_per.Imp + use vm_per.Vm + use state.State + use Compile_aexpr + + function compile_bexpr (b:bexpr) (cond:bool) (ofs:ofs) : code = + match b with + | Btrue -> if cond then ibranch ofs else Nil + | Bfalse -> if cond then Nil else ibranch ofs + | Bnot b1 -> compile_bexpr b1 (not cond) ofs + | Band b1 b2 -> + let c2 = compile_bexpr b2 cond ofs in + let ofs = if cond then length c2 else ofs + length c2 in + compile_bexpr b1 false ofs ++ c2 + + | Beq a1 a2 -> compile_aexpr a1 ++ compile_aexpr a2 ++ + if cond then ibeq ofs else ibne ofs + | Ble a1 a2 -> compile_aexpr a1 ++ compile_aexpr a2 ++ + if cond then ible ofs else ibgt ofs + end +end + +module Compile_com + + use int.Int + use list.List + use list.Length + use list.Append + use imp_per.Imp + use vm_per.Vm + use state.State + use Compile_aexpr + use Compile_bexpr + + function compile_com (cmd: com) : code = + match cmd with + | Cskip -> Nil + | Cassign x a -> compile_aexpr a ++ isetvar x + | Cseq cmd1 cmd2 -> compile_com cmd1 ++ compile_com cmd2 + | Cif bexpr cmd1 cmd2 -> + let code_false = compile_com cmd2 in + let code_true = compile_com cmd1 ++ ibranch (length code_false) in + compile_bexpr bexpr false (length code_true) ++ + code_true ++ + code_false + | Cwhile test body -> + let code_body = compile_com body in + let body_length = length code_body + 1 in + let code_test = compile_bexpr test false body_length in + let ofs = length code_test + body_length in + code_test ++ code_body ++ ibranch (- ofs) + end + + function compile_program (prog : com) : code = + compile_com prog ++ ihalt + + goal g1 : (* a := 2 + 1 *) + let c_in = Cassign (Id 1) (Aadd (Anum 2) (Anum 1)) in + let c_out = + iconst 2 ++ + iconst 1 ++ + iadd ++ + isetvar (Id 1) ++ + ihalt in + compile_program c_in = c_out + + goal g2 : (* IF TRUE THEN a := 1 ELSE a := 2 END *) + let c_in = Cif Btrue (Cassign (Id 1) (Anum 1)) (Cassign (Id 1) (Anum 2)) in + let c_out = + (* <-- condition trivial true *) + iconst 1 ++ (* <-- then branch *) + isetvar (Id 1) ++ + ibranch 2 ++ + iconst 2 ++ (* <-- else branch *) + isetvar (Id 1) ++ + ihalt + in + compile_program c_in = c_out + + goal g3 : (* IF NOT TRUE THEN a := 1 ELSE a := 2 END *) + let c_in = Cif (Bnot Btrue) (Cassign (Id 1) (Anum 1)) (Cassign (Id 1) (Anum 2)) in + let c_out = + ibranch 3 ++ (* <-- condition trivial false *) + iconst 1 ++ (* <-- then branch *) + isetvar (Id 1) ++ + ibranch 2 ++ + iconst 2 ++ (* <-- else branch *) + isetvar (Id 1) ++ + ihalt + in + compile_program c_in = c_out + + goal g4 : (* IF a <= 0 THEN a := 1 ELSE a := 2 END *) + let c_in = Cif (Ble (Avar (Id 1)) (Anum 0)) (Cassign (Id 1) (Anum 1)) (Cassign (Id 1) (Anum 2)) in + let c_out = + ivar (Id 1) ++ (* <-- a <= 0 condition *) + iconst 0 ++ + ibgt 3 ++ + iconst 1 ++ (* <-- then branch *) + isetvar (Id 1) ++ + ibranch 2 ++ + iconst 2 ++ (* <-- else branch *) + isetvar (Id 1) ++ + ihalt + in + compile_program c_in = c_out + + (* simple sum program : *) + goal g5 : (* X := 1; WHILE NOT (Y <= 0) DO X := X + Y; Y := Y - 1 DONE *) + let x = Id 0 in + let y = Id 1 in + let cond = Bnot (Ble (Avar y) (Anum 0)) in + let body1 = Cassign x (Aadd (Avar x) (Avar y)) in + let body2 = Cassign y (Asub (Avar y) (Anum 1)) in + let lp = Cwhile cond (Cseq body1 body2) in + let code = Cseq (Cassign x (Anum 1)) lp in + + let c_out = + (* your code here *) + ihalt in + compile_program code = c_out + +end + diff --git a/examples/compiler_noproof/why3session.xml b/examples/compiler_noproof/why3session.xml new file mode 100644 index 0000000..a96c43a --- /dev/null +++ b/examples/compiler_noproof/why3session.xml @@ -0,0 +1,300 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE why3session PUBLIC "-//Why3//proof session v5//EN" +"http://why3.lri.fr/why3session.dtd"> +<why3session shape_version="5"> +<prover id="0" name="Z3" version="4.7.1" alternative="counterexamples" timelimit="10" steplimit="0" memlimit="1000"/> +<prover id="1" name="Eprover" version="2.0" timelimit="10" steplimit="0" memlimit="1000"/> +<prover id="2" name="CVC4" version="1.4" timelimit="1" steplimit="0" memlimit="1000"/> +<prover id="3" name="Alt-Ergo" version="2.0.0" timelimit="1" steplimit="0" memlimit="1000"/> +<file name="../imp_per.mlw" proved="true"> +<theory name="Imp" proved="true"> + <goal name="ceval_deterministic_aux" proved="true"> + <transf name="induction_pr" proved="true" > + <goal name="ceval_deterministic_aux.0" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="42"/></proof> + </goal> + <goal name="ceval_deterministic_aux.1" proved="true"> + <proof prover="3"><result status="valid" time="0.02" steps="79"/></proof> + </goal> + <goal name="ceval_deterministic_aux.2" proved="true"> + <transf name="induction_pr" proved="true" > + <goal name="ceval_deterministic_aux.2.0" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="15"/></proof> + </goal> + <goal name="ceval_deterministic_aux.2.1" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="17"/></proof> + </goal> + <goal name="ceval_deterministic_aux.2.2" proved="true"> + <proof prover="2"><result status="valid" time="0.08"/></proof> + </goal> + <goal name="ceval_deterministic_aux.2.3" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="17"/></proof> + </goal> + <goal name="ceval_deterministic_aux.2.4" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="17"/></proof> + </goal> + <goal name="ceval_deterministic_aux.2.5" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="16"/></proof> + </goal> + <goal name="ceval_deterministic_aux.2.6" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="18"/></proof> + </goal> + </transf> + </goal> + <goal name="ceval_deterministic_aux.3" proved="true"> + <transf name="induction_pr" proved="true" > + <goal name="ceval_deterministic_aux.3.0" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="15"/></proof> + </goal> + <goal name="ceval_deterministic_aux.3.1" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="17"/></proof> + </goal> + <goal name="ceval_deterministic_aux.3.2" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="17"/></proof> + </goal> + <goal name="ceval_deterministic_aux.3.3" proved="true"> + <proof prover="2"><result status="valid" time="0.04"/></proof> + </goal> + <goal name="ceval_deterministic_aux.3.4" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="17"/></proof> + </goal> + <goal name="ceval_deterministic_aux.3.5" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="16"/></proof> + </goal> + <goal name="ceval_deterministic_aux.3.6" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="18"/></proof> + </goal> + </transf> + </goal> + <goal name="ceval_deterministic_aux.4" proved="true"> + <transf name="induction_pr" proved="true" > + <goal name="ceval_deterministic_aux.4.0" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="15"/></proof> + </goal> + <goal name="ceval_deterministic_aux.4.1" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="17"/></proof> + </goal> + <goal name="ceval_deterministic_aux.4.2" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="17"/></proof> + </goal> + <goal name="ceval_deterministic_aux.4.3" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="17"/></proof> + </goal> + <goal name="ceval_deterministic_aux.4.4" proved="true"> + <proof prover="2"><result status="valid" time="0.04"/></proof> + </goal> + <goal name="ceval_deterministic_aux.4.5" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="16"/></proof> + </goal> + <goal name="ceval_deterministic_aux.4.6" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="18"/></proof> + </goal> + </transf> + </goal> + <goal name="ceval_deterministic_aux.5" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="47"/></proof> + </goal> + <goal name="ceval_deterministic_aux.6" proved="true"> + <transf name="induction_pr" proved="true" > + <goal name="ceval_deterministic_aux.6.0" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="16"/></proof> + </goal> + <goal name="ceval_deterministic_aux.6.1" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="18"/></proof> + </goal> + <goal name="ceval_deterministic_aux.6.2" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="18"/></proof> + </goal> + <goal name="ceval_deterministic_aux.6.3" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="18"/></proof> + </goal> + <goal name="ceval_deterministic_aux.6.4" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="18"/></proof> + </goal> + <goal name="ceval_deterministic_aux.6.5" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="17"/></proof> + </goal> + <goal name="ceval_deterministic_aux.6.6" proved="true"> + <proof prover="2"><result status="valid" time="0.08"/></proof> + </goal> + </transf> + </goal> + </transf> + </goal> + <goal name="ceval_deterministic" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="25"/></proof> + </goal> +</theory> +</file> +<file name="../compiler_noproof.mlw"> +<theory name="Compile_aexpr" proved="true"> + <goal name="g_2_1" proved="true"> + <proof prover="3"><result status="valid" time="0.02" steps="30"/></proof> + <transf name="compute_in_goal" proved="true" > + </transf> + </goal> + <goal name="g_a_1" proved="true"> + <proof prover="3"><result status="valid" time="0.02" steps="30"/></proof> + </goal> +</theory> +<theory name="Compile_com"> + <goal name="g1" proved="true"> + <proof prover="3"><result status="valid" time="0.02" steps="44"/></proof> + </goal> + <goal name="g2" proved="true"> + <transf name="compute_in_goal" proved="true" > + </transf> + </goal> + <goal name="g3" proved="true"> + <transf name="compute_in_goal" proved="true" > + </transf> + </goal> + <goal name="g4" proved="true"> + <transf name="compute_in_goal" proved="true" > + <goal name="g4.0" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="9"/></proof> + </goal> + </transf> + </goal> + <goal name="g5"> + <proof prover="2"><result status="timeout" time="1.00"/></proof> + <proof prover="3"><result status="timeout" time="1.00"/></proof> + <transf name="compute_in_goal" > + <goal name="g5.0"> + </goal> + </transf> + </goal> +</theory> +</file> +<file name="../vm_per.mlw" proved="true"> +<theory name="ReflTransClosure" proved="true"> + <goal name="transition_star_one" proved="true"> + <proof prover="1"><result status="valid" time="0.01"/></proof> + </goal> + <goal name="transition_star_transitive" proved="true"> + <transf name="induction_pr" proved="true" > + <goal name="transition_star_transitive.0" proved="true"> + <proof prover="3"><result status="valid" time="0.00" steps="5"/></proof> + </goal> + <goal name="transition_star_transitive.1" proved="true"> + <proof prover="3"><result status="valid" time="0.00" steps="11"/></proof> + </goal> + </transf> + </goal> +</theory> +<theory name="Vm" proved="true"> + <goal name="codeseq_at_app_right" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="30"/></proof> + </goal> + <goal name="codeseq_at_app_left" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="59"/></proof> + </goal> +</theory> +<theory name="Vm_test" proved="true"> + <goal name="cs_0" proved="true"> + <transf name="compute_in_goal" proved="true" > + <goal name="cs_0.0" proved="true"> + <proof prover="2"><result status="valid" time="0.13"/></proof> + </goal> + </transf> + </goal> + <goal name="cs_1" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="27"/></proof> + </goal> + <goal name="cs_2" proved="true"> + <proof prover="3"><result status="valid" time="0.03" steps="90"/></proof> + </goal> + <goal name="cs_3" proved="true"> + <transf name="compute_in_goal" proved="true" > + <goal name="cs_3.0" proved="true"> + <proof prover="0"><result status="valid" time="2.72"/></proof> + </goal> + </transf> + </goal> + <goal name="g1" proved="true"> + <proof prover="0"><result status="valid" time="0.03"/></proof> + </goal> + <goal name="g2" proved="true"> + <proof prover="3"><result status="valid" time="0.03" steps="56"/></proof> + </goal> + <goal name="g2_trans" proved="true"> + <proof prover="3"><result status="valid" time="0.05" steps="155"/></proof> + </goal> + <goal name="g3" proved="true"> + <proof prover="3"><result status="valid" time="0.04" steps="68"/></proof> + </goal> + <goal name="g3_trans" proved="true"> + <proof prover="3"><result status="valid" time="0.07" steps="183"/></proof> + </goal> + <goal name="g_term" proved="true"> + <proof prover="3"><result status="valid" time="0.07" steps="193"/></proof> + </goal> +</theory> +<theory name="Vm_test2" proved="true"> + <goal name="cs_0" proved="true"> + <transf name="compute_in_goal" proved="true" > + <goal name="cs_0.0" proved="true"> + <proof prover="0"><result status="valid" time="0.04"/></proof> + </goal> + </transf> + </goal> + <goal name="cs_1" proved="true"> + <proof prover="3"><result status="valid" time="0.02" steps="30"/></proof> + </goal> + <goal name="cs_2" proved="true"> + <proof prover="3"><result status="valid" time="0.03" steps="110"/></proof> + </goal> + <goal name="cs_3" proved="true"> + <proof prover="3"><result status="valid" time="0.05" steps="263"/></proof> + </goal> + <goal name="cs_4" proved="true"> + <proof prover="0"><result status="valid" time="0.14"/></proof> + </goal> + <goal name="g1" proved="true"> + <proof prover="0"><result status="valid" time="0.04"/></proof> + </goal> + <goal name="g2" proved="true"> + <proof prover="3"><result status="valid" time="0.03" steps="62"/></proof> + </goal> + <goal name="g2_trans" proved="true"> + <proof prover="3"><result status="valid" time="0.06" steps="187"/></proof> + </goal> + <goal name="g3" proved="true"> + <proof prover="3"><result status="valid" time="0.05" steps="74"/></proof> + </goal> + <goal name="g3_trans" proved="true"> + <proof prover="3"><result status="valid" time="0.09" steps="215"/></proof> + </goal> + <goal name="g4" proved="true"> + <proof prover="3"><result status="valid" time="0.05" steps="77"/></proof> + </goal> + <goal name="g4_trans" proved="true"> + <proof prover="2"><result status="valid" time="0.24"/></proof> + </goal> + <goal name="g_term" proved="true"> + <proof prover="2"><result status="valid" time="0.21"/></proof> + </goal> +</theory> +<theory name="Vm_test3" proved="true"> + <goal name="cs_0" proved="true"> + <transf name="compute_in_goal" proved="true" > + <goal name="cs_0.0" proved="true"> + <proof prover="0"><result status="valid" time="0.03"/></proof> + </goal> + </transf> + </goal> + <goal name="cs_1" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="20"/></proof> + </goal> + <goal name="cs_2" proved="true"> + <proof prover="0"><result status="valid" time="0.04"/></proof> + </goal> + <goal name="g1" proved="true"> + <proof prover="3"><result status="valid" time="0.02" steps="29"/></proof> + </goal> + <goal name="g_term" proved="true"> + <proof prover="3"><result status="valid" time="0.02" steps="23"/></proof> + </goal> +</theory> +</file> +</why3session> diff --git a/examples/compiler_noproof/why3session.xml.bak b/examples/compiler_noproof/why3session.xml.bak new file mode 100644 index 0000000..36d5bc9 --- /dev/null +++ b/examples/compiler_noproof/why3session.xml.bak @@ -0,0 +1,298 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE why3session PUBLIC "-//Why3//proof session v5//EN" +"http://why3.lri.fr/why3session.dtd"> +<why3session shape_version="5"> +<prover id="0" name="Z3" version="4.7.1" alternative="counterexamples" timelimit="10" steplimit="0" memlimit="1000"/> +<prover id="1" name="Eprover" version="2.0" timelimit="10" steplimit="0" memlimit="1000"/> +<prover id="2" name="CVC4" version="1.4" timelimit="1" steplimit="0" memlimit="1000"/> +<prover id="3" name="Alt-Ergo" version="2.0.0" timelimit="1" steplimit="0" memlimit="1000"/> +<file name="../imp_per.mlw" proved="true"> +<theory name="Imp" proved="true"> + <goal name="ceval_deterministic_aux" proved="true"> + <transf name="induction_pr" proved="true" > + <goal name="ceval_deterministic_aux.0" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="42"/></proof> + </goal> + <goal name="ceval_deterministic_aux.1" proved="true"> + <proof prover="3"><result status="valid" time="0.02" steps="79"/></proof> + </goal> + <goal name="ceval_deterministic_aux.2" proved="true"> + <transf name="induction_pr" proved="true" > + <goal name="ceval_deterministic_aux.2.0" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="15"/></proof> + </goal> + <goal name="ceval_deterministic_aux.2.1" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="17"/></proof> + </goal> + <goal name="ceval_deterministic_aux.2.2" proved="true"> + <proof prover="2"><result status="valid" time="0.08"/></proof> + </goal> + <goal name="ceval_deterministic_aux.2.3" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="17"/></proof> + </goal> + <goal name="ceval_deterministic_aux.2.4" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="17"/></proof> + </goal> + <goal name="ceval_deterministic_aux.2.5" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="16"/></proof> + </goal> + <goal name="ceval_deterministic_aux.2.6" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="18"/></proof> + </goal> + </transf> + </goal> + <goal name="ceval_deterministic_aux.3" proved="true"> + <transf name="induction_pr" proved="true" > + <goal name="ceval_deterministic_aux.3.0" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="15"/></proof> + </goal> + <goal name="ceval_deterministic_aux.3.1" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="17"/></proof> + </goal> + <goal name="ceval_deterministic_aux.3.2" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="17"/></proof> + </goal> + <goal name="ceval_deterministic_aux.3.3" proved="true"> + <proof prover="2"><result status="valid" time="0.04"/></proof> + </goal> + <goal name="ceval_deterministic_aux.3.4" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="17"/></proof> + </goal> + <goal name="ceval_deterministic_aux.3.5" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="16"/></proof> + </goal> + <goal name="ceval_deterministic_aux.3.6" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="18"/></proof> + </goal> + </transf> + </goal> + <goal name="ceval_deterministic_aux.4" proved="true"> + <transf name="induction_pr" proved="true" > + <goal name="ceval_deterministic_aux.4.0" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="15"/></proof> + </goal> + <goal name="ceval_deterministic_aux.4.1" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="17"/></proof> + </goal> + <goal name="ceval_deterministic_aux.4.2" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="17"/></proof> + </goal> + <goal name="ceval_deterministic_aux.4.3" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="17"/></proof> + </goal> + <goal name="ceval_deterministic_aux.4.4" proved="true"> + <proof prover="2"><result status="valid" time="0.04"/></proof> + </goal> + <goal name="ceval_deterministic_aux.4.5" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="16"/></proof> + </goal> + <goal name="ceval_deterministic_aux.4.6" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="18"/></proof> + </goal> + </transf> + </goal> + <goal name="ceval_deterministic_aux.5" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="47"/></proof> + </goal> + <goal name="ceval_deterministic_aux.6" proved="true"> + <transf name="induction_pr" proved="true" > + <goal name="ceval_deterministic_aux.6.0" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="16"/></proof> + </goal> + <goal name="ceval_deterministic_aux.6.1" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="18"/></proof> + </goal> + <goal name="ceval_deterministic_aux.6.2" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="18"/></proof> + </goal> + <goal name="ceval_deterministic_aux.6.3" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="18"/></proof> + </goal> + <goal name="ceval_deterministic_aux.6.4" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="18"/></proof> + </goal> + <goal name="ceval_deterministic_aux.6.5" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="17"/></proof> + </goal> + <goal name="ceval_deterministic_aux.6.6" proved="true"> + <proof prover="2"><result status="valid" time="0.08"/></proof> + </goal> + </transf> + </goal> + </transf> + </goal> + <goal name="ceval_deterministic" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="25"/></proof> + </goal> +</theory> +</file> +<file name="../compiler_noproof.mlw"> +<theory name="Compile_aexpr" proved="true"> + <goal name="g_2_1" proved="true"> + <proof prover="3"><result status="valid" time="0.02" steps="30"/></proof> + </goal> + <goal name="g_a_1" proved="true"> + <proof prover="3"><result status="valid" time="0.02" steps="30"/></proof> + </goal> +</theory> +<theory name="Compile_com"> + <goal name="g1" proved="true"> + <proof prover="3"><result status="valid" time="0.02" steps="44"/></proof> + </goal> + <goal name="g2" proved="true"> + <transf name="compute_in_goal" proved="true" > + </transf> + </goal> + <goal name="g3" proved="true"> + <transf name="compute_in_goal" proved="true" > + </transf> + </goal> + <goal name="g4" proved="true"> + <transf name="compute_in_goal" proved="true" > + <goal name="g4.0" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="9"/></proof> + </goal> + </transf> + </goal> + <goal name="g5"> + <proof prover="2"><result status="timeout" time="1.00"/></proof> + <proof prover="3"><result status="timeout" time="1.00"/></proof> + <transf name="compute_in_goal" > + <goal name="g5.0"> + </goal> + </transf> + </goal> +</theory> +</file> +<file name="../vm_per.mlw" proved="true"> +<theory name="ReflTransClosure" proved="true"> + <goal name="transition_star_one" proved="true"> + <proof prover="1"><result status="valid" time="0.01"/></proof> + </goal> + <goal name="transition_star_transitive" proved="true"> + <transf name="induction_pr" proved="true" > + <goal name="transition_star_transitive.0" proved="true"> + <proof prover="3"><result status="valid" time="0.00" steps="5"/></proof> + </goal> + <goal name="transition_star_transitive.1" proved="true"> + <proof prover="3"><result status="valid" time="0.00" steps="11"/></proof> + </goal> + </transf> + </goal> +</theory> +<theory name="Vm" proved="true"> + <goal name="codeseq_at_app_right" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="30"/></proof> + </goal> + <goal name="codeseq_at_app_left" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="59"/></proof> + </goal> +</theory> +<theory name="Vm_test" proved="true"> + <goal name="cs_0" proved="true"> + <transf name="compute_in_goal" proved="true" > + <goal name="cs_0.0" proved="true"> + <proof prover="2"><result status="valid" time="0.13"/></proof> + </goal> + </transf> + </goal> + <goal name="cs_1" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="27"/></proof> + </goal> + <goal name="cs_2" proved="true"> + <proof prover="3"><result status="valid" time="0.03" steps="90"/></proof> + </goal> + <goal name="cs_3" proved="true"> + <transf name="compute_in_goal" proved="true" > + <goal name="cs_3.0" proved="true"> + <proof prover="0"><result status="valid" time="2.72"/></proof> + </goal> + </transf> + </goal> + <goal name="g1" proved="true"> + <proof prover="0"><result status="valid" time="0.03"/></proof> + </goal> + <goal name="g2" proved="true"> + <proof prover="3"><result status="valid" time="0.03" steps="56"/></proof> + </goal> + <goal name="g2_trans" proved="true"> + <proof prover="3"><result status="valid" time="0.05" steps="155"/></proof> + </goal> + <goal name="g3" proved="true"> + <proof prover="3"><result status="valid" time="0.04" steps="68"/></proof> + </goal> + <goal name="g3_trans" proved="true"> + <proof prover="3"><result status="valid" time="0.07" steps="183"/></proof> + </goal> + <goal name="g_term" proved="true"> + <proof prover="3"><result status="valid" time="0.07" steps="193"/></proof> + </goal> +</theory> +<theory name="Vm_test2" proved="true"> + <goal name="cs_0" proved="true"> + <transf name="compute_in_goal" proved="true" > + <goal name="cs_0.0" proved="true"> + <proof prover="0"><result status="valid" time="0.04"/></proof> + </goal> + </transf> + </goal> + <goal name="cs_1" proved="true"> + <proof prover="3"><result status="valid" time="0.02" steps="30"/></proof> + </goal> + <goal name="cs_2" proved="true"> + <proof prover="3"><result status="valid" time="0.03" steps="110"/></proof> + </goal> + <goal name="cs_3" proved="true"> + <proof prover="3"><result status="valid" time="0.05" steps="263"/></proof> + </goal> + <goal name="cs_4" proved="true"> + <proof prover="0"><result status="valid" time="0.14"/></proof> + </goal> + <goal name="g1" proved="true"> + <proof prover="0"><result status="valid" time="0.04"/></proof> + </goal> + <goal name="g2" proved="true"> + <proof prover="3"><result status="valid" time="0.03" steps="62"/></proof> + </goal> + <goal name="g2_trans" proved="true"> + <proof prover="3"><result status="valid" time="0.06" steps="187"/></proof> + </goal> + <goal name="g3" proved="true"> + <proof prover="3"><result status="valid" time="0.05" steps="74"/></proof> + </goal> + <goal name="g3_trans" proved="true"> + <proof prover="3"><result status="valid" time="0.09" steps="215"/></proof> + </goal> + <goal name="g4" proved="true"> + <proof prover="3"><result status="valid" time="0.05" steps="77"/></proof> + </goal> + <goal name="g4_trans" proved="true"> + <proof prover="2"><result status="valid" time="0.24"/></proof> + </goal> + <goal name="g_term" proved="true"> + <proof prover="2"><result status="valid" time="0.21"/></proof> + </goal> +</theory> +<theory name="Vm_test3" proved="true"> + <goal name="cs_0" proved="true"> + <transf name="compute_in_goal" proved="true" > + <goal name="cs_0.0" proved="true"> + <proof prover="0"><result status="valid" time="0.03"/></proof> + </goal> + </transf> + </goal> + <goal name="cs_1" proved="true"> + <proof prover="3"><result status="valid" time="0.01" steps="20"/></proof> + </goal> + <goal name="cs_2" proved="true"> + <proof prover="0"><result status="valid" time="0.04"/></proof> + </goal> + <goal name="g1" proved="true"> + <proof prover="3"><result status="valid" time="0.02" steps="29"/></proof> + </goal> + <goal name="g_term" proved="true"> + <proof prover="3"><result status="valid" time="0.02" steps="23"/></proof> + </goal> +</theory> +</file> +</why3session> diff --git a/examples/compiler_noproof/why3shapes.gz b/examples/compiler_noproof/why3shapes.gz new file mode 100644 index 0000000000000000000000000000000000000000..897e5bf6906611286c7048c79c74f76b21d628e6 GIT binary patch literal 3541 zcmb2|=3oGW|8HZw^JR7l?t2~n#+D->RHZv*f{Y9^6OYACl^Naw60VzeXdjs->%IHt zpWh+<&o0VrT_TxTCTneZ;~o3Sq}s2)R_#8n%6hPiFNU>aCF}KS;lwMCR%q9$hhP8u z>iPSB8x~EiRt~M7^j$mV;HlVi=U;qcQfBe$@$|~rJ9%wz=)teAA{u|ysc!#tduPh# zy=%9KGyN8xa^3v@j$dEW%mnrH^^-m|CcS%LqV`V6YxPD`o~^21Qq?rpRA`^LoidN} zQ?a98-08DtuYSLNx$fKa=9(S9Dy{z9eqaClyQk;GuTdMEZnrJro7p6^Wlj*sQGq2d zHi(@QslJh~yzWw&bWXL`=G+fm&pyT7e__A;>HRa$&OLODQG8p_9=h%F&)gX~TWn8% zE-g6p^J?0%*#YzKa%<mVY^`f8tM8i{JL~PGcZUqFzrD6}YkbTOp-K5sXH*&mqkUWC zM3Q@^u5RAh_^EEC$#fy{4IYy%pEI*PKaqC-=CZ>ab0o{&@3T;B&11R7Yw^h7d*X|V z*23+15sSt3*()*_gxYp~U+|f6*X3tkIa^)W4X3Y~l6CyWZtg-p*+&~5&z!S|VP5Zp z#3RQZU)DO8C=oL+JoE9VJzf0`*<S6k9C^HDJ7jE*^)8cmX2+8km3VKh^!0@2KX(-} zOlL2+Tw8GQl90)J9V_l#SE2>pFEDv!SfZo6<8fc+fegmjSxJ8iIQVbODl<sv__JZL z&Pj<yM;p2q%OCQ)pOeX)C@_^h<JqEVN@v@aFh2k3_gU+`N~FiSPtARfY<KitafGMD zS@l~<E$VC2y`UWEKFzE=(7kPr>Wa!M7a7!e1Kqg;#k<o>^}I5~G7p?FRQHHnzAMP7 zZf5caizln3vnn_A?{uqKnEv5`WaWpR9hax8U%zp8@}`|Lo~)l=f2IAg_3YfT!Wq{J z&A&g<yvCM)F!9~tw34*hb0st1Dz?8fw&3O|et&)LjfK;n6y<f^`065d+iv>}qtZWI zXFEPDkky@g+`Rr@nC{62TT^z^?R>138<J07+qr8>(#pTCsRn$?|Gpl+T0M7y^ofR> z9|dB(oBSJoPn~jb)wDNC*DfeGbY00gvuGj9%ZsbOY;HR#yXX5OmAwXjk1SFGyKa^& zubR_8^Y$;xr4!lTu+RKiH{o9Q#XmcwYjs^O8*h1_=;AxC+V|edZF8#2*0Qhrc;a8W zU+}fasqcOr{+nX6l5y7B>FpJpXIhIUFg?Fu6x_Uh+Zk5z2?=l4ER}gDrK$4OFnH4k zg%?3`ISFZp9#1k-FEeO<=3j1Lz)(0LyYH%PO1#W+9u3|-OIc5xRTdXj+tl5^<eudh z?_2YCvL3u#q|Z~aqww9v7a^~v${y=-;??}>z~Si`k)6-c|HMzCB&O*(kL{6|j(Cxx zeQHU1*%xoeUvPbp$yqpW72Emc!Z!D_{f=&$F6xr9?AStc2IZ+2cQwAa!=3xP=wC%o z;rYAl4>I2re&|#@@#$lmf~zAd+tFFU&TK2UUWswu%66}P{RM&a#82^u#BOb|+_Fc0 z$Mh4uy(Ve$LOT-7ir%I^eK05FkN1@33zM=k&;Hh1`21cJPh6J9MbGEVC2?<7o_~1h z_>Ncl?#uc$1)ry1j$c$^;Ii0#-%pty?WomWC#%B5tunk4{do4tNPl~LW@gs2Pv4tz zmPxbEcQMwsc-SBjW2hUvsi{-)$La-#lT&2Z*CcU2TcG-MTK23%QJfbmlaE}pT`sP6 z;J=jJo8vp(4-3cSsG81*`=K!TSldNIi=s%a)5+(r{P*vu*L8Z+zVo>BcC+vx5pky# zjx(!1pY@PvIz8=8(NC_<8{%n4>Sk2$QSJK9FtbLK#WDWiOjDtfQWlXPXIviFw+Pu^ zmpB;RJZWj<$I}uETMkWHkfHYEl~ld*oF6+?9h09b8LkTORSo3V+?v#*F~Q+P|K7Hr z_L~2G?w=%Lzr8^s`ioPnOhBGb&(y0+UvNbP%OBb}|J9kK6S;|U_r9#TYJI0obK^}m zmqxW?(ayS2Cw?aI>SQjC^KiMd`NYq=W_&j+=N>tiUiI`SYcA)l#@@|}hqJqu+uxT= ze*EC_eCF(X#>;LmxZ$M9u`wZMBm4WwZeL}ZZWOBVx^H9T&YE|F{X%B#feDS%6PG0? z)cp#cuee^OPOU`eOz7l|Yx`F1-6mDrae&vQ`+S*7RY_@N(3d^3>~q87+QeH=|NeYj z;?c|R3zH|=RZOp1qj;jbUFxFaa*Nv5shd}9wVtzfFaO(?YiT#1p1XTn$MfgWS+i9W z&%e)mvE`9T{o|c77fXCx<UhKV#Idz^EDKhe<+asFc&A^#zpGXR_tHBH*)x0nDl)gc z@kmd9e|lcYJGU;s$M1e@VSbj}^Y6=YEdz_&KW3i3=(fF1l0(8eG1;Z3?$wPAUc4u_ zHmg0%HvAP?wJrblJGZ=vT4H*p;@T3uXYVChf4>-dzrQ|iN6fzSH)ZQ?KaDOv8Y5ZL z|5{Guf`omvxK^-dyYM|FInjpn7tYg_KZIwyO!xlv)B0lm?i<d&mzzIah<X+!RIdE_ zB*)@5y`w*Wec;dHtMd=;*3U6r>=SbE>$$CBTKkHevnHnPKXdTx#r!&B>lO0r^YgTG z`Ez;-d$$MK*ZoL&u}Apt&&$t6_e>2hi;Ro?|Ks4Xb^i}?dxuUjDc@K!HKr$Uj@a9~ zi`|}Ys(1S2|0(j`7SBh4i^>n1UkYBS)w^<qW?qP<`=^B~#3t%_{XXu#o7KMd-;clP zKMiV^e=o~)c5hM+H?P`#{}2DCf8XA2bH4TFgI$=TX{xVj#@U1iEgF$k4l~W-)A`fl zH{5Q{eSFaEbo$P9_HVW>Om$ti>(9q)F<%^(Zk6J`{^F34s&?r+mlJWC37=h+lN1id z-Hi;rEt|8YF#W=}Uyt8*YPpM)>@9mL!sRseCG+u@p6l5^?7SB5_H?;3htK=>`RAEV zRon7dT1d&wmHU>!awwtJFvD+Jr;^K+TR}7be)5aEZT94>-?_Ul!=~@vY~A{-eB0w^ z(f51qzA~5h``*6)Ud*g7Q|;sT#{ZwGw>F{u9Tz|QTJ|+%?ePis*{ydeEV{O)`N7Nf z775S2pA#h2zRB%2`M*J4O0$0V=I_1#iobWTo3+KZZokdtS<WxJCg9ztIgOuRJv+Xs zY~s~x;`h#p-+cDwWrgjFw`v#6`nJwZ{aJe{=dXFp6P3=S&V#2qn5xBXR(h9Ra{f4% z-}bp;!b1)2z2+;9HS(XCJ;l=VNS=G!MZK8$8~)|@>b|ed{;+H2$)f^?-kp7RZ|8-q zmU{v#n|D16+Hzyp)~9*v^48nM?ccp~E>D8bL5_3(KHZ&qy1S)w!=jzsQ73zXWv}a8 z>&tL@`10V@OF{3>9!ibc*Hg~Yy6AJ*TaKdePqLf0#cjwoUc|LQMXkqLPUPmKu7}cd z3@%)px_{4}JuhaO{?0liEP1^tPWAW{<;B?>mu*n7n5R`yW4ohHv9P|%s`Tm>uE(p^ zzw<3GfA5r*Hg`sj!QQ!>Wg2!~KXmosm#wTO*XJG$d=L`#^V}xKVD6XYMZ5hgj``ew z{q_5H`#ZVWc1QBwZhmxY$t#1-!*7hY1>E{_CRnh>^xyKtU!RKR*a<##7vGZf>gKAW zUv^E|)S$ic)}@4ZZ(Sd4NL?8`_x7<1tmSTHswFG-w))*m|N3Ih=5?IAyboVdb}Ey9 zeS5}k`B$&+yiUqrcO{JBjsJqo=%dBGmc_H`_S)oB`WNe;QP>wDnUd^z`S!1KimQ{> z%I^45v_fZX<nz{*qGz+EMM|gLsy%nib`xg_Z%@<J=E!$?yQ6jUv?Mu~U3@kBqu7hK z4Illyru>n7P}pv%wP1VF{K-dSN{-GsvP)*eevRm+R{_r&)kDMTe|0;WKi$Q@!S3cZ z?)|@Gm!AFFeJW;eV4d?#A<hWP1v!Peal#V?3KGw@re3?ASzqfZ<lQQfBxZPrVT0S@ zf>kRH^hCU0-m5A)Z&KpDC?*RJQGuAH8Dg(5ojstIq%`6Cmdcu=Uj?@Bf46N?mtbL0 zpUygk-EPM&sWzTIxl)MT#%uP{*4JM+oxg?6aMm=lDcS5ZWkH(C@+5=5Umo6FTlcS^ zRCjyT=XbZRUFV;l_dk~@Co+1WVTFnFwR2q8{vOLJO!$|yAbR$d4-*%NCoLD<bdr<z z%B;A+WM1JiP4i37tH18Exg413VEE*ns`={&yur>hl(|zrCVZ`_D*YQEbzs_V(?2t- zPu+`Bwa)Ha)%GZ7>6B@g86s9YCY{UQ<G-@x)a(C!i&ZD8Y08}|DsJ-+>n`Tm7JPdB zzEoYY5ZjYij+=;Yyl^mQzo*jHU{UetkgV7n%4XZnyiq@s-F2QTV`Xsr1I_Ye=?gvF zPx``Eaha6f{QjA><n-AWDbEu4l2-;BiW%muJiB$;p)Z-wPBZWF-_OIpb+)Klnd5~s zjl8+un~$w!ny<g$XzPi!$(u@E#d@!a>U?uTJ$r|9Wtqcd%g|L}h0>;H!#o2g9XuR1 zX=gz*tEkwt$oTK&>c6)izTA6~arN#4d7PcT0hwV7ET2Wxd|Id+!E==L+RiQikF!|t z=B!jn3hK_<e~vT2a`B2%&&iwlIx{EtO`D!H%W2E+CC4IlZ5F4l?$DVPyJ_9Gy0%*d zm3ugx#3moJYo3w3d&cVUfQ_+|YbKp`YP)qV_DsO{O&9XMOli%Unw7XxH*~AdrJfII z4_Xc~o#MKoXgMQwVb;~kUm9l(jN5YdwFXyB%vpMl=MsPD5??oiNz=MQ?_by;?p?fb zYR<~pMI9<ZmxCn}#VxwR9B=q9ie?ut(mLjIz;JiQYuP}zf6Tj;qtDOwU|;|MeEAUV literal 0 HcmV?d00001 diff --git a/examples/compiler_noproof/why3shapes.gz.bak b/examples/compiler_noproof/why3shapes.gz.bak new file mode 100644 index 0000000000000000000000000000000000000000..897e5bf6906611286c7048c79c74f76b21d628e6 GIT binary patch literal 3541 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 literal 0 HcmV?d00001 diff --git a/examples/imp_per.mlw b/examples/imp_per.mlw new file mode 100644 index 0000000..52ce429 --- /dev/null +++ b/examples/imp_per.mlw @@ -0,0 +1,86 @@ +theory Imp + + use state.State + use bool.Bool + use int.Int + + + (* ************************ SYNTAX ************************ *) + type aexpr = + | Anum int + | Avar id + | Aadd aexpr aexpr + | Asub aexpr aexpr + + type bexpr = + | Btrue + | Bfalse + | Bnot bexpr + | Beq aexpr aexpr + | Ble aexpr aexpr + | Band bexpr bexpr + + type com = + | Cskip + | Cassign id aexpr + | Cseq com com + | Cif bexpr com com + | Cwhile bexpr com + + + (* ************************ SEMANTICS ************************ *) + function aeval (st:state) (e:aexpr) : int = + match e with + | Anum n -> n + | Avar x -> st[x] + | Aadd e1 e2 -> aeval st e1 + aeval st e2 + | Asub e1 e2 -> aeval st e1 - aeval st e2 + end + + function beval (st:state) (b:bexpr) : bool = + match b with + | Btrue -> true + | Bfalse -> false + | Bnot b' -> notb (beval st b') + | Beq a1 a2 -> aeval st a1 = aeval st a2 + | Ble a1 a2 -> aeval st a1 <= aeval st a2 + | Band b1 b2 -> andb (beval st b1) (beval st b2) + + end + + inductive ceval state com state = + (* skip *) + | E_Skip : forall m. ceval m Cskip m + + (* assignement *) + | E_Ass : forall m a x. ceval m (Cassign x a) m[x <- aeval m a] + + (* sequence *) + | E_Seq : forall cmd1 cmd2 m0 m1 m2. + ceval m0 cmd1 m1 -> ceval m1 cmd2 m2 -> ceval m0 (Cseq cmd1 cmd2) m2 + + (* if then else *) + | E_IfTrue : forall m0 m1 cond cmd1 cmd2. beval m0 cond -> + ceval m0 cmd1 m1 -> ceval m0 (Cif cond cmd1 cmd2) m1 + + | E_IfFalse : forall m0 m1 cond cmd1 cmd2. not beval m0 cond -> + ceval m0 cmd2 m1 -> ceval m0 (Cif cond cmd1 cmd2) m1 + + (* while *) + | E_WhileEnd : forall cond m body. not beval m cond -> + ceval m (Cwhile cond body) m + + | E_WhileLoop : forall mi mj mf cond body. beval mi cond -> + ceval mi body mj -> ceval mj (Cwhile cond body) mf -> + ceval mi (Cwhile cond body) mf + + + (* Determinstic semantics *) + lemma ceval_deterministic_aux : forall c mi mf1. ceval mi c mf1 -> + forall mf2. ([@inversion] ceval mi c mf2) -> mf1 = mf2 + + lemma ceval_deterministic : forall c mi mf1 mf2. + ceval mi c mf1 -> ceval mi c mf2 -> mf1 = mf2 + +end + diff --git a/examples/state.mlw b/examples/state.mlw new file mode 100644 index 0000000..a655477 --- /dev/null +++ b/examples/state.mlw @@ -0,0 +1,45 @@ + +module State + + use int.Int + + type id = Id int + type state = id -> int + + let function get (f: state) (x: id) = f x + + let function set (f: state) (x: id) (v: int) : state = + fun (y: id) -> + match (x, y) with + | (Id xv, Id yv) -> if xv = yv then v else (f y) + end + meta rewrite_def function set + + let function ([]) f x = f x + let function ([<-]) f x v = set f x v + + let function const (v: int) : state + ensures { forall x. result[x] = v } + = fun _ -> v + +end + +module Reg + + use int.Int + + type idr = int + type regs = idr -> int + + let function read (f: regs) (x: idr) = f x + + let function write (f: regs) (x: idr) (v: int) : regs = + fun (y: idr) -> if x = y then v else (f y) + + meta rewrite_def function write + + let function const (v: int) : regs + ensures { forall x. read result x = v } + = fun _ -> v + +end \ No newline at end of file diff --git a/examples/vm_ind.mlw b/examples/vm_ind.mlw new file mode 100644 index 0000000..752c229 --- /dev/null +++ b/examples/vm_ind.mlw @@ -0,0 +1,110 @@ +module ReflTransClosure + + type parameter + type state + predicate transition parameter state state + + inductive transition_star parameter (x y : state) = + | Refl_ : forall p x. transition_star p x x + | Step: forall p x y z. + transition p x y -> transition_star p y z -> transition_star p x z + + lemma transition_star_one: forall p s1 s2. + transition p s1 s2 -> transition_star p s1 s2 + + lemma transition_star_transitive: forall p s1 s2 s3. + transition_star p s1 s2 -> transition_star p s2 s3 -> + transition_star p s1 s3 + +end + + +theory VM_ind + + use export int.Int + use export list.List + use export list.NthNoOpt + use export state.State + + type stack = list int + type pos = int + type machine_state = (pos, stack, state) + + type instr = + | Iconst int (* push n on stack *) + | Ivar id (* push the value of variable *) + | Iadd (* pop two values, push their sum *) + | Isub (* pop two values, push their difference *) + | Ihalt (* end of program *) + + type code = list instr + + function pop (st : stack) : (int, stack) = + match st with + | Nil -> (0, st) + | Cons c st' -> (c, st') + end + + function push (v : int) (st : stack) : stack = Cons v st + + inductive transition code machine_state machine_state = + | trans_const: forall c p n. nth p c = (Iconst n) -> + forall s m. transition c (p, s, m) (p + 1, push n s, m) + + | trans_var: forall c p id. nth p c = (Ivar id) -> + forall s m. transition c (p, s, m) (p + 1, push m[id] s, m) + + | trans_add: forall c p. nth p c = (Iadd) -> + forall n1 n2 s m. transition c (p, push n2 (push n1 s), m) (p + 1, push (n1 + n2) s, m) + + | trans_sub: forall c p. nth p c = (Isub) -> + forall n1 n2 s m. transition c (p, push n2 (push n1 s), m) (p + 1, push (n1 - n2) s, m) + + + clone export ReflTransClosure with type parameter = code, + type state = machine_state, predicate transition = transition + + predicate vm_terminates (c:code) (mi mf:state) = + exists p. nth p c = Ihalt /\ + transition_star c (0, Nil, mi) (p, Nil, mf) + + predicate vm_terminates_non_empty (c:code) (mi mf:state) = + exists p s. nth p c = Ihalt /\ + transition_star c (0, Nil, mi) (p, s, mf) + +end + +theory VM_ind_test + + use VM_ind + use map.Const + + function (::) (i : 'a) (l : list 'a) : list 'a = Cons i l + + constant m0 : state = (const 0)[Id 1 <- 2] + constant c : code = (Ivar (Id 1) :: (Iconst 1 :: (Iadd :: (Ihalt :: Nil)))) + + lemma c0 : nth 0 c = Ivar (Id 1) + lemma c1 : nth 1 c = Iconst 1 + lemma c2 : nth 2 c = Iadd + lemma c3 : nth 3 c = Ihalt + + lemma g1 : (* 2 + 1 = 3, step one *) + transition c (0, Nil, m0) (1, 2 :: Nil, m0) + + lemma g2 : (* 2 + 1 = 3, step two *) + transition c (1, 2 :: Nil, m0) (2, 1 :: (2 :: Nil), m0) + + lemma g3 : (* 2 + 1 = 3, step three *) + transition c (2, 1 :: (2 :: Nil), m0) (3, 3 :: Nil, m0) + + lemma g3_trans : (* 2 + 1 = 3, multiple steps *) + transition_star c (0, Nil, m0) (3, 3 :: Nil, m0) + + goal g_term : (* 2 + 1 = 3, terminates with non-empty stack *) + vm_terminates_non_empty c m0 m0 + +end + + + diff --git a/examples/vm_mem.mlw b/examples/vm_mem.mlw new file mode 100644 index 0000000..25ac783 --- /dev/null +++ b/examples/vm_mem.mlw @@ -0,0 +1,103 @@ +theory VM_mem + + use export int.Int + use export list.List + use export state.State + + type stack = list int + type machine_state = (stack, state) + + type instr = + | Iconst int (* push n on stack *) + | Ivar id (* push the value of variable *) + | Iadd (* pop two values, push their sum *) + | Isub (* pop two values, push their difference *) + + function pop (st : stack) : (int, stack) = + match st with + | Nil -> (0, st) + | Cons c st' -> (c, st') + end + + + function push (v : int) (st : stack) : stack = Cons v st + + function fconst (v : int) (m : machine_state) : machine_state = + let (stack, state) = m in (push v stack, state) + + function fvar (id : id) (m : machine_state) : machine_state = + let (stack, state) = m in (push state[id] stack, state) + + + function fadd (m : machine_state) : machine_state = + let (stack, state) = m in + let (a1, st1) = pop stack in + let (a2, st2) = pop st1 in + (push (a1 + a2) st2, state) + + function fsub (m : machine_state) : machine_state = + let (stack, state) = m in + let (a1, st1) = pop stack in + let (a2, st2) = pop st1 in + (push (a2 - a1) st2, state) + +end + + +theory VM_mem_test + + use VM_mem + + goal g1 : (* 2 + 1 = 3 *) + forall state. + fadd (fconst 1 (fconst 2 (Nil, state))) = (Cons 3 Nil, state) + + constant s0 : state = (const 0)[Id 1 <- 2] + constant m0 : machine_state = (Nil, s0) + + goal g2 : (* a + 1 = 3, state[a] = 2 *) + fadd (fconst 1 (fvar (Id 1) m0)) = (Cons 3 Nil, s0) + +end + + +theory VM_mem_list + + use export VM_mem + + function vm_i (i : instr) (m : machine_state) : machine_state = + match i with + | Iconst v -> fconst v m + | Ivar id -> fvar id m + | Iadd -> fadd m + | Isub -> fsub m + end + + function vm (il : list instr) (m : machine_state) : machine_state = + match il with + | Nil -> m + | Cons i il' -> vm il' (vm_i i m) + end + +end + +theory VM_mem_list_test + + use VM_mem_list + + function (::) (i : 'a) (l : list 'a) : list 'a = Cons i l + + constant s0 : state = (const 0)[Id 1 <- 2] + constant m0 : machine_state = (Nil, s0) + + goal g1 : (* 2 + 1 = 3 *) + vm (Iconst 2 :: (Iconst 1 :: (Iadd :: Nil))) m0 = (3 :: Nil, s0) + + goal g2 : (* a + 1 = 3 *) + vm (Ivar (Id 1) :: (Iconst 1 :: (Iadd :: Nil))) m0 = (3 :: Nil, s0) + + +end + + + diff --git a/examples/vm_mem/why3session.xml b/examples/vm_mem/why3session.xml new file mode 100644 index 0000000..2a1422b --- /dev/null +++ b/examples/vm_mem/why3session.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE why3session PUBLIC "-//Why3//proof session v5//EN" +"http://why3.lri.fr/why3session.dtd"> +<why3session shape_version="5"> +<prover id="0" name="Alt-Ergo" version="2.0.0" timelimit="1" steplimit="0" memlimit="1000"/> +<prover id="1" name="CVC4" version="1.4" timelimit="1" steplimit="0" memlimit="1000"/> +<prover id="2" name="Z3" version="4.7.1" alternative="counterexamples" timelimit="10" steplimit="0" memlimit="1000"/> +<file name="../vm_mem.mlw"> +<theory name="VM_mem_test"> + <goal name="g1"> + <proof prover="0"><result status="unknown" time="0.06"/></proof> + <proof prover="1"><result status="timeout" time="1.00"/></proof> + <proof prover="2"><result status="timeout" time="10.00"/></proof> + </goal> + <goal name="g2" proved="true"> + <proof prover="0"><result status="valid" time="0.01" steps="32"/></proof> + </goal> +</theory> +<theory name="VM_mem_list_test" proved="true"> + <goal name="g1" proved="true"> + <proof prover="0"><result status="valid" time="0.04" steps="138"/></proof> + </goal> + <goal name="g2" proved="true"> + <proof prover="0"><result status="valid" time="0.04" steps="137"/></proof> + </goal> +</theory> +</file> +</why3session> diff --git a/examples/vm_mem/why3session.xml.bak b/examples/vm_mem/why3session.xml.bak new file mode 100644 index 0000000..1e7e846 --- /dev/null +++ b/examples/vm_mem/why3session.xml.bak @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE why3session PUBLIC "-//Why3//proof session v5//EN" +"http://why3.lri.fr/why3session.dtd"> +<why3session shape_version="5"> +<prover id="0" name="Alt-Ergo" version="2.0.0" timelimit="1" steplimit="0" memlimit="1000"/> +<prover id="1" name="CVC4" version="1.4" timelimit="1" steplimit="0" memlimit="1000"/> +<file name="../vm_mem.mlw"> +<theory name="VM_mem_test"> + <goal name="g1"> + <proof prover="0"><result status="unknown" time="0.06"/></proof> + <proof prover="1"><result status="timeout" time="1.00"/></proof> + </goal> + <goal name="g2" proved="true"> + <proof prover="0"><result status="valid" time="0.01" steps="32"/></proof> + </goal> +</theory> +<theory name="VM_mem_list_test" proved="true"> + <goal name="g1" proved="true"> + <proof prover="0"><result status="valid" time="0.04" steps="138"/></proof> + </goal> + <goal name="g2" proved="true"> + <proof prover="0"><result status="valid" time="0.04" steps="137"/></proof> + </goal> +</theory> +</file> +</why3session> diff --git a/examples/vm_mem/why3shapes.gz b/examples/vm_mem/why3shapes.gz new file mode 100644 index 0000000000000000000000000000000000000000..7861f4e60dd895c80d51205854aebe7f33b1657d GIT binary patch literal 218 zcmb2|=3oGW|4aK1W-%M`xV-<_RnwFkxlQE7N`VtgmtWeg6S-l+lBJ%`_WO5lxt+^o z`PFPzW96(_QkuIqS~=-osM1;EaBcJVc@?^cFSeim+Pq^%=j+!WORiaTtDKk5|2^+X z=8gR=KPzO6&)&aR#(F|RmT8Jhi{R{8Ow(JgMk-&~-O;`0^f|ZE9eHglBmEMut~&Za zXv&$B#)}_oC?<HzBwt+mv*^df*}ZR`UC*EU<M>RwnHt<x=fw7ioD%ggG8I~VO(=7P a4d2tYhL?Q*%CFV`j9=+tJ!KCg0|Nj)UTwDk literal 0 HcmV?d00001 diff --git a/examples/vm_mem/why3shapes.gz.bak b/examples/vm_mem/why3shapes.gz.bak new file mode 100644 index 0000000000000000000000000000000000000000..7861f4e60dd895c80d51205854aebe7f33b1657d GIT binary patch literal 218 zcmb2|=3oGW|4aK1W-%M`xV-<_RnwFkxlQE7N`VtgmtWeg6S-l+lBJ%`_WO5lxt+^o z`PFPzW96(_QkuIqS~=-osM1;EaBcJVc@?^cFSeim+Pq^%=j+!WORiaTtDKk5|2^+X z=8gR=KPzO6&)&aR#(F|RmT8Jhi{R{8Ow(JgMk-&~-O;`0^f|ZE9eHglBmEMut~&Za zXv&$B#)}_oC?<HzBwt+mv*^df*}ZR`UC*EU<M>RwnHt<x=fw7ioD%ggG8I~VO(=7P a4d2tYhL?Q*%CFV`j9=+tJ!KCg0|Nj)UTwDk literal 0 HcmV?d00001 diff --git a/examples/vm_per.mlw b/examples/vm_per.mlw new file mode 100644 index 0000000..7928a57 --- /dev/null +++ b/examples/vm_per.mlw @@ -0,0 +1,254 @@ + +(* Utility module: reflexive transitive closure of a parameterized + relation. *) +module ReflTransClosure + + type parameter + type state + predicate transition parameter state state + + inductive transition_star parameter (x y:state) = + | Refl_: forall p x. transition_star p x x + | Step: forall p x y z. + transition p x y -> transition_star p y z -> transition_star p x z + + lemma transition_star_one: forall p s1 s2. + transition p s1 s2 -> transition_star p s1 s2 + + lemma transition_star_transitive: forall p s1 s2 s3. + transition_star p s1 s2 -> transition_star p s2 s3 -> + transition_star p s1 s3 + +end + + +(******************************************************************************) + +(* The machine operates on a code c (a fixed list of instructions) + and three variable components: + - a program counter, denoting a position in c + - a state assigning integer values to variables + - an evaluation stack, containing integers. +*) + +theory Vm + + use export state.State + use export int.Int + use export list.List + use export list.Length + use export list.Append + use export int.EuclideanDivision + + type pos = int (* read position on stack *) + type stack = list int (* stack contains just integers *) + type machine_state = VMS pos stack state (* virtual machine configuration *) + + + type ofs = int + (* The instruction set of the machine. *) + type instr = + | Iconst int (* push n on stack *) + | Ivar id (* push the value of variable *) + | Isetvar id (* pop an integer, assign it to variable *) + | Ibranch ofs (* skip ofs instructions *) + | Iadd (* pop two values, push their sum *) + | Isub (* pop two values, push their difference *) + | Imul (* pop two values, push their product *) + | Ibeq ofs (* pop n2, pop n1, skip ofs forward if n1 = n2 *) + | Ibne ofs (* pop n2, pop n1, skip ofs forward if n1 <> n2 *) + | Ible ofs (* pop n2, pop n1, skip ofs forward if n1 <= n2 *) + | Ibgt ofs (* pop n2, pop n1, skip ofs forward if n1 > n2 *) + | Ihalt (* end of program *) + + type code = list instr + + (* Read pointer to code *) + inductive codeseq_at code pos code = + | codeseq_at_intro : forall c1 c2 c3. + codeseq_at (c1 ++ c2 ++ c3) (length c1) c2 + + + lemma codeseq_at_app_right: forall c c1 c2 p. + codeseq_at c p (c1 ++ c2) -> codeseq_at c (p + length c1) c2 + + + lemma codeseq_at_app_left: forall c c1 c2 p. + codeseq_at c p (c1 ++ c2) -> codeseq_at c p c1 + + function push (n:int) (s:stack) : stack = Cons n s + function iconst (n:int) : code = Cons (Iconst n) Nil + function ivar (x:id) : code = Cons (Ivar x) Nil + function isetvar (x:id) : code = Cons (Isetvar x) Nil + constant iadd : code = Cons Iadd Nil + constant isub : code = Cons Isub Nil + constant imul : code = Cons Imul Nil + function ibeq (ofs:ofs) : code = Cons (Ibeq ofs) Nil + function ible (ofs:ofs) : code = Cons (Ible ofs) Nil + function ibne (ofs:ofs) : code = Cons (Ibne ofs) Nil + function ibgt (ofs:ofs) : code = Cons (Ibgt ofs) Nil + function ibranch (ofs:ofs) : code = Cons (Ibranch ofs) Nil + constant ihalt : code = (Cons Ihalt Nil) + + (* The semantics of the virtual machine is given in small-step style, + as a transition relation between machine states: triples (program + counter, evaluation stack, variable state). The transition relation is + parameterized by the code c. There is one transition rule for each + kind of instruction, except Ihalt, which has no transition. *) + + inductive transition code machine_state machine_state = + | trans_const : forall c p n. codeseq_at c p (iconst n) -> + forall s m. transition c (VMS p s m) (VMS (p + 1) (push n s) m) + + | trans_var : forall c p x. codeseq_at c p (ivar x) -> + forall s m. transition c (VMS p s m) (VMS (p + 1) (push m[x] s) m) + + | trans_set_var: forall c p x. codeseq_at c p (isetvar x) -> + forall n s m. transition c (VMS p (push n s) m) (VMS (p + 1) s m[x<-n]) + + | trans_add : forall c p. codeseq_at c p iadd -> + forall n1 n2 s m. transition c (VMS p (push n2 (push n1 s)) m) + (VMS (p + 1) (push (n1 + n2) s) m) + + | trans_sub : forall c p. codeseq_at c p isub -> + forall n1 n2 s m. transition c (VMS p (push n2 (push n1 s)) m) + (VMS (p + 1) (push (n1 - n2) s) m) + + | trans_mul : forall c p. codeseq_at c p imul -> + forall n1 n2 s m. transition c (VMS p (push n2 (push n1 s)) m) + (VMS (p + 1) (push (n1 * n2) s) m) + + | trans_beq: forall c p1 ofs. codeseq_at c p1 (ibeq ofs) -> + forall s m n1 n2. transition c (VMS p1 (push n2 (push n1 s)) m) + (VMS (if n1 = n2 then p1 + 1 + ofs else p1 + 1) s m) + + | trans_bne: forall c p1 ofs. codeseq_at c p1 (ibne ofs) -> + forall s m n1 n2. transition c (VMS p1 (push n2 (push n1 s)) m) + (VMS (if n1 = n2 then p1 + 1 else p1 + 1 + ofs) s m) + + | trans_ble: forall c p1 ofs. codeseq_at c p1 (ible ofs) -> + forall s m n1 n2. transition c (VMS p1 (push n2 (push n1 s)) m) + (VMS (if n1 <= n2 then p1 + 1 + ofs else p1 + 1) s m) + + | trans_bgt: forall c p1 ofs. codeseq_at c p1 (ibgt ofs) -> + forall s m n1 n2. transition c (VMS p1 (push n2 (push n1 s)) m) + (VMS (if n1 <= n2 then p1 + 1 else p1 + 1 + ofs) s m) + + | trans_branch: forall c p ofs. codeseq_at c p (ibranch ofs) -> + forall s m. transition c (VMS p s m) (VMS (p + 1 + ofs) s m) + + (* As usual with small-step semantics, we form sequences of machine + transitions to define the behavior of a code. We always start with pc + = 0 and an empty evaluation stack. We stop successfully if pc points + to an Ihalt instruction and the evaluation stack is empty. *) + + clone export ReflTransClosure with type parameter = code, + type state = machine_state, predicate transition = transition + + predicate vm_terminates (c:code) (mi mf:state) = + exists p. codeseq_at c p ihalt /\ + transition_star c (VMS 0 Nil mi) (VMS p Nil mf) + + predicate vm_terminates_non_empty (c:code) (mi mf:state) = + exists p s. codeseq_at c p ihalt /\ + transition_star c (VMS 0 Nil mi) (VMS p s mf) + +end + +theory Vm_test + + use Vm + + constant m0 : state = (const 0)[Id 1 <- 2] + constant c : code = ivar (Id 1) ++ (iconst 1 ++ (iadd ++ ihalt)) + + function (::) (i : 'a) (l : list 'a) : list 'a = Cons i l + + lemma cs_0 : codeseq_at c 0 (ivar (Id 1)) + lemma cs_1 : codeseq_at c 1 (iconst 1) + lemma cs_2 : codeseq_at c 2 iadd + lemma cs_3 : codeseq_at c 3 ihalt + + lemma g1 : (* 0 -> 1 *) + transition c (VMS 0 Nil m0) (VMS 1 (2 :: Nil) m0) + + lemma g2 : (* 1 -> 2 *) + transition c (VMS 1 (2::Nil) m0) (VMS 2 (1::(2 :: Nil)) m0) + + lemma g2_trans : (* 0 -> 2 *) + transition_star c (VMS 0 Nil m0) (VMS 2 (1::(2 :: Nil)) m0) + + lemma g3 : (* 2 -> 3 *) + transition c (VMS 2 (1::(2::Nil)) m0) (VMS 3 (3::Nil) m0) + + goal g3_trans : (* 0 -> 3 *) + transition_star c (VMS 0 Nil m0) (VMS 3 (3::Nil) m0) + + goal g_term : + vm_terminates_non_empty c m0 m0 + +end + + +theory Vm_test2 + + use Vm + + constant m0 : state = (const 0)[Id 1 <- 2] + constant c : code = ivar (Id 1) ++ (iconst 1 ++ (iadd ++ (isetvar (Id 2) ++ (ihalt)))) + + function (::) (i : 'a) (l : list 'a) : list 'a = Cons i l + + lemma cs_0 : codeseq_at c 0 (ivar (Id 1)) + lemma cs_1 : codeseq_at c 1 (iconst 1) + lemma cs_2 : codeseq_at c 2 iadd + lemma cs_3 : codeseq_at c 3 (isetvar (Id 2)) + lemma cs_4 : codeseq_at c 4 ihalt + + lemma g1 : + transition c (VMS 0 Nil m0) (VMS 1 (2 :: Nil) m0) + + lemma g2 : + transition c (VMS 1 (2::Nil) m0) (VMS 2 (1::(2 :: Nil)) m0) + + lemma g2_trans : + transition_star c (VMS 0 Nil m0) (VMS 2 (1::(2 :: Nil)) m0) + + lemma g3 : + transition c (VMS 2 (1::(2::Nil)) m0) (VMS 3 (3::Nil) m0) + + goal g3_trans : + transition_star c (VMS 0 Nil m0) (VMS 3 (3::Nil) m0) + + lemma g4 : + transition c (VMS 3 (3::Nil) m0) (VMS 4 Nil m0[Id 2<-3]) + + goal g4_trans : + transition_star c (VMS 0 Nil m0) (VMS 4 Nil m0[Id 2<-3]) + + goal g_term : + vm_terminates c m0 m0[Id 2<-3] + +end + +theory Vm_test3 + + use Vm + + constant m0 : state = (const 0)[Id 1 <- 2] + constant c : code = ibranch 1 ++ (iconst 1 ++ ihalt) + + function (::) (i : 'a) (l : list 'a) : list 'a = Cons i l + + lemma cs_0 : codeseq_at c 0 (ibranch 1) + lemma cs_1 : codeseq_at c 1 (iconst 1) + lemma cs_2 : codeseq_at c 2 ihalt + + lemma g1 : + transition c (VMS 0 Nil m0) (VMS 2 Nil m0) + + goal g_term : + vm_terminates_non_empty c m0 m0 + +end + diff --git a/examples/vm_simple.mlw b/examples/vm_simple.mlw new file mode 100644 index 0000000..d6898b2 --- /dev/null +++ b/examples/vm_simple.mlw @@ -0,0 +1,95 @@ +theory VM_simple + + use export int.Int + use export list.List + + type stack = list int + + type instr = + | Iconst int (* push n on stack *) + | Iadd (* pop two values, push their sum *) + | Isub (* pop two values, push their difference *) + + function pop (st : stack) : (int, stack) = + match st with + | Nil -> (0, st) + | Cons c st' -> (c, st') + end + + function push (v : int) (st : stack) : stack = Cons v st + + function fconst (v : int) (st : stack) : stack = push v st + + function fadd (st : stack) : stack = + let (a1, st1) = pop st in + let (a2, st2) = pop st1 in + push (a1 + a2) st2 + + function fsub (st : stack) : stack = + let (a1, st1) = pop st in + let (a2, st2) = pop st1 in + push (a2 - a1) st2 + +end + +theory VM_simple_test + + use VM_simple + + goal g1 : (* 1 + 2 = 3 *) + fadd (fconst 2 (fconst 1 Nil)) = Cons 3 Nil + + goal g2 : (* 2 - 1 = 1 *) + fsub (fconst 1 (fconst 2 Nil)) = Cons 1 Nil + + goal g3 : (* 3 - (1 + 2) = 0 *) + fsub (fadd (fconst 2 (fconst 1 (fconst 3 Nil)))) = Cons 0 Nil + + goal g4 : (* (3 - 1) + 2 = 4 *) + fadd (fconst 2 (fsub (fconst 1 (fconst 3 Nil)))) = Cons 4 Nil + +end + + +theory VM_simple_list + + use export VM_simple + + function vm_i (i : instr) (st : stack) : stack = + match i with + | Iconst v -> fconst v st + | Iadd -> fadd st + | Isub -> fsub st + end + + function vm (il : list instr) (st : stack) : stack = + match il with + | Nil -> st + | Cons i il' -> vm il' (vm_i i st ) + end + +end + +theory VM_simple_list_test + + use VM_simple_list + function (::) (i : 'a) (l : list 'a) : list 'a = Cons i l + + goal g1 : (* 1 + 2 = 3 *) + vm (Iconst 1 :: (Iconst 2 :: (Iadd :: Nil))) Nil = 3 :: Nil + + goal g2 : (* 2 - 1 = 1 *) + vm (Iconst 2 :: (Iconst 1 :: (Isub :: Nil))) Nil = 1 :: Nil + + goal g3 : (* 3 - (1 + 2) = 0 *) + vm (Iconst 3 :: (Iconst 1 :: (Iconst 2 :: (Iadd :: (Isub :: Nil))))) Nil + = 0 :: Nil + + goal g4 : (* (3 - 1) + 2 = 4 *) + vm (Iconst 3 :: (Iconst 1 :: (Isub :: (Iconst 2 :: (Iadd :: Nil))))) Nil + = 4 :: Nil + +end + + + diff --git a/examples/vm_simple/why3session.xml b/examples/vm_simple/why3session.xml new file mode 100644 index 0000000..83ad4d6 --- /dev/null +++ b/examples/vm_simple/why3session.xml @@ -0,0 +1,132 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE why3session PUBLIC "-//Why3//proof session v5//EN" +"http://why3.lri.fr/why3session.dtd"> +<why3session shape_version="5"> +<prover id="0" name="Alt-Ergo" version="2.0.0" timelimit="10" steplimit="0" memlimit="1000"/> +<prover id="1" name="Z3" version="4.7.1" alternative="counterexamples" timelimit="10" steplimit="0" memlimit="1000"/> +<prover id="2" name="Eprover" version="2.0" timelimit="10" steplimit="0" memlimit="1000"/> +<file name="../vm_ind.mlw" proved="true"> +<theory name="ReflTransClosure" proved="true"> + <goal name="transition_star_one" proved="true"> + <proof prover="2"><result status="valid" time="0.01"/></proof> + </goal> + <goal name="transition_star_transitive" proved="true"> + <transf name="induction_pr" proved="true" > + <goal name="transition_star_transitive.0" proved="true"> + <proof prover="0"><result status="valid" time="0.00" steps="5"/></proof> + </goal> + <goal name="transition_star_transitive.1" proved="true"> + <proof prover="0"><result status="valid" time="0.00" steps="11"/></proof> + </goal> + </transf> + </goal> +</theory> +<theory name="VM_ind_test" proved="true"> + <goal name="c0" proved="true"> + <proof prover="0"><result status="valid" time="0.01" steps="5"/></proof> + </goal> + <goal name="c1" proved="true"> + <proof prover="0"><result status="valid" time="0.01" steps="10"/></proof> + </goal> + <goal name="c2" proved="true"> + <proof prover="0"><result status="valid" time="0.01" steps="31"/></proof> + </goal> + <goal name="c3" proved="true"> + <proof prover="0"><result status="valid" time="0.01" steps="41"/></proof> + </goal> + <goal name="g1" proved="true"> + <proof prover="1"><result status="valid" time="0.02"/></proof> + </goal> + <goal name="g2" proved="true"> + <proof prover="0"><result status="valid" time="0.02" steps="55"/></proof> + </goal> + <goal name="g3" proved="true"> + <proof prover="0"><result status="valid" time="0.02" steps="64"/></proof> + </goal> + <goal name="g3_trans" proved="true"> + <proof prover="0"><result status="valid" time="0.07" steps="185"/></proof> + </goal> + <goal name="g_term" proved="true"> + <proof prover="0"><result status="valid" time="0.01" steps="46"/></proof> + </goal> +</theory> +</file> +<file name="../state.mlw" proved="true"> +<theory name="State" proved="true"> + <goal name="VC get" expl="VC for get" proved="true"> + <proof prover="0"><result status="valid" time="0.00" steps="1"/></proof> + </goal> + <goal name="VC set" expl="VC for set" proved="true"> + <proof prover="0"><result status="valid" time="0.00" steps="1"/></proof> + </goal> + <goal name="VC mixfix []" expl="VC for mixfix []" proved="true"> + <proof prover="0"><result status="valid" time="0.00" steps="1"/></proof> + </goal> + <goal name="VC mixfix [<-]" expl="VC for mixfix [<-]" proved="true"> + <proof prover="0"><result status="valid" time="0.00" steps="1"/></proof> + </goal> + <goal name="VC const" expl="VC for const" proved="true"> + <proof prover="0"><result status="valid" time="0.00" steps="2"/></proof> + </goal> +</theory> +<theory name="Reg" proved="true"> + <goal name="VC read" expl="VC for read" proved="true"> + <proof prover="0"><result status="valid" time="0.00" steps="1"/></proof> + </goal> + <goal name="VC write" expl="VC for write" proved="true"> + <proof prover="0"><result status="valid" time="0.00" steps="1"/></proof> + </goal> + <goal name="VC const" expl="VC for const" proved="true"> + <proof prover="0"><result status="valid" time="0.00" steps="2"/></proof> + </goal> +</theory> +</file> +<file name="../vm_mem.mlw" proved="true"> +<theory name="VM_mem_test" proved="true"> + <goal name="g1" proved="true"> + <proof prover="0"><result status="valid" time="0.01" steps="29"/></proof> + </goal> + <goal name="g2" proved="true"> + <proof prover="0"><result status="valid" time="0.01" steps="32"/></proof> + </goal> +</theory> +<theory name="VM_mem_list_test" proved="true"> + <goal name="g1" proved="true"> + <proof prover="0"><result status="valid" time="0.04" steps="138"/></proof> + </goal> + <goal name="g2" proved="true"> + <proof prover="0"><result status="valid" time="0.03" steps="137"/></proof> + </goal> +</theory> +</file> +<file name="../vm_simple.mlw" proved="true"> +<theory name="VM_simple_test" proved="true"> + <goal name="g1" proved="true"> + <proof prover="0" timelimit="1"><result status="valid" time="0.01" steps="21"/></proof> + </goal> + <goal name="g2" proved="true"> + <proof prover="0" timelimit="1"><result status="valid" time="0.01" steps="21"/></proof> + </goal> + <goal name="g3" proved="true"> + <proof prover="0" timelimit="1"><result status="valid" time="0.02" steps="44"/></proof> + </goal> + <goal name="g4" proved="true"> + <proof prover="0" timelimit="1"><result status="valid" time="0.01" steps="31"/></proof> + </goal> +</theory> +<theory name="VM_simple_list_test" proved="true"> + <goal name="g1" proved="true"> + <proof prover="0" timelimit="1"><result status="valid" time="0.03" steps="113"/></proof> + </goal> + <goal name="g2" proved="true"> + <proof prover="0" timelimit="1"><result status="valid" time="0.03" steps="113"/></proof> + </goal> + <goal name="g3" proved="true"> + <proof prover="0" timelimit="1"><result status="valid" time="0.07" steps="224"/></proof> + </goal> + <goal name="g4" proved="true"> + <proof prover="0" timelimit="1"><result status="valid" time="0.07" steps="227"/></proof> + </goal> +</theory> +</file> +</why3session> diff --git a/examples/vm_simple/why3session.xml.bak b/examples/vm_simple/why3session.xml.bak new file mode 100644 index 0000000..fd93fcb --- /dev/null +++ b/examples/vm_simple/why3session.xml.bak @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE why3session PUBLIC "-//Why3//proof session v5//EN" +"http://why3.lri.fr/why3session.dtd"> +<why3session shape_version="5"> +<prover id="0" name="Alt-Ergo" version="2.0.0" timelimit="1" steplimit="0" memlimit="1000"/> +<file name="../vm_simple.mlw" proved="true"> +<theory name="VM_simple_test" proved="true"> + <goal name="g1" proved="true"> + <proof prover="0"><result status="valid" time="0.01" steps="21"/></proof> + </goal> + <goal name="g2" proved="true"> + <proof prover="0"><result status="valid" time="0.01" steps="21"/></proof> + </goal> + <goal name="g3" proved="true"> + <proof prover="0"><result status="valid" time="0.02" steps="44"/></proof> + </goal> + <goal name="g4" proved="true"> + <proof prover="0"><result status="valid" time="0.01" steps="31"/></proof> + </goal> +</theory> +<theory name="VM_simple_list_test" proved="true"> + <goal name="g1" proved="true"> + <proof prover="0"><result status="valid" time="0.03" steps="113"/></proof> + </goal> + <goal name="g2" proved="true"> + <proof prover="0"><result status="valid" time="0.03" steps="113"/></proof> + </goal> + <goal name="g3" proved="true"> + <proof prover="0"><result status="valid" time="0.07" steps="224"/></proof> + </goal> + <goal name="g4" proved="true"> + <proof prover="0"><result status="valid" time="0.07" steps="227"/></proof> + </goal> +</theory> +</file> +</why3session> diff --git a/examples/vm_simple/why3shapes.gz b/examples/vm_simple/why3shapes.gz new file mode 100644 index 0000000000000000000000000000000000000000..7899402116a3e26b0ad9aca419da93ef5386d71e GIT binary patch literal 1143 zcmb2|=3oGW|4YMs`=!l!_WllkBd?(lxX6V~_kz*^rs|g~KP=T?@=}s!j#S^Ep84zj z>B#gqU*F|4nXn&L&io-~Ki|zmBkEdEk(WgkuUQfc_bj(XS>{HvDfM@JcYptFe%zDq z_J-c*9o1WEZ|%GrpweMmwl2_Tm8V(i%R5sRO$ofd@Y3B=W^3~8FMMG$O%-cCuxx_v zCcf;8B}a4=*IazC^>}#Wn{V5G*L?2Qznt25yC(8T?!LWy?@EY2y)$=?Lo(;JR_#Jv z!`@q**E?Q+7rLJPsAzYZ-~Dc{=sj+K-_ET3G~;w=<Ylw`i;vqv&L%CnQR1L=Pm-<q z^9li*H&%IKDL4J|t0(A{&wrv&zWBH=Yx5%8BpFjhQSQj*Nnwp_A&0l-&dL4#`)^^< zWe?6mmBlv{mrvN>^7=|Z)3ZrGIyKKMGdk9$?2_Xr&SQBb&}4V4E_18k#C2yc<$Mdf z=PT{habZ%CziFqb&IJoc>3{=scf5)-|MmEBd-*JzTldS~Ke5w!{e$)IRqgLDO14OL zwl6HnmndQW`cp&BH#3U4pq8<cHPf=`^hK%p>Q;e$iiIXpF4w$0EU#EJJy(8Zb^p5K z^zE0PYUtLuUafj(IYDjh%80XFC!+!sxeuLx_UP%CwFkMATI1aEaswW#&Dg}#voS*6 zO8m>^zq390zwh4bQ&qFMTx{=ugTJp$`rdHNylB0=EhwAqjYOw~Aiq$~(biXKzkeOO zC!hE4TIQ{Swnx8?9`rD*Hd)D2@Hyz2Qc_%;-8uc`FV?>J$SkBK`cU!S;hkS!q*Olm z^y%-r&obBM*ZWHI7%Q0?yKWBRiCSk-6zILRv@+|{Xa78r1I>L8UaXmyqUv>ZzJi(9 zd*!$uxwPkZ9;Aoa=Fk0CKbN&kIxm*1iN8WkH2wX&Q2DP`6E^-l@$-bpH^pVFe-{`n z>s7Dk@qG0*rnhRD%&x@qhfhCx_MGK!@eSWs#YY1JXS%6pIWO40?4+x)`Zq7BHM{MC zYY%7pM;3QZ=$ps2UQ2P>o0Z2+_S|9BZ_azS@rHP8q}+om#r(YccuzmtI)84|c}ugC z#)4<JE@u$jwdTu3Vetc5cam4>2kHDO&wG3PL=n&IFn1ocg_jLB?R2~-AN=9S=JK-r z3iZ3}&mURT`yof&?$%7(N}JFRCClc-aXp>oVPrZfusyqwf2wUj-VA}b1@`S<7yo(T z6k*|zH_z*<W9Pacxmx*!yOKUuB|V(<Q1bbti@w2*r|yO*m+zPV^XP++<i_%%%$)uY zee$=x^yhq(Tkv-kzhji#;i;1YV^c3BFn(B=yK~AXk^H+S_4!{m{aa8jy&@)JMe6^K z3t>(fN_SI>8+Ki|`XlK}_C9;3^ZYLYg<D@eUft_;d{N8FY~2GFZf<?KdhOReTQ&sU z`dJ<uGTrp;-Tb)!S`ud_*dCbY{eAWQlesteO}@x{HNF-+*DLJ5+RD1^tl?8G6~EQE z=l8EvF)I6~R`xIXi}i<B2iLmuG47n1JvZJmhS9S9QF~&=!q&P2t7m@QtzGh}`#(eb L?EO5ixEUA#z~Vhc literal 0 HcmV?d00001 diff --git a/examples/vm_simple/why3shapes.gz.bak b/examples/vm_simple/why3shapes.gz.bak new file mode 100644 index 0000000000000000000000000000000000000000..1e48fe050851d7d73db8b72fee23aaac8079dfc0 GIT binary patch literal 322 zcmb2|=3oGW|4S$N`Z*i&w0yU9?SEjgQ8qm3XcupJfsFeqmefE8nfc#;IcsaU9#Fb; zV&Xo@bf+f=xFV!Zc3jfD`cU$Owa5C<>D%u0e7*hYSlidU!}HB<rypPJQMSKs!)?#% zc~2L$2I|@=O|o)Pd}UM;5}I|VWX{KJ`fpo)GSq)4dvP>?A$w_g+Zqu^({j@zhKoeg z{+-z^^GV@TC!e)d*QTgkRYRBLhO}okOOh9CUXs6k|CGNyab;gbb~a5pb5YB>Fyxfn zp%pJ)EuH&feLwrosGD~Me^)l8PqsY!#%%uMFBcdbcO=icC%ao~TBf7^n}?Z3^0hIg zM^{@uTf2Y9yXr?m7XuxHIQ+|8=j8nIYdh=IvVPYy`<(yIt7`Y}Wtgz7@m_=rt0(t| e63$w!Td(Yc&aT^^m+@c!9^*~+XJRGH3=9B+iJqAN literal 0 HcmV?d00001 -- GitLab