Скажем, у меня есть следующие логические функции:
or(x, y) := x || y
and(x, y) := x && y
not(x) := !x
foo(x, y, z) := and(x, or(y, z))
bar(x, y, z, a) := or(foo(x, y, z), not(a))
baz(x, y) := and(x, not(y))
Теперь я хотел бы построить из них двоичную диаграмму решений .Я просмотрел несколько статей, но не смог найти, как построить их из вложенных логических формул, подобных этим.
Говорят, что булева функция является корневым, направленным ациклическим графом.Имеет несколько нетерминальных и терминальных узлов.Затем он говорит, что каждый нетерминальный узел помечен логической переменной (не функцией), которая имеет два дочерних узла.Я не знаю, что булева переменная из моих определений функций выше.Ребро от узла к дочернему элементу a
или b
представляет присвоение узла 0 или 1 соответственно.Это называется уменьшено , если изоморфные подграфы были объединены, а узлы, двое детей которых изоморфны, удаляются.Это сокращенная упорядоченная схема принятия двоичных решений (ROBDD).
Исходя из этого и из всех ресурсов, с которыми я столкнулся, я не смог выяснить, как преобразовать эти функции в BDD /ROBDD:
foo(1, 0, 1)
bar(1, 0, 1, 0)
baz(1, 0)
Или, может быть, это те, которые нужно преобразовать:
foo(x, y, z)
bar(x, y, z, a)
baz(x, y)
Нужна помощь в объяснении того, что мне нужно сделать, чтобы превратить это в укоренившийсянаправленный ациклический граф.Знание структуры данных также было бы полезно.Кажется, что это именно так:
var nonterminal = {
a: child,
b: child,
v: some variable, not sure what
}
Но тогда возникает вопрос: как построить граф из этих функций foo
, bar
и baz
.