Definition BDDvar_le := Nleb.
Definition BDDvar_max (x y : BDDvar) := if BDDvar_le x y then y else x.

(* Specifications: *)
Lemma BDDvar_max_comm : forall x y : BDDvar, BDDvar_max x y = BDDvar_max y x.
Lemma BDDvar_max_lemma_1 :
forall x y z : BDDvar,
BDDcompare x y = Datatypes.Lt ->
BDDcompare (BDDvar_max x N0) (BDDvar_max y z) = Datatypes.Lt.
Lemma BDDvar_le_z : forall x : BDDvar, BDDvar_le N0 x = true.
Lemma BDDvar_le_compare :
forall x y : BDDvar, BDDcompare x y = Datatypes.Lt -> BDDvar_le x y = true.
Lemma BDDcompare_max_1_2 :
forall x1 x2 y1 y2 : BDDvar,
BDDcompare x1 x2 = Datatypes.Lt ->
BDDcompare y1 y2 = Datatypes.Lt ->
BDDcompare (BDDvar_max x1 y1) (BDDvar_max x2 y2) = Datatypes.Lt.
Lemma BDDcompare_z_nz :
forall x : BDDvar, x <> N0 -> BDDcompare N0 x = Datatypes.Lt.
Lemma BDDvar_max_x_x : forall x : BDDvar, BDDvar_max x x = x.
Lemma BDDvar_ordered_high_1 :
forall (cfg : BDDconfig) (node1 node2 : ad),
BDDconfig_OK cfg ->
is_internal_node cfg node1 ->
is_internal_node cfg node2 ->
is_internal_node cfg (high cfg node1) \/
is_internal_node cfg (high cfg node2) ->
BDDcompare
(BDDvar_max (var cfg (high cfg node1)) (var cfg (high cfg node2)))
(BDDvar_max (var cfg node1) (var cfg node2)) = Datatypes.Lt.
Lemma BDDvar_ordered_low_1 :
forall (cfg : BDDconfig) (node1 node2 : ad),
BDDconfig_OK cfg ->
is_internal_node cfg node1 ->
is_internal_node cfg node2 ->
is_internal_node cfg (low cfg node1) \/ is_internal_node cfg (low cfg node2) ->
BDDcompare (BDDvar_max (var cfg (low cfg node1)) (var cfg (low cfg node2)))
(BDDvar_max (var cfg node1) (var cfg node2)) = Datatypes.Lt.
Lemma BDDvar_ordered_high_2 :
forall (cfg : BDDconfig) (node1 node2 : ad),
BDDconfig_OK cfg ->
is_internal_node cfg node1 ->
is_internal_node cfg node2 ->
BDDcompare (var cfg node1) (var cfg node2) = Datatypes.Lt ->
BDDcompare (BDDvar_max (var cfg node1) (var cfg (high cfg node2)))
(var cfg node2) = Datatypes.Lt.
Lemma BDDvar_ordered_low_2 :
forall (cfg : BDDconfig) (node1 node2 : ad),
BDDconfig_OK cfg ->
is_internal_node cfg node1 ->
is_internal_node cfg node2 ->
BDDcompare (var cfg node1) (var cfg node2) = Datatypes.Lt ->
BDDcompare (BDDvar_max (var cfg node1) (var cfg (low cfg node2)))
(var cfg node2) = Datatypes.Lt.
Lemma BDDvar_ordered_high_3 :
forall (cfg : BDDconfig) (node1 node2 : ad),
BDDconfig_OK cfg ->
is_internal_node cfg node1 ->
is_internal_node cfg node2 ->
BDDcompare (var cfg node2) (var cfg node1) = Datatypes.Lt ->
BDDcompare (BDDvar_max (var cfg (high cfg node1)) (var cfg node2))
(var cfg node1) = Datatypes.Lt.
Lemma BDDvar_ordered_low_3 :
forall (cfg : BDDconfig) (node1 node2 : ad),
BDDconfig_OK cfg ->
is_internal_node cfg node1 ->
is_internal_node cfg node2 ->
BDDcompare (var cfg node2) (var cfg node1) = Datatypes.Lt ->
BDDcompare (BDDvar_max (var cfg (low cfg node1)) (var cfg node2))
(var cfg node1) = Datatypes.Lt.
Lemma lt_max_nat_of_N :
forall x y z : BDDvar,
BDDcompare (BDDvar_max x y) z = Datatypes.Lt ->
max (nat_of_N x) (nat_of_N y) < nat_of_N z.
Lemma le_nat_of_N_max :
forall x y z : BDDvar,
BDDvar_le x (BDDvar_max y z) = true ->
nat_of_N x <= max (nat_of_N y) (nat_of_N z).