Built with Alectryon, running Coq+SerAPI v8.12.0+0.12.0. Coq sources are in this panel; goals and messages will appear in the other. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑ Ctrl+↓ to navigate, Ctrl+🖱️ to focus.
Require Import POCS. Require Import VariablesAPI. Require Import StatDbAPI.
An implementation of StatDB
Module StatDB (v : VarsAPI) <: StatDbAPI. Import ListNotations. Definition add (v : nat) : proc unit := sum <- v.read VarY; count <- v.read VarX; _ <- v.write VarY (sum + v); _ <- v.write VarX (count + 1); Ret tt.
Definition mean : proc (option nat) := Ret None. Definition init' : proc InitResult := _ <- v.write VarX 0; _ <- v.write VarY 0; Ret Initialized. Definition init := then_init v.init init'. Definition recover : proc unit := v.recover.
Definition statdb_abstraction (vars_state : VariablesAPI.State) (statdb_state : StatDbAPI.State) : Prop := True. Definition abstr : Abstraction StatDbAPI.State := abstraction_compose v.abstr {| abstraction := statdb_abstraction |}.statdb_abstraction {| StateX := 1; StateY := 3; StateZ := 0 |} [3]statdb_abstraction {| StateX := 1; StateY := 3; StateZ := 0 |} [3]lia. (* this works for our abstraction relation *) Qed.True
statdb_abstraction {| StateX := 2; StateY := 3; StateZ := 0 |} [1; 2]statdb_abstraction {| StateX := 2; StateY := 3; StateZ := 0 |} [1; 2]Admitted.Truestatdb_abstraction {| StateX := 0; StateY := 0; StateZ := 0 |} []Admitted.statdb_abstraction {| StateX := 0; StateY := 0; StateZ := 0 |} []~ statdb_abstraction {| StateX := 1; StateY := 0; StateZ := 0 |} [2]~ statdb_abstraction {| StateX := 1; StateY := 0; StateZ := 0 |} [2]Admitted.~ True~ statdb_abstraction {| StateX := 1; StateY := 0; StateZ := 0 |} []~ statdb_abstraction {| StateX := 1; StateY := 0; StateZ := 0 |} []Admitted.~ Trueinit_abstraction init recover abstr initedinit_abstraction init recover abstr initedproc_spec (fun (_ : unit) (state : VariablesAPI.State) => {| pre := inited_any state; post := fun (r : InitResult) (state' : VariablesAPI.State) => match r with | Initialized => exists state'' : State, abstraction {| abstraction := statdb_abstraction |} state' state'' /\ inited state'' | InitFailed => True end; recovered := fun (_ : unit) (_ : VariablesAPI.State) => True |}) init' v.recover v.abstrproc_spec (fun (_ : unit) (state : VariablesAPI.State) => {| pre := inited_any state; post := fun (r : InitResult) (state' : VariablesAPI.State) => match r with | Initialized => exists state'' : State, abstraction {| abstraction := statdb_abstraction |} state' state'' /\ inited state'' | InitFailed => True end; recovered := fun (_ : unit) (_ : VariablesAPI.State) => True |}) (_ <- v.write VarX 0; _ <- v.write VarY 0; Ret Initialized) v.recover v.abstra':unitstate:VariablesAPI.StateH:inited_any stater:unitLexec:Marker "after" (v.write VarX 0)proc_spec (fun (_ : unit) (state' : VariablesAPI.State) => {| pre := r = tt /\ state' = {| StateX := 0; StateY := StateY state; StateZ := StateZ state |}; post := fun (r' : InitResult) (state'' : VariablesAPI.State) => match r' with | Initialized => exists state''0 : State, statdb_abstraction state'' state''0 /\ inited state''0 | InitFailed => True end; recovered := fun (_ : unit) (_ : VariablesAPI.State) => True |}) (_ <- v.write VarY 0; Ret Initialized) v.recover v.abstra':unitstate:VariablesAPI.StateH:inited_any stateLexec:Marker "after" (v.write VarX 0)a'0, r:unitLexec0:Marker "after" (v.write VarY 0)proc_spec (fun (_ : unit) (state' : VariablesAPI.State) => {| pre := r = tt /\ state' = {| StateX := StateX {| StateX := 0; StateY := StateY state; StateZ := StateZ state |}; StateY := 0; StateZ := StateZ {| StateX := 0; StateY := StateY state; StateZ := StateZ state |} |}; post := fun (r' : InitResult) (state'' : VariablesAPI.State) => match r' with | Initialized => exists state''0 : State, statdb_abstraction state'' state''0 /\ inited state''0 | InitFailed => True end; recovered := fun (_ : unit) (_ : VariablesAPI.State) => True |}) (Ret Initialized) v.recover v.abstra':unitstate:VariablesAPI.StateH:inited_any stateLexec:Marker "after" (v.write VarX 0)a'0:unitLexec0:Marker "after" (v.write VarY 0)a:unitLexec1:Marker "post" (Ret Initialized)exists state'' : State, statdb_abstraction {| StateX := 0; StateY := 0; StateZ := StateZ state |} state'' /\ inited state''a':unitstate:VariablesAPI.StateH:inited_any stateLexec:Marker "after" (v.write VarX 0)a'0:unitLexec0:Marker "after" (v.write VarY 0)a:unitLexec1:Marker "post" (Ret Initialized)statdb_abstraction {| StateX := 0; StateY := 0; StateZ := StateZ state |} [] /\ inited []intuition. Qed.a':unitstate:VariablesAPI.StateH:inited_any stateLexec:Marker "after" (v.write VarX 0)a'0:unitLexec0:Marker "after" (v.write VarY 0)a:unitLexec1:Marker "post" (Ret Initialized)True /\ [] = []
forall v : nat, proc_spec (add_spec v) (add v) recover abstrforall v : nat, proc_spec (add_spec v) (add v) recover abstrforall v : nat, proc_spec (add_spec v) (sum <- v.read VarY; count <- v.read VarX; _ <- v.write VarY (sum + v); _ <- v.write VarX (count + 1); Ret tt) recover abstrv:natproc_spec (add_spec v) (sum <- v.read VarY; count <- v.read VarX; _ <- v.write VarY (sum + v); _ <- v.write VarX (count + 1); Ret tt) recover abstrAdmitted. Opaque Nat.div.v:natproc_spec (fun '(_, state2) (state : VariablesAPI.State) => {| pre := True /\ statdb_abstraction state state2; post := fun (v0 : unit) (state' : VariablesAPI.State) => exists state2' : State, (v0 = tt /\ state2' = v :: state2) /\ statdb_abstraction state' state2'; recovered := fun (_ : unit) (state' : VariablesAPI.State) => exists state2' : State, False /\ statdb_abstraction state' state2' |}) (sum <- v.read VarY; count <- v.read VarX; _ <- v.write VarY (sum + v); _ <- v.write VarX (count + 1); Ret tt) recover v.abstr
proc_spec mean_spec mean recover abstrproc_spec mean_spec mean recover abstrproc_spec mean_spec (Ret None) recover abstrproc_spec mean_spec (Ret None) recover abstrAdmitted.proc_spec (fun '(_, state2) (state : VariablesAPI.State) => {| pre := True /\ statdb_abstraction state state2; post := fun (v : option nat) (state' : VariablesAPI.State) => exists state2' : State, (state2' = state2 /\ (state2 = [] /\ v = None \/ state2 <> [] /\ v = Some (fold_right Init.Nat.add 0 state2 / length state2))) /\ statdb_abstraction state' state2'; recovered := fun (_ : unit) (state' : VariablesAPI.State) => exists state2' : State, False /\ statdb_abstraction state' state2' |}) (Ret None) recover v.abstrrec_wipe recover abstr no_crashrec_wipe recover abstr no_crashforall (T : Type) (v : T), proc_spec (fun (_ : unit) (state : State) => {| pre := True; post := fun (r : T) (state' : State) => r = v /\ state' = state; recovered := fun (_ : unit) (state' : State) => no_crash state state' |}) (Ret v) recover abstrT:Typev:Tproc_spec (fun (_ : unit) (state : State) => {| pre := True; post := fun (r : T) (state' : State) => r = v /\ state' = state; recovered := fun (_ : unit) (state' : State) => no_crash state state' |}) (Ret v) recover abstrT:Typev:Tproc_spec (fun '(_, state2) (state : VariablesAPI.State) => {| pre := True /\ statdb_abstraction state state2; post := fun (v0 : T) (state' : VariablesAPI.State) => exists state2' : State, (v0 = v /\ state2' = state2) /\ statdb_abstraction state' state2'; recovered := fun (_ : unit) (state' : VariablesAPI.State) => exists state2' : State, no_crash state2 state2' /\ statdb_abstraction state' state2' |}) (Ret v) recover v.abstrT:Typev:Ta0:unitstate2:Statestate:VariablesAPI.StateH:TrueH0:statdb_abstraction state state2Lexec:Marker "post" (Ret v)exists state2' : State, (v = v /\ state2' = state2) /\ statdb_abstraction state state2'T:Typev:Ta0:unitstate2:Statestate:VariablesAPI.StateH:TrueH0:statdb_abstraction state state2Lexec:Marker "post" (Ret v)state':VariablesAPI.StateH1:Falser:unitexists state2' : State, False /\ statdb_abstraction state' state2'T:Typev:Ta0:unitstate2:Statestate:VariablesAPI.StateH:TrueH0:statdb_abstraction state state2Lexec:Marker "post" (Ret v)exists state2' : State, (v = v /\ state2' = state2) /\ statdb_abstraction state state2'eauto.T:Typev:Ta0:unitstate2:Statestate:VariablesAPI.StateH:TrueH0:statdb_abstraction state state2Lexec:Marker "post" (Ret v)(v = v /\ state2 = state2) /\ statdb_abstraction state state2T:Typev:Ta0:unitstate2:Statestate:VariablesAPI.StateH:TrueH0:statdb_abstraction state state2Lexec:Marker "post" (Ret v)state':VariablesAPI.StateH1:Falser:unitexists state2' : State, False /\ statdb_abstraction state' state2'T:Typev:Ta0:unitstate2:Statestate:VariablesAPI.StateH:TrueH0:statdb_abstraction state state2Lexec:Marker "post" (Ret v)state':VariablesAPI.StateH1:Falser:unitexists state2' : State, False /\ statdb_abstraction state' state2'eauto. } Qed. End StatDB. Require Import VariablesImpl. Module StatDBImpl := StatDB Vars.T:Typev:Ta0:unitstate2:Statestate:VariablesAPI.StateH:TrueH0:statdb_abstraction state state2Lexec:Marker "post" (Ret v)state':VariablesAPI.StateH1:Falser:unitFalse