diff --git a/_CoqProject b/_CoqProject index 3f8cde4123e745fa55d2e7adae3a80544c7cc3f0..700bd296af444bdac74621d4e55bd887737e29c8 100644 --- a/_CoqProject +++ b/_CoqProject @@ -47,6 +47,7 @@ algebra/base.v algebra/dra.v algebra/cofe_solver.v algebra/agree.v +algebra/dec_agree.v algebra/excl.v algebra/iprod.v algebra/functor.v diff --git a/algebra/dec_agree.v b/algebra/dec_agree.v new file mode 100644 index 0000000000000000000000000000000000000000..9683f606f41147a6e0038a8e63cd39fe76955706 --- /dev/null +++ b/algebra/dec_agree.v @@ -0,0 +1,49 @@ +From algebra Require Export cmra. +From algebra Require Import functor upred. +Local Arguments validN _ _ _ !_ /. +Local Arguments valid _ _ !_ /. +Local Arguments op _ _ _ !_ /. +Local Arguments unit _ _ !_ /. + +(* This is isomorphic to optiob, but has a very different RA structure. *) +Inductive dec_agree (A : Type) : Type := + | DecAgree : A → dec_agree A + | DecAgreeBot : dec_agree A. +Arguments DecAgree {_} _. +Arguments DecAgreeBot {_}. + +Section dec_agree. +Context {A : Type} `{∀ x y : A, Decision (x = y)}. + +Instance dec_agree_valid : Valid (dec_agree A) := λ x, + if x is DecAgree _ then True else False. +Instance dec_agree_equiv : Equiv (dec_agree A) := equivL. +Canonical Structure dec_agreeC : cofeT := leibnizC (dec_agree A). + +Instance dec_agree_op : Op (dec_agree A) := λ x y, + match x, y with + | DecAgree a, DecAgree b => if decide (a = b) then DecAgree a else DecAgreeBot + | _, _ => DecAgreeBot + end. +Instance dec_agree_unit : Unit (dec_agree A) := id. +Instance dec_agree_minus : Minus (dec_agree A) := λ x y, x. + +Definition dec_agree_ra : RA (dec_agree A). +Proof. + split. + - apply _. + - apply _. + - apply _. + - apply _. + - intros [?|] [?|] [?|]; simpl; repeat (case_match; simpl); subst; congruence. + - intros [?|] [?|]; simpl; repeat (case_match; simpl); try subst; congruence. + - intros [?|]; simpl; repeat (case_match; simpl); try subst; congruence. + - intros [?|]; simpl; repeat (case_match; simpl); try subst; congruence. + - intros [?|] [?|] ?; simpl; done. + - intros [?|] [?|] ?; simpl; done. + - intros [?|] [?|] [[?|]]; simpl; repeat (case_match; simpl); subst; + try congruence; []. + case=>EQ. destruct EQ. done. +Qed. + +Canonical Structure dec_agreeRA : cmraT := discreteRA dec_agree_ra.