Ltac already_saturated :=
(match goal with |- ?P |-- ?Q =>
let H := fresh in
assert (H: P |-- Q) by auto with nocore saturate_local;
cbv beta in H;
match type of H with _ |-- !! ?Q' =>
assert (Q') by (repeat simple apply conj; auto);
fail 3
end
end || auto with nocore saturate_local)
|| simple apply prop_True_right.
Ltac saturate_local :=
simple eapply saturate_aux21x;
[repeat simple apply saturate_aux20;
(* use already_saturated if want to be fancy, otherwise the next lines *)
auto with nocore saturate_local;
simple apply prop_True_right
(* | cbv beta; reflexivity    this line only for use with saturate_aux21 *)
| simple apply derives_extract_prop;
match goal with |- _ -> ?A =>
let P := fresh "P" in set (P := A);
fancy_intros true;
subst P
end
].
(* old version: Ltac saturate_local := simple eapply saturate_aux21x; [repeat simple apply saturate_aux20; (* use already_saturated if want to be fancy, otherwise the next lines *)
auto with nocore saturate_local;
simple apply prop_True_right
(* | cbv beta; reflexivity    this line only for use with saturate_aux21 *)
| simple apply derives_extract_prop;
match goal with |- _ -> ?A =>
let P := fresh "P" in set (P := A); autorewrite with norm;
rewrite -> ?and_assoc; fancy_intros true;  subst P
end
].
*)
(*********************************************************)

(* Specifications: *)
Lemma prop_right_emp {A} {NA: NatDed A}:
forall P: Prop, P -> emp |-- !! P.