de.fosd.typechef.featureexpr.sat
helper function for statistics and such that determines which features are involved in this feature expression
helper function for statistics and such that determines which features are involved in this feature expression
counts the number of features in this expression for statistic purposes
counts the number of features in this expression for statistic purposes
Check structural equality, assuming that all component nodes have already been canonicalized.
Check structural equality, assuming that all component nodes have already been canonicalized. The default implementation checks for pointer equality.
uses a SAT solver to determine whether two expressions are equivalent.
uses a SAT solver to determine whether two expressions are equivalent.
for performance reasons, it checks pointer equivalence first, but won't use the recursive equals on aexpr (there should only be few cases when equals is more accurate than eq, which are not worth the performance overhead)
evaluate the expression for a given feature selection (all features not provided are assumed deselected)
evaluate the expression for a given feature selection (all features not provided are assumed deselected)
features provided as a list of names (how they would be created with createDefinedExternal)
evaluates to true or false
NOT implemented, this method will always return None.
NOT implemented, this method will always return None.
NOT implemented, this method will always return None.
NOT implemented, this method will always return None.
checks whether there is some unresolved macro (DefinedMacro) somewhere in the expression tree
checks whether there is some unresolved macro (DefinedMacro) somewhere in the expression tree
x.
x.isSatisfiable(fm) is short for x.and(fm).isSatisfiable but is faster because FM is cached
heuristic to determine whether a feature expression is small (may be used to decide whether to inline it or not)
heuristic to determine whether a feature expression is small (may be used to decide whether to inline it or not)
use with care
FM -> X is tautology if FM.
FM -> X is tautology if FM.implies(X).isTautology or !FM.and.(x.not).isSatisfiable
not final for optimization purposes
map function that applies to all leafs in the feature expression (i.
map function that applies to all leafs in the feature expression (i.e. all DefinedExpr nodes)
Prints the textual representation of this formula on a Writer.
Prints the textual representation of this formula on a Writer. The result shall be equivalent to p.print(toTextExpr), but it should avoid consuming so much temporary space.
the output Writer
replaces all DefinedMacro tokens by their full expansion.
replaces all DefinedMacro tokens by their full expansion.
the resulting feature expression contains only DefinedExternal nodes as leafs and can be printed and read again
creates an equivalent feature expression in CNF
creates an equivalent feature expression in CNF
be aware of exponential explosion. consider using toCnfEquiSat instead if possible
creates an equisatisfiable feature expression in CNF
creates an equisatisfiable feature expression in CNF
the result is not equivalent but will yield the same result in satisifiability tests with SAT solvers
the algorithm introduces new variables and is faster than toCNF
Converts this formula to a textual expression.
Converts this formula to a textual expression.
unique existential quantification over feature "feature".
unique existential quantification over feature "feature".
This has the effect of substituting the feature by true and false respectively and returning the xor of both: this[feature->True] xor this[feature->False]
It can be seen as identifying under which condition the feature matters for the result of the formula
True and False. They are represented as special cases of And and Or with no clauses, as it is common practice, for instance in the resolution algorithm.
True is the zero element for And, while False is the zero element for Or. Therefore, True can be represented as an empty conjunction, while False by an empty disjunction.
One can imagine to build a disjunction incrementally, by having an empty one be considered as false, so that each added operand can make the resulting formula true. Dually, an empty conjunction is true, and and'ing clauses can make it false.
This avoids introducing two new leaf nodes to handle (avoiding some bugs causing NoLiteralException).
Moreover, since those are valid formulas, they would otherwise be valid but non-canonical representations, and avoiding the very existence of such things simplifies ensuring that our canonicalization algorithms actually work.
The use of only canonical representations for True and False is ensured thanks to the apply methods of the And and Or companion objects, which convert any empty set of clauses into the canonical True or False object.