我尝试用另一个变量y简单地替换变量x(如果重要的话设置变量)。从这里的帖子(Substitution in Z3 java),我认为替代品在Java中运行良好。但是我得到了相同的表达式对象(打印时)作为返回。替换是否正确实施或我犯了错误?下面是我如何定义变量的代码片段,并在相关的情况下调用替换方法。
EnumSort xSort = ctx.mkEnumSort(xs, ctx.mkSymbol("A"),ctx.mkSymbol("B"));
SetSort xSet = ctx.mkSetSort(xSort);
Expr x = ctx.mkConst("x",xSet);
/*Construct the formula "formOld".....*/
Expr y = ctx.mkConst("y",x.getSort());
BoolExpr form_sub = (BoolExpr)formOld.substitute(x, y);
当我打印时,公式formSub似乎没有变化。无法通过调试找到任何提示。
感谢。
答案 0 :(得分:2)
我尝试复制这个问题,但替换对我来说很好。这是我使用的代码:
Symbol xs = ctx.mkSymbol("xs");
EnumSort xSort = ctx.mkEnumSort(xs, ctx.mkSymbol("A"),ctx.mkSymbol("B"));
SetSort xSet = ctx.mkSetSort(xSort);
Expr x = ctx.mkConst("x",xSet);
Expr z = ctx.mkConst("z",xSet);
Expr f_old = ctx.mkEq(x, z);
System.out.println("old: " + f_old);
Expr y = ctx.mkConst("y",x.getSort());
BoolExpr f_new = (BoolExpr)f_old.substitute(x, y);
System.out.println("new: " + f_new);
此代码打印完全符合预期:
old: (= x z)
new: (= y z)
这不是你的情况吗?