Exemplo n.º 1
0
        // 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);
        }
Exemplo n.º 2
0
 public ExpressionInteger(ExpressionInteger src)
 {
     this.id       = src.id;
     this.positive = src.positive;
 }