Я пытаюсь использовать Cudd_bddIte
для реализации простых BDD.
Следующий код работает должным образом, давая диаграмму на рисунке (которая представляет узел bdd
):
DdNode *v1 = Cudd_bddNewVar(gbm);
Cudd_Ref(v1);
DdNode *v2 = Cudd_bddNewVar(gbm);
Cudd_Ref(v2);
DdNode *v3 = Cudd_bddNewVar(gbm);
Cudd_Ref(v3);
DdNode *tmp1 = Cudd_bddIte(gbm, v1, Cudd_ReadLogicZero(gbm), Cudd_ReadOne(gbm));
Cudd_Ref(tmp1);
DdNode *tmp2 = Cudd_bddIte(gbm, v2, tmp1, Cudd_ReadOne(gbm));
Cudd_Ref(tmp2);
Cudd_RecursiveDeref(gbm,tmp1);
DdNode *bdd = Cudd_bddIte(gbm, v3, tmp2, Cudd_ReadOne(gbm));
Cudd_Ref(bdd);
Cudd_RecursiveDeref(gbm,tmp2);
Однако, если я изменю оператор ITE для tmp2
на следующий
DdNode *tmp2 = Cudd_bddIte(gbm, v2, tmp1, Cudd_ReadLogicZero(gbm));
Я получаю этот неожиданный график:
Для меня это неправильно, так как я ожидаю, что самая верхняя переменная все равно сразу же выдаст 1, если ложь, как на первом рисунке. Что я делаю не так?