// expr を簡約した結果を返す // 新規変数を追加する時に生じた制約は、 newExpr に入れる public IExpression TseitinTranslate(IExpression expr, ExpressionAnd newExpr) { var ret = expr.Empty(); foreach (var child in expr.children) { // 簡約の必要がない if (child.GetType() == typeof(ExpressionInteger)) { ret.children.Add(child); } else { // 再帰的に簡約 var childExpr = TseitinTranslate(child, newExpr); // childExpr を newId の変数で置き換え var newId = generator.GenerateId(); ret.children.Add(new ExpressionInteger(newId, true)); // childExpr == newId の制約 var newChildExpr = new ExpressionInteger(newId, false); if (childExpr.GetType() == typeof(ExpressionAnd)) { foreach (var subexpr in childExpr.children) { var newSubExpr = new ExpressionOr(); newSubExpr.children.Add(newChildExpr.Clone()); newSubExpr.children.Add(subexpr); newExpr.children.Add(newSubExpr); } } else // childExpr.GetType() == typeof (ExpressionOr) { childExpr.children.Add(newChildExpr); newExpr.children.Add(childExpr); } } } return(ret); }
public ExpressionInteger(ExpressionInteger src) { this.id = src.id; this.positive = src.positive; }