<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="../../../unit.xsl"?>
<KIVSPEC name="IOconbackward-INV"><SPECBODY>enrich <a href="../../../specs/IO-ADT-basic/export/unit.xml">IO-ADT-basic</a> , 
       <a href="../../../specs/IO-CDT-basic/export/unit.xml">IO-CDT-basic</a> with
   
   predicates 
      T : cstate × astate;
      IT : cinput × ainput;
      OT : coutput × aoutput;
      CINV : cstate;
      AINV : astate;
   variables 
      as' : astate; 
      cs' : cstate; 
   
   axioms 
      init-cinv : CINIT(cs) ⊦ CINV(cs);
      init-ainv : AINIT(as) ⊦ AINV(as);
      cinv-ok : CINV(cs), COP(i)(cin, cs, cs', cou) ⊦ CINV(cs');
      ainv-ok : AINV(as), AOP(i)(ain, as, as', aou) ⊦ AINV(as');
      total-init-state :  ⊦ ∃ cs. CINIT(cs);
      total-init-input :  ⊦ ∃ cin. CIN(gin, cin);
      init-state : CINIT(cs), T(cs, as) ⊦ AINIT(as);
      init-input : CIN(gin, cin), IT(cin, ain) ⊦ AIN(gin, ain);
      correctness
      : CINV(cs), COP(i)(cin, cs, cs', cou), T(cs', as'), AINV(as'), OT(cou, aou), 
        ∀ as, ain. T(cs, as) ∧ AINV(as) ∧ IT(cin, ain) → dom(AOP(i))(ain, as)
        ⊦ 
        ∃ as, ain. IT(cin, ain) ∧ T(cs, as) ∧ AINV(as) ∧ AOP(i)(ain, as, as', aou)
      ;
      corr-appl : CINV(cs), ¬ dom(COP(i))(cin, cs) ⊦ ∃ as, ain. T(cs, as) ∧ AINV(as) ∧ IT(cin, ain) ∧ ¬ dom(AOP(i))(ain, as);
      final-state : CINV(cs), CFIN(cs, gs) ⊦ ∃ as. AINV(as) ∧ T(cs, as) ∧ AFIN(as, gs);
      final-output : COUT(cou, gou) ⊦ ∃ aou. OT(cou, aou) ∧ AOUT(aou, gou);
      total-fin-state : CINV(cs) ⊦ ∃ gs. CFIN(cs, gs);
      total-fin-output :  ⊦ ∃ gou. COUT(cou, gou);
      total-input :  ⊦ ∃ ain. IT(cin, ain);
   
end enrich</SPECBODY></KIVSPEC>
