intros. do 2 intro.
destruct H0.
destruct a as [a Ha]. destruct sigma' as [sigma' Hs]. destruct x as [x Hx].
do 2 red in H0. simpl in H0.
unfold full in H.
simpl in H.
specialize (H sigma'). spec H; eauto.
intros ? ? ?. destruct a0, b. do 2 red in H1. simpl in H1. apply H in H1.
subst; f_equal; auto.  apply proof_irr.
Qed.
End PSA_LIFT.
Existing Instance Join_lift.  (* Must not be inside a Section *)
Existing Instance Perm_lift.
Existing Instance Pos_lift.
Existing Instance Canc_lift.
Existing Instance Disj_lift.
Arguments mk_lifted [A J_A] _ _.
(** The dual of lifting is lowering: adding a distinct unit to a Pos_alg produces a sepalg.  Note that lower o lift is not an isomorphism for sepalgs with multiple units.  However, for sepalgs with a test for identity in Type, lower o lift is an isomorphism. *)
Section SA_LOWER.
Variable A : Type.
Variable Pj_A: Join A.
Variable PA_A : Perm_alg A.
Inductive lower_join: option A -> option A -> option A -> Prop :=
| lower_None1: forall a, lower_join None a a
| lower_None2: forall a, lower_join a None a
| lower_Some: forall a1 a2 a3,  join a1 a2 a3 ->
lower_join (Some a1) (Some a2) (Some a3).
Instance Join_lower: Join (option A) := lower_join.
Instance Perm_lower: @Perm_alg (option A) Join_lower.
Instance Sep_lower: @Sep_alg _ Join_lower.
Instance Disj_lower {psa_A: Pos_alg A}{DA: Disj_alg A}: @Disj_alg _ Join_lower.
End SA_LOWER.
Arguments Perm_lower _ [Pj_A][PA_A].
Arguments Sep_lower _ [Pj_A].
Arguments Sing_lower _ [Pj_A].
Arguments Canc_lower _ [Pj_A][psa_A][CA] _ _ _ _ _ _.
Arguments Disj_lower _ [Pj_A][PA_A][psa_A][DA] _ _ _.
Existing Instance Join_lower.  (* Must not be inside a Section *)
Existing Instance Perm_lower.
Existing Instance Sep_lower.
Existing Instance Sing_lower.
Existing Instance Canc_lower.
Existing Instance Disj_lower.
(* General facts about lowering *)

(* Specifications: *)
Lemma None_unit {A}{JOIN: Join A}:
forall x: option A, @unit_for (option A) (@Join_lower _ _) None x.