Inductive be_ok : bool_expr -> Prop :=
  | zero_ok : be_ok Zero
  | one_ok : be_ok One
  | var_ok : forall x : BDDvar, vf x = true -> be_ok (Var x)
  | neg_ok : forall be : bool_expr, be_ok be -> be_ok (Neg be)
  | or_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (Or be1 be2)
  | and_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (ANd be1 be2)
  | impl_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (Impl be1 be2)
  | iff_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (Iff be1 be2).Inductive be_ok : bool_expr -> Prop :=
  | zero_ok : be_ok Zero
  | one_ok : be_ok One
  | var_ok : forall x : BDDvar, vf x = true -> be_ok (Var x)
  | neg_ok : forall be : bool_expr, be_ok be -> be_ok (Neg be)
  | or_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (Or be1 be2)
  | and_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (ANd be1 be2)
  | impl_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (Impl be1 be2)
  | iff_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (Iff be1 be2).Inductive be_ok : bool_expr -> Prop :=
  | zero_ok : be_ok Zero
  | one_ok : be_ok One
  | var_ok : forall x : BDDvar, vf x = true -> be_ok (Var x)
  | neg_ok : forall be : bool_expr, be_ok be -> be_ok (Neg be)
  | or_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (Or be1 be2)
  | and_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (ANd be1 be2)
  | impl_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (Impl be1 be2)
  | iff_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (Iff be1 be2).Inductive be_ok : bool_expr -> Prop :=
  | zero_ok : be_ok Zero
  | one_ok : be_ok One
  | var_ok : forall x : BDDvar, vf x = true -> be_ok (Var x)
  | neg_ok : forall be : bool_expr, be_ok be -> be_ok (Neg be)
  | or_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (Or be1 be2)
  | and_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (ANd be1 be2)
  | impl_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (Impl be1 be2)
  | iff_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (Iff be1 be2).Inductive be_ok : bool_expr -> Prop :=
  | zero_ok : be_ok Zero
  | one_ok : be_ok One
  | var_ok : forall x : BDDvar, vf x = true -> be_ok (Var x)
  | neg_ok : forall be : bool_expr, be_ok be -> be_ok (Neg be)
  | or_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (Or be1 be2)
  | and_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (ANd be1 be2)
  | impl_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (Impl be1 be2)
  | iff_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (Iff be1 be2).Inductive be_ok : bool_expr -> Prop :=
  | zero_ok : be_ok Zero
  | one_ok : be_ok One
  | var_ok : forall x : BDDvar, vf x = true -> be_ok (Var x)
  | neg_ok : forall be : bool_expr, be_ok be -> be_ok (Neg be)
  | or_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (Or be1 be2)
  | and_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (ANd be1 be2)
  | impl_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (Impl be1 be2)
  | iff_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (Iff be1 be2).Inductive be_ok : bool_expr -> Prop :=
  | zero_ok : be_ok Zero
  | one_ok : be_ok One
  | var_ok : forall x : BDDvar, vf x = true -> be_ok (Var x)
  | neg_ok : forall be : bool_expr, be_ok be -> be_ok (Neg be)
  | or_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (Or be1 be2)
  | and_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (ANd be1 be2)
  | impl_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (Impl be1 be2)
  | iff_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (Iff be1 be2).Inductive be_ok : bool_expr -> Prop :=
  | zero_ok : be_ok Zero
  | one_ok : be_ok One
  | var_ok : forall x : BDDvar, vf x = true -> be_ok (Var x)
  | neg_ok : forall be : bool_expr, be_ok be -> be_ok (Neg be)
  | or_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (Or be1 be2)
  | and_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (ANd be1 be2)
  | impl_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (Impl be1 be2)
  | iff_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (Iff be1 be2).Inductive be_ok : bool_expr -> Prop :=
  | zero_ok : be_ok Zero
  | one_ok : be_ok One
  | var_ok : forall x : BDDvar, vf x = true -> be_ok (Var x)
  | neg_ok : forall be : bool_expr, be_ok be -> be_ok (Neg be)
  | or_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (Or be1 be2)
  | and_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (ANd be1 be2)
  | impl_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (Impl be1 be2)
  | iff_ok :
      forall be1 be2 : bool_expr,
      be_ok be1 -> be_ok be2 -> be_ok (Iff be1 be2).

(* Specifications: *)
Lemma var_ok_inv : forall x : BDDvar, be_ok (Var x) -> vf x = true.
Lemma neg_ok_inv : forall be : bool_expr, be_ok (Neg be) -> be_ok be.
Lemma or_ok_inv : forall be1 be2 : bool_expr, be_ok (Or be1 be2) -> be_ok be1 /\ be_ok be2.
Lemma and_ok_inv : forall be1 be2 : bool_expr, be_ok (ANd be1 be2) -> be_ok be1 /\ be_ok be2.
Lemma impl_ok_inv : forall be1 be2 : bool_expr, be_ok (Impl be1 be2) -> be_ok be1 /\ be_ok be2.
Lemma iff_ok_inv : forall be1 be2 : bool_expr, be_ok (Iff be1 be2) -> be_ok be1 /\ be_ok be2.
Lemma be_x_free_be_ok : forall be : bool_expr, (forall x : BDDvar, be_x_free x be = true -> vf x = true) -> be_ok be.
Lemma be_ok_be_x_free : forall be : bool_expr, be_ok be -> forall x : BDDvar, be_x_free x be = true -> vf x = true.