private static STz3 MkGetTags2(STBuilderZ3 stb, Sort charSort)
{
var z3p = stb.Solver;
Expr tt = z3p.True;
Expr[] eps = new Expr[] { };
List<Move<Rulez3>> rules = new List<Move<Rulez3>>();
Expr lt = z3p.MkNumeral((int)'<', charSort);
Expr gt = z3p.MkNumeral((int)'>', charSort);
//final outputs are all epmpty
rules.Add(stb.MkFinalOutput(0, tt, eps));
rules.Add(stb.MkFinalOutput(1, tt, eps));
rules.Add(stb.MkFinalOutput(2, tt, eps));
Expr x = stb.MkInputVariable(charSort);
Expr c = stb.MkRegister(charSort);
//rules from q0
rules.Add(stb.MkRule(0, 0, z3p.MkNeq(x, lt), x));
rules.Add(stb.MkRule(0, 1, z3p.MkEq(x, lt), x));
//rules from q1
rules.Add(stb.MkRule(1, 2, z3p.MkNeq(x, lt), x));
rules.Add(stb.MkRule(1, 1, z3p.MkEq(x, lt), x));
//rules from q2
rules.Add(stb.MkRule(2, 0, z3p.MkAnd(z3p.MkNeq(x, gt), z3p.MkNeq(x, lt)), x));
rules.Add(stb.MkRule(2, 0, z3p.MkEq(x, gt), x, lt, c, gt));
rules.Add(stb.MkRule(2, 1, z3p.MkEq(x, lt), x));
STz3 st = stb.MkST("GetTags2", z3p.MkNumeral(0, charSort), charSort, charSort, charSort, 0, rules);
return st;
}