Fixpoint BDDor_1_1 (cfg : BDDconfig) (memo : BDDor_memo)
(node1 node2 : ad) (bound : nat) {struct bound} :
BDDconfig * (ad * BDDor_memo) :=
match BDDor_memo_lookup memo node1 node2 with
| Some node => (cfg, (node, memo))
| None =>
if Neqb node1 BDDzero
then (cfg, (node2, BDDor_memo_put memo BDDzero node2 node2))
else
if Neqb node1 BDDone
then (cfg, (BDDone, BDDor_memo_put memo BDDone node2 BDDone))
else
if Neqb node2 BDDzero
then (cfg, (node1, BDDor_memo_put memo node1 BDDzero node1))
else
if Neqb node2 BDDone
then (cfg, (BDDone, BDDor_memo_put memo node1 BDDone BDDone))
else
match bound with
| O => (initBDDconfig, (BDDzero, initBDDor_memo))
| S bound' =>
match BDDcompare (var cfg node1) (var cfg node2) with
| Datatypes.Eq =>
match
BDDdummy3
(BDDor_1_1 cfg memo (low cfg node1)
(low cfg node2) bound')
with
| BDDdummy3 (cfgl, (nodel, memol)) =>
match
BDDdummy3
(BDDor_1_1 cfgl memol (high cfg node1)
(high cfg node2) bound')
with
| BDDdummy3 (cfgr, (noder, memor)) =>
match
BDDdummy2
(BDDmake cfgr (var cfg node1) nodel noder)
with
| BDDdummy2 (cfg', node') =>
(cfg',
(node', BDDor_memo_put memor node1 node2 node'))
end
end
end
| Datatypes.Lt =>
match
BDDdummy3
(BDDor_1_1 cfg memo node1 (low cfg node2) bound')
with
| BDDdummy3 (cfgl, (nodel, memol)) =>
match
BDDdummy3
(BDDor_1_1 cfgl memol node1 (high cfg node2) bound')
with
| BDDdummy3 (cfgr, (noder, memor)) =>
match
BDDdummy2
(BDDmake cfgr (var cfg node2) nodel noder)
with
| BDDdummy2 (cfg', node') =>
(cfg',
(node', BDDor_memo_put memor node1 node2 node'))
end
end
end
| Datatypes.Gt =>
match
BDDdummy3
(BDDor_1_1 cfg memo (low cfg node1) node2 bound')
with
| BDDdummy3 (cfgl, (nodel, memol)) =>
match
BDDdummy3
(BDDor_1_1 cfgl memol (high cfg node1) node2 bound')
with
| BDDdummy3 (cfgr, (noder, memor)) =>
match
BDDdummy2
(BDDmake cfgr (var cfg node1) nodel noder)
with
| BDDdummy2 (cfg', node') =>
(cfg',
(node', BDDor_memo_put memor node1 node2 node'))
end
end
end
end
end
end.

(* Specifications: *)
Lemma BDDor_1_1_eq_1 :
forall (bound : nat) (cfg : BDDconfig) (memo : BDDor_memo)
(node1 node2 : ad),
BDDor_1_1 cfg memo node1 node2 bound = BDDor_1 cfg memo node1 node2 bound.
Lemma prod_sum :
forall (A B : Set) (p : A * B), exists a : A, (exists b : B, p = (a, b)).