Local Open Scope logic_base.
Local Open Scope syntax.
Class PropositionalVariables: Type := {
Var: Type
}.
Inductive expr {Sigma: PropositionalVariables}: Type :=
| andp : expr -> expr -> expr
| orp : expr -> expr -> expr
| impp : expr -> expr -> expr
| sepcon : expr -> expr -> expr
| wand : expr -> expr -> expr
| emp : expr
| falsep : expr
| varp : Var -> expr.
Arguments expr: clear implicits.
Definition expr_eqb {Sigma: PropositionalVariables} (eqb: Var -> Var -> bool): expr Sigma -> expr Sigma -> bool :=
fix expr_eqb x1 x2 :=
match x1, x2 with
| andp y1 z1, andp y2 z2 => andb (expr_eqb y1 y2) (expr_eqb z1 z2)
| orp y1 z1, orp y2 z2 => andb (expr_eqb y1 y2) (expr_eqb z1 z2)
| impp y1 z1, impp y2 z2 => andb (expr_eqb y1 y2) (expr_eqb z1 z2)
| sepcon y1 z1, sepcon y2 z2 => andb (expr_eqb y1 y2) (expr_eqb z1 z2)
| wand y1 z1, wand y2 z2 => andb (expr_eqb y1 y2) (expr_eqb z1 z2)
| emp, emp => true
| falsep, falsep => true
| varp p, varp q => eqb p q
| _, _ => false
end.

(* Specifications: *)
Lemma expr_eqb_true {Sigma: PropositionalVariables} (eqb: Var -> Var -> bool):
(forall p q, eqb p q = true <-> p = q) ->
(forall x y, expr_eqb eqb x y = true <-> x = y).