public void TestTreeAutomataMinimization()
{
Z3Provider Z = new Z3Provider();
var A = (Z.TT.MkRankedAlphabet("A", Z.IntSort, new string[] { "zero", "two" }, new int[] { 0, 2 }));
Func<int,Expr> beta = (i => Z.MkEq(Z.MkInt(1), Z.MkMod(Z.MkDiv(A.AttrVar,Z.MkInt(1<<i)), Z.MkInt(2))));
var r0 = Z.TT.MkTreeAcceptorRule(A, 0, "zero", beta(0));
var r1 = Z.TT.MkTreeAcceptorRule(A, 1, "two", beta(1), 0 ,0 );
var r2 = Z.TT.MkTreeAcceptorRule(A, 2, "two", beta(2), 1, 1);
var T = Z.TT.MkTreeAutomaton(2, A, A, new TreeRule[] { r0, r1, r2 });
var Tmin = T.Minimize();
Assert.AreEqual(T.StateCount, Tmin.StateCount);
}