Java 在CVC4中不使用类型参数调用自定义数据类型的arg构造函数
我试图使用Java API在CVC4中定义一个参数化数据类型Java 在CVC4中不使用类型参数调用自定义数据类型的arg构造函数,java,cvc4,Java,Cvc4,我试图使用Java API在CVC4中定义一个参数化数据类型选项 DATATYPE option[T] = None | Some(elem: T) END; 我的问题是我不知道如何调用None构造函数。 我尝试了以下代码: class Cvc4Test3 { public static void main(String... args) { Cvc4Solver.loadLibrary(); ExprManager e
选项
DATATYPE option[T] =
None
| Some(elem: T)
END;
我的问题是我不知道如何调用None
构造函数。
我尝试了以下代码:
class Cvc4Test3 {
public static void main(String... args) {
Cvc4Solver.loadLibrary();
ExprManager em = new ExprManager();
SmtEngine smt = new SmtEngine(em);
DatatypeType dt = createOptionDatatype(em);
// instantiate to int
DatatypeType dtInt = dt.instantiate(vector(em.integerType()));
// x is an integer variable
Expr x = em.mkVar("x", em.integerType());
// create equation: None::option[INT] = Some(x)
Expr l = em.mkExpr(Kind.APPLY_CONSTRUCTOR, dtInt.getConstructor("None"));
Expr la = em.mkExpr(Kind.APPLY_TYPE_ASCRIPTION, em.mkConst(new AscriptionType(dtInt)), l);
Expr r = em.mkExpr(Kind.APPLY_CONSTRUCTOR, dtInt.getConstructor("Some"), x);
Expr eq = em.mkExpr(Kind.EQUAL, la, r);
// Try to solve equation:
smt.setOption("produce-models", new SExpr(true));
smt.assertFormula(eq);
Result res = smt.checkSat();
System.out.println("res = " + res);
}
/**
* DATATYPE option[T] =
* None
* | Some(elem: T)
* END;
*/
private static DatatypeType createOptionDatatype(ExprManager em) {
Type t = em.mkSort("T");
vectorType types = vector(t);
Datatype dt = new Datatype("option", types);
DatatypeConstructor cNone = new DatatypeConstructor("None");
dt.addConstructor(cNone);
DatatypeConstructor cSome = new DatatypeConstructor("Some");
cSome.addArg("elem", t);
dt.addConstructor(cSome);
return em.mkDatatypeType(dt);
}
private static vectorType vector(Type... types) {
vectorType res = new vectorType();
for (Type t : types) {
res.add(t);
}
return res;
}
}
这将导致以下错误:
Exception in thread "main" java.lang.RuntimeException: matching failed for type ascription argument of parameterized datatype: matching failed for type ascription argument of parameterized datatype
at edu.nyu.acsys.CVC4.CVC4JNI.SmtEngine_assertFormula__SWIG_1(Native Method)
at edu.nyu.acsys.CVC4.SmtEngine.assertFormula(SmtEngine.java:149)
当我删除类型归属行时,它不会推断出正确的类型,因此我认为类型归属是必要的。在这里,我看到了没有类型归属的错误:
Exception in thread "main" java.lang.RuntimeException: Subexpressions must have a common base type:
Equation: None = Some(x)
Type 1: option[T]
Type 2: option[INT]
: Subexpressions must have a common base type:
Equation: None = Some(x)
Type 1: option[T]
Type 2: option[INT]
at edu.nyu.acsys.CVC4.CVC4JNI.SmtEngine_assertFormula__SWIG_1(Native Method)
at edu.nyu.acsys.CVC4.SmtEngine.assertFormula(SmtEngine.java:149)
如何使用Java API正确创建此数据类型和公式?从CVC4邮件列表上的Andrew Reynolds那里得到了答案: 首先,请注意,我们已经更新到一个新的API ()。
巧合的是,我刚刚提交了一份PR,其中添加了 在新API中获取所需的构造函数: 如果您对旧API感兴趣,那么您的代码几乎是正确的, 然而,在我们期望的演员阵容中存在着微妙的差异 特别是,在SMT-LIB中,强制转换应用于构造函数运算符, 不是术语(您可能对本次讨论感兴趣 ).这意味着AST CVC4中的铸造零项的定义为:(应用 (应用类型归属无T))不(应用类型归属 (APPLY_构造函数None)选项[Int])不幸的是,有一个 旧API中关于T是什么的复杂性。它不是“选项[Int]”, 而是“option[Int]类型的构造函数类型”,或者什么 我们称之为“构造函数类型” 以下是创建表达式的正确代码:
// create equation: None::option[INT] = Some(x)
Type noneInt = dtInt.getDatatype().get("None").getSpecializedConstructorType(dtInt);
Expr la = em.mkExpr(Kind.APPLY_TYPE_ASCRIPTION, em.mkConst(new AscriptionType(noneInt)), dtInt.getConstructor("None"));
Expr l = em.mkExpr(Kind.APPLY_CONSTRUCTOR, la);
Expr r = em.mkExpr(Kind.APPLY_CONSTRUCTOR, dtInt.getConstructor("Some"), x);
Expr eq = em.mkExpr(Kind.EQUAL, l, r);
从CVC4邮件列表上的Andrew Reynolds处获得答案: 首先,请注意,我们已经更新到一个新的API ()。
巧合的是,我刚刚提交了一份PR,其中添加了 在新API中获取所需的构造函数: 如果您对旧API感兴趣,那么您的代码几乎是正确的, 然而,在我们期望的演员阵容中存在着微妙的差异 特别是,在SMT-LIB中,强制转换应用于构造函数运算符, 不是术语(您可能对本次讨论感兴趣 ).这意味着AST CVC4中的铸造零项的定义为:(应用 (应用类型归属无T))不(应用类型归属 (APPLY_构造函数None)选项[Int])不幸的是,有一个 旧API中关于T是什么的复杂性。它不是“选项[Int]”, 而是“option[Int]类型的构造函数类型”,或者什么 我们称之为“构造函数类型” 以下是创建表达式的正确代码:
// create equation: None::option[INT] = Some(x)
Type noneInt = dtInt.getDatatype().get("None").getSpecializedConstructorType(dtInt);
Expr la = em.mkExpr(Kind.APPLY_TYPE_ASCRIPTION, em.mkConst(new AscriptionType(noneInt)), dtInt.getConstructor("None"));
Expr l = em.mkExpr(Kind.APPLY_CONSTRUCTOR, la);
Expr r = em.mkExpr(Kind.APPLY_CONSTRUCTOR, dtInt.getConstructor("Some"), x);
Expr eq = em.mkExpr(Kind.EQUAL, l, r);
我不确定Java层,但如果您是用SMTLib编写的,则需要一个归属。类似于:
(as None(Option Int))
。这就是Java版本试图编码的内容吗?是的,这就是我希望我的代码要做的。但是,我想我使用的API不正确。我建议直接在CVC4问题页面询问。你会得到一个更快的答案:请把你找到的作为答案贴在这里。我不确定Java层,但是如果你是用SMTLib写的,你需要一个归属。类似于:(as None(Option Int))
。这就是Java版本试图编码的内容吗?是的,这就是我希望我的代码要做的。但是,我想我使用的API不正确。我建议直接在CVC4问题页面询问。你会得到一个更快的答案:请把你找到的答案贴在这里。