Неожиданный вывод Cudd_bddIte

Я пытаюсь использовать 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, если ложь, как на первом рисунке. Что я делаю неправильно?

1 ответ

В (RO)BDD все переменные появляются в определенном порядке. В вашем случае порядок выглядит как "v1, v2, v3", как вы разместили его в этом порядке, и переупорядочение переменных, по-видимому, не произошло.

Функция Cudd_bddIte не требует, чтобы вы соблюдали порядок при создании BDD. Когда вы используете функцию bddIte в своем коде, вы используете эту функциональность: для построения "bdd" вы применяете функцию bddIte к переменной v3, используя два поддеревья над v1 и v2. Тем не менее, v3 находится в конце порядка переменных, поэтому все дерево реструктурируется.

Фактически, второе отображаемое вами дерево обладает ожидаемым свойством: когда v3 имеет значение TRUE, BDD отображает значение переменной в значение TRUE. Это видно из того факта, что единственный способ достичь приемника "0" - через узел 0x2e, который предназначен для переменной v3, а приемник "0" может быть достигнут только тогда, когда выбран преемник узла.

Другие вопросы по тегам