java - Alloy:一个紧凑的 Java 程序,用于执行不同的运行命令范围

标签 java scope command signature alloy

假设我想要创建一个 Java 程序来执行多次 Alloy 运行,为每个循环更改其范围值(从 0 到 9 的整数),以检查哪个会找到花费时间更少的解决方案。

请注意,命令实际上是相同的,我的意思是,只有范围的值(以及保留字“exactly”的存在/不存在)会有所不同。

这是一个数字示例:

1st run → command: run MyPred for 3 but 5 Int, exactly 1 Sig_Scope1, 1 Sig_Scope2, exactly 1 Sig_Scope3
2nd run → command: run MyPred for 4 but 5 Int, 2 Sig_Scope1, exactly 2 Sig_Scope2, exactly 2 Sig_Scope3
3rd run → command: run MyPred for 4 but 5 Int, 2 Sig_Scope1, exactly 1 Sig_Scope2, 1 Sig_Scope3

依此类推,直到达到最大迭代次数(假设 10)。

10th run → command: run MyPred for 4 but 5 Int, 0 Sig_Scope1, exactly 2 Sig_Scope2, 0 Sig_Scope3

程序输出如下:

1st run. Found solution: Yes. Spent time: 17 seconds
2nd run. Found solution: No. Spent time: [it may take a time until the Alloy analyzer is going to return no solution]
3nd run. Found solution: No. Spent time: [it may take a time until the Alloy analyzer is going to return no solution]
...
9th run. Found solution: Yes. Spent time: 21 seconds
10th run. Found solution: Yes. Spent time: 10 seconds

这是我试图查看的伪代码,但有很多片段(文本问题)我不知道如何实现它或如何找到更多学习 Material :

...
A4Reporter rep = new A4Reporter() {...}
...
Module world = CompUtil.parseEverything_fromFile(rep, null, filename); //reading Alloy filename.
...
A4Options options = new A4Options(); //Analyzer’s options.
...
Command command: world.getAllCommands(); //I’am looking for Alloy’s ‘run’ commands, for instance, the first run command would be: run MyPred for 3 but 3 Int, exactly 1 Sig_Scope1, 1 Sig_Scope2, exactly 1 Sig_Scope3
...
Int max_number_of_runs = 10;
for(i = 0; i < max_number_of_runs; i++) {
    A4Solution ans = TranslateAlloyToKodkod.execute_command(rep, world.getAllReachableSigs(), command, options); //get all Signatures, fine :)
    System.out.println(ans); //printing the whole command.
    if (ans.satisfiable()) {
        //How can I get the amount of time (in seconds) to found a solution as an integer or String?
        //Getting the label of the Sigs. I have got this way, however I do not know if it is the right one.
        SafeList<Sig> sigs = ans.getAllReachableSigs();
            for (Sig sig : sigs) {
                System.out.println(sig.shortLabel());
            }
        //For each Sig how can I get their values?
        //How can I build a new command (Command new_built_command) for the next run? The values of scope Sig will come from a list or they will be generated through Java Random class (I mean a know how to generate random integers).
        command = new_built_command;
    } else {
        //A message that the current command did not find a solution as a String!
    }
}

你能帮我解决这个问题吗?

最佳答案

How can I build a new command

您可以看到ExampleUsingTheAPI有关使用 Alloy API 构建 Alloy 模型的示例。使用该 API,您可以以编程方式构建要运行的 Command。或者,您可以从文本形式的合金模型开始,使用 CompUtil.parseEverything_fromString 解析它。 ,然后在原始 Alloy 模型上执行字符串查找替换来更新命令,然后重新开始。

For each Sig how can I get their values?

参见ExampleCompilingFromSource ,第 44 行。基本上,一旦获得 A4Solution 对象,您就可以调用它的 eval 方法,根据找到的解决方案评估任何表达式(如果您传递 >Sig 对象,您将在解决方案中获得它的值)。

How can I get the amount of time (in seconds) to found a solution as an integer or String?

我不确定 A4Solution 是否包含有关求解时间的任何信息,因此在这种情况下,您必须自己测量时间。

关于java - Alloy:一个紧凑的 Java 程序,用于执行不同的运行命令范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41369518/

相关文章:

java - 使用 JFreechart 调整适合另一个轴的大小

java - Swing 中的平铺图像

java - Swing 中的统一工具栏无法正常工作

javascript - 范围和访问匿名函数中的外部变量?

bash - "echo $?"仅适用于 linux/aix,不适用于Solaris/hp-ux [奇怪!或者我错过了什么]?

java - 添加到 ArrayList 未按预期工作/错误

JavaScript: 'Protected' 范围

c++ - 如何在另一个类的方法中使用一个类的实例?

Linux命令以间隔运行脚本

wpf - 使用 MVVM 的上下文菜单项命令绑定(bind) WPF