我有这个用Alloy写的简单模型:
module login
sig Email {}
sig Password {}
sig User {
login: one Login
}
sig Login {
email: one Email,
password: one Password,
owner: one User,
}
fact {
all u:User | u.login.owner = u
}
assert a {
all l:Login | one l.owner
all u:User | one u.login.email
all u:User | u.login.owner = u
}
check a for 3
如果我使用合金分析仪GUI运行它,它会说:
没有找到反例。断言可能有效。 11毫秒。
但是如果我在我的java程序中使用API运行相同的模型,它将返回:
--- ---观察
不可满足。
甚至没有显示1个解决方案。
有人可以帮助我发现问题吗?
以下是使用API的java代码:
A4Reporter rep = new A4Reporter();
try {
Module loaded_model = CompUtil.parseEverything_fromFile(rep, null, model.getModelpath());
A4Options options = new A4Options();
options.solver = A4Options.SatSolver.SAT4J;
Command cmd = loaded_model.getAllCommands().get(0);
A4Solution sol = TranslateAlloyToKodkod.execute_command(rep, loaded_model.getAllReachableSigs(), cmd, options);
System.out.println(sol.toString());
while (sol.satisfiable()) {
System.out.println("[Solution]:");
System.out.println(sol.toString());
sol = sol.next();
}
} catch (Err e){
e.printStackTrace();
}
由于
答案 0 :(得分:0)
在这两种情况下都没有找到反例。
请注意,通过方法调用loaded_model.getAllCommands().get(0)
获得的命令是check a for 3
,换句话说,你要求Alloy查找反例。
如果您想获得满足约束条件的实例 - 即不是反例 - 您应该使用包含关键字run
而不是check
的命令。