Class SatProblem<T>
A mutable SAT problem builder.
public sealed class SatProblem<T> where T : IEquatable<T>
Type Parameters
TThe user-data type used to identify variables. Each distinct value gets one Boolean variable.
- Inheritance
-
objectSatProblem<T>
Remarks
Allocate variables for the values you care about, add clauses and other constraints, then call Solve(Func<Literal<T>?>?) to obtain a satisfying assignment (or null if unsatisfiable).
Methods
AddClause(params Literal<T>[])
Adds a clause requiring at least one of literals to be true.
An empty clause makes the problem unsatisfiable. A single literal becomes an unconditional fact.
public void AddClause(params Literal<T>[] literals)
Parameters
literalsLiteral<T>[]
AddClause(IEnumerable<Literal<T>>)
Adds a clause requiring at least one of literals to be true.
An empty clause makes the problem unsatisfiable. A single literal becomes an unconditional fact.
public void AddClause(IEnumerable<Literal<T>> literals)
Parameters
literalsIEnumerable<Literal<T>>
AddFormula(Formula<T>)
Adds all clauses from formula to the problem.
public void AddFormula(Formula<T> formula)
Parameters
formulaFormula<T>
AddVariable(T)
Returns the literal for value, allocating a new variable on first use.
public Literal<T> AddVariable(T value)
Parameters
valueT
Returns
- Literal<T>
AtMostOne(params Literal<T>[])
Adds an at-most-one constraint over the given literals. Returns the constraint object so callers (e.g., deciders) can query it.
public AtMostOneConstraint<T> AtMostOne(params Literal<T>[] literals)
Parameters
literalsLiteral<T>[]
Returns
AtMostOne(IEnumerable<Literal<T>>)
Adds an at-most-one constraint over the given literals. Returns the constraint object so callers (e.g., deciders) can query it.
public AtMostOneConstraint<T> AtMostOne(IEnumerable<Literal<T>> literals)
Parameters
literalsIEnumerable<Literal<T>>
Returns
GetValue(Literal<T>)
Returns the current truth value of literal in the engine, or null if it has not yet been assigned. Useful from inside a decider callback.
public bool? GetValue(Literal<T> literal)
Parameters
literalLiteral<T>
Returns
- bool?
Implies(Literal<T>, params Literal<T>[])
Adds the implication antecedent → at-least-one-of(consequents).
Equivalent to a clause: !antecedent ∨ c1 ∨ c2 ∨ ....
public void Implies(Literal<T> antecedent, params Literal<T>[] consequents)
Parameters
Solve(Func<Literal<T>?>?)
Solves the problem.
public Model<T>? Solve(Func<Literal<T>?>? decider = null)
Parameters
deciderFunc<Literal<T>?>Optional callback to choose the next literal to branch on. Returning
nullmeans "no preference; set remaining variables to false". The callback receives no arguments; it should inspect external state (e.g., a dependency graph) plus any held AtMostOneConstraint<T> references to decide.
Returns
- Model<T>
A model with the satisfying assignment, or
nullif the problem is unsatisfiable.
Operators
operator +(SatProblem<T>, Clause<T>)
Adds a clause to the problem. Enables problem += literal1 | literal2 syntax.
public static SatProblem<T> operator +(SatProblem<T> problem, Clause<T> clause)
Parameters
problemSatProblem<T>clauseClause<T>
Returns
- SatProblem<T>
operator +(SatProblem<T>, Formula<T>)
Adds all clauses from a formula to the problem. Enables problem += (a | b) & (!a | c) syntax.
public static SatProblem<T> operator +(SatProblem<T> problem, Formula<T> formula)
Parameters
problemSatProblem<T>formulaFormula<T>
Returns
- SatProblem<T>