//adds identity states when A=B and a child is ouput without transformation
internal Expr NormalizeOutput(Expr t, RankedAlphabet A, RankedAlphabet B, int rank)
{
if (Z.IsVar(t))
{
if (Z.GetVarIndex(t) > rank || !t.Sort.Equals(A.AlphabetSort))
{
throw new AutomataException(AutomataExceptionKind.TreeTheory_UnexpectedVariable);
}
else
{
return(Z.MkApp(GetTrans(A.AlphabetSort, B.AlphabetSort), identityState, t));
}
}
else if (t.ASTKind == Z3_ast_kind.Z3_APP_AST)
{
var f = t.FuncDecl;
var args = t.Args;
if (B.ContainsConstructor(f))
{
CheckAttribute(args[0], A);
var args1 = new Expr[args.Length];
args1[0] = args[0];
for (int j = 1; j < args.Length; j++)
{
args1[j] = NormalizeOutput(args[j], A, B, rank);
}
return(Z.MkApp(f, args1));
}
else if (IsTrans(f))
{
if (args[0].ASTKind != Z3_ast_kind.Z3_NUMERAL_AST || !Z.IsVar(args[1]) || Z.GetVarIndex(args[1]) > rank || Z.GetVarIndex(args[1]) < 1)
{
throw new AutomataException(AutomataExceptionKind.TreeTheory_UnexpectedVariable);
}
else
{
return(t);
}
}
else
{
throw new AutomataException(AutomataExceptionKind.TreeTheory_UnexpectedOutput);
}
}
else
{
throw new AutomataException(AutomataExceptionKind.TreeTheory_UnexpectedOutput);
}
}