Library CoherenceExample

CoherenceExample


Definition V_True {E:Env} := @BOOL E true.
Definition V_False {E:Env} := @BOOL E false.
Definition E_True {E:Env} := @VAL E V_True.
Definition E_False {E:Env} := @VAL E V_False.
Definition v0 {E:Env} := ZVAR E.
Definition v1 {E:Env} := SVAR (ZVAR E).
Definition v2 {E:Env} := SVAR (SVAR (ZVAR E)).
Definition v3 {E:Env} := SVAR (SVAR (SVAR (ZVAR E))).
Definition V_v0 {E:Env} := VAL (VAR (@v0 E)).
Definition V_v1 {E:Env} := VAL (VAR (@v1 E)).
Definition V_v2 {E:Env} := VAL (VAR (@v2 E)).
Definition V_v3 {E:Env} := VAL (VAR (@v3 E)).

Definition bool_sum {E:Env} := FUN (VAL (FUN (@NOp (E.+4) PlusOP V_v0 V_v2))).

Definition bool_sum_app {E:Env} :=
  LET (APP (@bool_sum E) V_True)
      (APP (VAR v0) V_False)
.

Lemma bool_sum_tj : ([] vbool_sumnat̂ ⇥ nat̂ ⇥ nat̂).
Proof.
  apply FunRule.
  apply ValRule.
  apply FunRule.
  apply NOpRule.
  apply ValRule. apply VarRule.
  apply ValRule. apply VarRule.
Qed.

Lemma bool_sum_tj' : ([] vbool_sumbool̂ ⇥ bool̂ ⇥ nat̂).
  apply SubsVRule with (θ:=nat̂ ⇥ nat̂ ⇥ nat̂).
  apply bool_sum_tj.
  apply SubFunRule. constructor.
  apply SubFunRule. constructor.
  constructor.
Qed.

Lemma bool_sum_app_tj : ([] ebool_sum_appnat̂).
Proof.
  apply LetRule with (θ':=nat̂ ⇥ nat̂).
  apply AppRule with (θ':=nat̂).
  apply bool_sum_tj.
  apply SubsVRule with (θ:=bool̂). constructor. constructor.
  apply AppRule with (θ':=nat̂).
  apply VarRule.
  apply SubsVRule with (θ:=bool̂). constructor. constructor.
Qed.

Lemma bool_sum_app_tj' : ([] ebool_sum_appnat̂).
Proof.
  apply LetRule with (θ':=bool̂ ⇥ nat̂).
  apply AppRule with (θ':=bool̂).
  apply bool_sum_tj'. constructor.
  apply AppRule with (θ':=bool̂).
  apply VarRule. constructor.
Qed.

Lemma bool_sum_coherent :
  tbool_sum_app_tje () =-= tbool_sum_app_tj'e ()
.
Proof.
  apply Coherence.
Qed.

Definition true_sum_false {E:Env} := @NOp E PlusOP (VAL V_True) (VAL V_False).

Lemma true_sum_computes : (∅, true_sum_false) ⟼⋆ (∅, ⌊ 1 ⌋).
Proof.
  eapply rt_trans. eapply rt_step.
  constructor.
  eapply rt_trans. eapply rt_step.
  constructor.
  eapply rt_trans. eapply rt_step.
  constructor.
  eapply rt_trans. eapply rt_step.
  constructor.
  eapply rt_trans. eapply rt_step.
  constructor.
  apply rt_refl.
Qed.