(* This program is free software; you can redistribute it and/or      *)
(* modify it under the terms of the GNU Lesser General Public License *)
(* as published by the Free Software Foundation; either version 2.1   *)
(* of the License, or (at your option) any later version.             *)
(*                                                                    *)
(* This program is distributed in the hope that it will be useful,    *)
(* but WITHOUT ANY WARRANTY; without even the implied warranty of     *)
(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the      *)
(* GNU General Public License for more details.                       *)
(*                                                                    *)
(* You should have received a copy of the GNU Lesser General Public   *)
(* License along with this program; if not, write to the Free         *)
(* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *)
(* 02110-1301 USA                                                     *)
Definition BDDstate := Map (BDDvar * (ad * ad)).
(* BDDstates are maps from (node) addresses to actual nodes. These nodes contain a variable, the address of the left subBDD, and the address of the right subBDD. BDDstates should obey a few invariants: *)
Definition initBDDstate := newMap (BDDvar * (ad * ad)).
Inductive BDDbounded (bs : BDDstate) : ad -> BDDvar -> Prop :=
| BDDbounded_0 : forall n : BDDvar, BDDbounded bs BDDzero n
| BDDbounded_1 : forall n : BDDvar, BDDbounded bs BDDone n
| BDDbounded_2 :
forall (node : ad) (n x : BDDvar) (l r : ad),
MapGet _ bs node = Some (x, (l, r)) ->
BDDcompare x n = Datatypes.Lt ->
Neqb l r = false ->
BDDbounded bs l x -> BDDbounded bs r x -> BDDbounded bs node n.

(* Specifications: *)
Lemma BDDbounded_lemma :
forall (bs : BDDstate) (node : ad) (n : BDDvar),
BDDbounded bs node n ->
node = BDDzero \/
node = BDDone \/
(exists x : BDDvar,
(exists l : BDDvar,
(exists r : BDDvar,
MapGet _ bs node = Some (x, (l, r)) /\
BDDcompare x n = Datatypes.Lt /\
Neqb l r = false /\ BDDbounded bs l x /\ BDDbounded bs r x))).
Lemma increase_bound :
forall (bs : BDDstate) (n n' : BDDvar) (node : ad),
BDDbounded bs node n ->
BDDcompare n n' = Datatypes.Lt -> BDDbounded bs node n'.
Lemma boundedness_preservation :
forall bs bs' : BDDstate,
(forall (a l r : ad) (x : BDDvar),
MapGet _ bs a = Some (x, (l, r)) -> MapGet _ bs' a = Some (x, (l, r))) ->
forall (n : BDDvar) (node : ad),
BDDbounded bs node n -> BDDbounded bs' node n.