From ChargeCore.Logics Require Import ILogic ILEmbed.
Set Implicit Arguments.
Unset Strict Implicit.
Set Maximal Implicit Insertion.
Section BILogic.
Definition BILogicType := Type.
Context {A : BILogicType}.
Context {HILOp: ILogicOps A}.
Class BILogicOps (A : BILogicType) : Type := {
empSP  : A;
sepSP  : A -> A -> A;
wandSP : A -> A -> A
}.
Class BILogic {BILOp: BILogicOps A} : Type := {
bilil :> ILogic A;
sepSPC1 P Q : sepSP P Q |-- sepSP Q P;
sepSPA1 P Q R : sepSP (sepSP P Q) R |-- sepSP P (sepSP Q R);
wandSepSPAdj P Q R : sepSP P Q |-- R <-> P |-- wandSP Q R;
bilsep P Q R : P |-- Q -> sepSP P R |-- sepSP Q R;
empSPR P : sepSP P empSP -|- P
}.
End BILogic.
Arguments BILogic _ {BILOp HILOp} : rename.
Notation "a '**' b"  := (sepSP a b)
(at level 58, right associativity).
Notation "a '-*' b"  := (wandSP a b)
(at level 60, right associativity).
Section CoreInferenceRules.
Context {A T : Type} `{HBIL: BILogic A}.

Lemma bilexistsscL2 (P : A) (f : T -> A) :
lexists f ** P |-- Exists x : T, f x ** P.