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.

Lemma prod_sum : forall (A B : Set) (p : A * B), exists a : A, (exists b : B, p = (a, b)).