合金api解决方案集

时间:2016-06-20 17:23:11

标签: java model alloy

我有这个用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();
            }

由于

1 个答案:

答案 0 :(得分:0)

在这两种情况下都没有找到反例。

请注意,通过方法调用loaded_model.getAllCommands().get(0)获得的命令是check a for 3,换句话说,你要求Alloy查找反例。

如果您想获得满足约束条件的实例 - 即不是反例 - 您应该使用包含关键字run而不是check的命令。