Похоже, вы пытаетесь решить общую проблему компиляции, называемую [постоянное свертывание] [1]. (http://en.wikipedia.org/wiki/Constant_folding).
Хорошая новость заключается в том, что она применяется к DAG (прямой ациклический граф), а не только к деревьям. По сути, идея состоит в том, чтобы вычислить то, что вы можете из частичных выражений. Такие простые вещи, как True AND X = X
или True OR X = True
, помогают обрезать большие части дерева. (Тривиальная реализация, о которой я знаю, это вопрос глубины и возврата назад, а не ширины, но в любом случае это не так уж много кода).
Мне все еще интересно, почему у вас есть график, а не дерево выражений. Если вы можете вычислить A из B или B из A, у вас обычно нет одновременно и A, и B в качестве входных данных. Тогда должна быть возможность выразить проблему как набор деревьев выражений в зависимости от доступных входных данных. Но это грубое предположение. Можете ли вы дать более подробную информацию (пример), почему у вас есть этот график?