Cubicle BRAB in Why3 index


theory Reachability

   use import fol.FOL

   type trans_rel
   
   (* Just for instantiation *)
   constant tau : trans_rel

   function pre trans_rel t : t
 
   axiom pre_false : forall tau:trans_rel. pre tau ffalse = ffalse
   

   function pre_star trans_rel t : t
     
   axiom pre_star_def1 : forall tau : trans_rel. forall f : t.
                         valid (f => pre_star tau f)
   axiom pre_star_def2 : forall tau : trans_rel. forall f : t.
                         pre tau (pre_star tau f) = pre_star tau f
   axiom pre_star_def3 : forall tau : trans_rel. forall f : t.
                         pre_star tau (pre_star tau f) = pre_star tau f
   axiom pre_star_def4 : forall tau : trans_rel. forall f : t.
                         ((pre_star tau (pre tau f)) ++ f) = pre_star tau f

   axiom pre_and :
   forall tau : trans_rel.
     forall f1 f2 : t. pre tau (f1 & f2) = (pre tau f1) & (pre tau f2)
     
   axiom pre_or :
   forall tau : trans_rel.
     forall f1 f2 : t. pre tau (f1 ++ f2) = (pre tau f1) ++ (pre tau f2)

     
   axiom pre_star_false : 
   forall tau : trans_rel. pre_star tau ffalse = ffalse
   
   axiom pre_star_and :
   forall tau : trans_rel.
     forall f1 f2 : t.
     pre_star tau (f1 & f2) = (pre_star tau f1) & (pre_star tau f2)
     
   axiom pre_star_or :
   forall tau : trans_rel.
     forall f1 f2 : t. 
     pre_star tau (f1 ++ f2) = (pre_star tau f1) ++ (pre_star tau f2)
     
   predicate reachable (* trans_rel t t *)
   (tau:trans_rel) (init : t) (f : t) = sat ((pre_star tau f) & init)
   
   axiom reachable_def :
   forall tau : trans_rel.
     forall init f : t. sat ((pre_star tau f) & init) -> reachable tau init f 
            
   lemma directly_reachable :
   forall tau : trans_rel.
     forall init f : t. sat (f & init) -> reachable tau init f 
   
   lemma false_unreachable :
   forall tau : trans_rel.
     forall init : t. not (reachable tau init ffalse)

   lemma reachable_or :
   forall tau : trans_rel.
     forall f1 f2 init :t.
       reachable tau init (f1 ++ f2) <->
         reachable tau init f1 \/ reachable tau init f2
       
   lemma reachable_and :
   forall tau : trans_rel.
     forall f1 f2 init :t.
       reachable tau init (f1 & f2) ->
         reachable tau init f1 /\ reachable tau init f2

   lemma reachable_imply:
   forall tau : trans_rel.
     forall x f init : t.
       valid (x => f) -> reachable tau init x -> reachable tau init f

   lemma reachable_bigger:
   forall tau : trans_rel.
     forall f1 f2 init : t.
       f1 |== f2 -> reachable tau init f1 -> reachable tau init f2

   lemma pre_star_bigger:
   forall tau : trans_rel.
     forall f1 f2 : t.
       f1 |== f2 -> pre_star tau f1 |== pre_star tau f2
       
   lemma reachable_by_pre:
   forall tau : trans_rel.
     forall f init : t. reachable tau init (pre tau f) -> reachable tau init f

end

Generated by why3doc 0.82+git