Library Machine
Require
Import
List TheoryList Wf.
Require
Import
ListUtil.
Set Implicit
Arguments.
Section
reachable.
Variables
instruction state : Set.
Variable
program : list instruction.
Variable
pc : state -> nat.
Variable
exec : instruction -> state -> state.
Inductive
reachable : state -> state -> Prop :=
| R_Done : forall s, reachable s s
| R_Step : forall s s' i,
nth_spec program (pc s) i
-> reachable (exec i s) s'
-> reachable s s'.
Inductive
reachable_flowInsensitive : state -> state -> Prop :=
| Rfi_Done : forall s, reachable_flowInsensitive s s
| Rfi_Step : forall s s' i,
In i program
-> reachable_flowInsensitive (exec i s) s'
-> reachable_flowInsensitive s s'.
Hint
Constructors reachable_flowInsensitive.
Theorem
flowInsensitive_is_conservative :
forall s s', reachable s s'
-> reachable_flowInsensitive s s'.
Section
approx.
Variable
approx : state -> state -> Prop.
Variable
approxStrict : state -> state -> Prop.
Hypothesis
approx_refl : forall s,
approx s s.
Hypothesis
approx_trans : forall s1 s2 s3,
approx s1 s2
-> approx s2 s3
-> approx s1 s3.
Hypothesis
increasing : forall s ins,
approx s (exec ins s).
Hypothesis
monotonic : forall s1 s2 ins,
approx s1 s2
-> approx (exec ins s1) (exec ins s2).
Section
fixed_point.
Variable
fp : state.
Hypothesis
fp_ok : forall ins,
In ins program
-> approx (exec ins fp) fp.
Theorem
fixed_point_ok : forall s,
approx s fp
-> forall s', reachable_flowInsensitive s s'
-> approx s' fp.
End
fixed_point.
Hypothesis
approxStrict_approx : forall s1 s2,
approx s2 s1
-> ~approxStrict s1 s2
-> approx s1 s2.
Hypothesis
approxStrict_trans : forall s1 s2 s3,
approx s2 s1
-> approxStrict s2 s3
-> approxStrict s1 s3.
Variable
approxStrict_dec : forall x y, {approxStrict x y} + {~approxStrict x y}.
Hypothesis
approxStrict_wf : well_founded approxStrict.
Variable
init : state.
Hypothesis
init_low : forall s, approx init s.
Lemma
iterate_approx : forall prog s,
approx s (fold_left (fun s ins => exec ins s) prog s).
Hint
Resolve iterate_approx.
Lemma
iterate_pick' : forall ins prog s s',
In ins prog
-> approx s s'
-> approxStrict (exec ins s) s
-> approxStrict
(fold_left (fun st ins => exec ins st)
prog s') s.
Lemma
iterate_pick_cp : forall ins s,
In ins program
-> approxStrict (exec ins s) s
-> approxStrict
(fold_left (fun st ins => exec ins st)
program s) s.
Lemma
iterate_pick : forall ins s,
In ins program
-> ~approxStrict
(fold_left (fun st ins => exec ins st)
program s) s
-> ~approxStrict (exec ins s) s.
Definition
iterate : {fp : state
| approx init fp
/\ forall ins,
In ins program
-> approx (exec ins fp) fp}.
Definition
fixed_point : {fp : state
| forall s, reachable_flowInsensitive init s
-> approx s fp}.
End
approx.
End
reachable.
Index
This page has been generated by coqdoc