public void TestLanguageIntersectionClassicalCase()
{
Z3Provider Z = new Z3Provider();
var A = (Z.TT.MkRankedAlphabet("A", Z.UnitSort, new string[] { "zero", "one", "two" }, new int[] { 0, 1, 2 }));
var zero = A.MkTree("zero", Z.UnitConst);
Func<Expr, Expr> one = x =>
{
return A.MkTree("one", Z.UnitConst, x);
};
Func<Expr, Expr, Expr> two = (x, y) =>
{
return A.MkTree("two", Z.UnitConst, x, y);
};
//the left child has no ones
var a_rule2 = A.MkAcceptorRule(0, "two", 1, 0);
var a_rule1 = A.MkAcceptorRule(0, "one", 0);
var a_rule0 = A.MkAcceptorRule(0, "zero");
var a_rule3 = A.MkAcceptorRule(1, "two", 1, 1);
var a_rule4 = A.MkAcceptorRule(1, "zero");
//the right child has no ones
var b_rule2 = A.MkAcceptorRule(0, "two", 0, 1);
var b_rule1 = A.MkAcceptorRule(0, "one", 0);
var b_rule0 = A.MkAcceptorRule(0, "zero");
var b_rule3 = A.MkAcceptorRule(1, "two", 1, 1);
var b_rule4 = A.MkAcceptorRule(1, "zero");
var a = A.MkTreeAcceptor(a_rule2, a_rule1, a_rule0, a_rule3, a_rule4);
var b = A.MkTreeAcceptor(b_rule2, b_rule1, b_rule0, b_rule3, b_rule4);
//left and right subtrees have no ones
var ab = a.Intersect(b);
Assert.IsTrue(ab.Accepts(two(two(zero, zero), zero)));
Assert.IsTrue(ab.Accepts(one(one(two(zero, zero)))));
Assert.IsFalse(ab.Accepts(two(two(zero, one(zero)), zero)));
}