Esempio n. 1
0
 ExecStatus
 ReLq<View,CtrlView,rm>::post(Home home, View x0, View x1, CtrlView b) {
   if (b.one()) {
     if (rm == RM_PMI)
       return ES_OK;
     return Lq<View>::post(home,x0,x1);
   }
   if (b.zero()) {
     if (rm == RM_IMP)
       return ES_OK;
     return Le<View>::post(home,x1,x0);
   }
   if (!same(x0,x1)) {
     switch (rtest_lq(x0,x1)) {
     case RT_TRUE:
       if (rm != RM_IMP)
         GECODE_ME_CHECK(b.one_none(home)); 
       break;
     case RT_FALSE:
       if (rm != RM_PMI)
         GECODE_ME_CHECK(b.zero_none(home)); 
       break;
     case RT_MAYBE:
       if (!x0.assigned() || !x1.assigned())
         (void) new (home) ReLq<View,CtrlView,rm>(home,x0,x1,b);
       else {
         if (rm != RM_IMP)
           GECODE_ME_CHECK(b.one_none(home)); 
       }
       break;
     default: GECODE_NEVER;
     }
   } else if (rm != RM_IMP) {
     GECODE_ME_CHECK(b.one_none(home));
   }
   return ES_OK;
 }