public void TestCompositionCornerCase1()
{
Z3Provider Z = new Z3Provider();
var A = (Z.TT.MkRankedAlphabet("A", Z.IntSort, new string[] { "zero", "one", "two" }, new int[] { 0, 1, 2 }));
var q0 = Z.MkInt(0);
Func<int, int, Expr> q = (state,var) =>
{
return A.MkTrans(A, state, var);
};
//two(1+x0,one(x1),one(x2))
var b = A.MkTree("two",
Z.MkAdd(Z.MkInt(1), A.AttrVar),
A.MkTree("one", Z.MkAdd(Z.MkInt(1), A.AttrVar), q(0,1)),
A.MkTree("one", Z.MkAdd(Z.MkInt(2), A.AttrVar), q(0,2)));
var rule0 = Z.TT.MkTreeRule(A, A, 0, "zero", Z.True, A.MkTree("zero", A.AttrVar));
var rule1 = Z.TT.MkTreeRule(A, A, 0, "one", Z.True, A.MkTree("one", A.AttrVar, q(0,1)));
var rule2 = Z.TT.MkTreeRule(A, A, 0, "two", Z.True, A.MkTree("two", A.AttrVar, q(0,2), q(0,1)));
var F = Z.TT.MkTreeAutomaton(0, A, A, new TreeRule[] { rule0, rule1, rule2 });
var FF = F.Compose(F);
var t1 = A.MkTree("two", Z.MkInt(22), A.MkTree("zero", Z.MkInt(5)), A.MkTree("zero", Z.MkInt(6)));
var t2 = A.MkTree("two", Z.MkInt(22), A.MkTree("zero", Z.MkInt(6)), A.MkTree("zero", Z.MkInt(5)));
var FFF = FF.Compose(F);
Assert.AreEqual(3, FFF.RuleCount);
var s1 = F[t1][0];
var s2 = FF[t1][0];
var s3 = FFF[t1][0];
Assert.AreEqual<Expr>(t2, s1);
Assert.AreEqual<Expr>(t1, s2);
Assert.AreEqual<Expr>(t2, s3);
}