[英]Alloy Analyzer 4.2 (mac) versus alloy api
我目前正在制作一个程序,该程序在Java中处理一些注释,然后构建一个合金模型,使用Alloy api对其进行解析,然后运行一些Alloy命令。 当我在Alloy应用程序中测试生成的合金模型时,它可以正常工作,并给了我预期的结果。 但是,当我通过API运行生成的合金模型时,它会告诉我:“您必须为该this / ObjectName指定一个范围”。 我从这样的字符串中读取合金代码。
world = CompUtil.parseOneModule(String model);
我使用的唯一选项是SAT4J解算器,并且skolemdepth为1。
然后,我遍历世界上的命令,将其转换为kodkod并执行它们。
for(Command command: world.getAllCommands()) {
A4Solution ans = null;
try {
ans = TranslateAlloyToKodkod.execute_command(rep, world.getAllReachableSigs(), command, options);
} catch (Err ex) {
Logger.getLogger(AlloyTest.class.getName()).log(Level.SEVERE, null, ex);
}
}
我的UPDATED Alloy代码如下所示:
module mvc
// General model
abstract sig Configuration { elements: set Element }
abstract sig Element { references: set Element }
// MVC Style
abstract sig Model extends Element { }
abstract sig View extends Element { }
abstract sig Controller extends Element { }
pred mvc_model_style [c: Configuration] {
all m: c.elements & Model | all r: m.references | r not in View
}
pred mvc_view_style [c: Configuration] {
all view: c.elements & View | all ref: view.references | ref not in Model
}
pred mvc_controller_style [c: Configuration] {
all controller: c.elements & Controller | all ref: controller.references | ref in Model or ref in View or ref in Controller
}
pred mvc_style [c: Configuration]{
mvc_model_style[c] mvc_view_style[c]
}
one sig testMvc extends Configuration { } {
elements = TestController + ViewTest + TestModel + TestController3
}
one sig TestController extends Controller { } {
references = TestController + TestModel
}
one sig ViewTest extends View { } {
references = TestController
}
one sig TestModel extends Model { } {
references = ViewTest + TestController3
}
one sig TestController3 extends Controller { } {
references = TestController + TestModel
}
assert testcontroller {
mvc_controller_style[testMvc]
}
assert viewtest {
mvc_view_style[testMvc]
}
assert testmodel {
mvc_model_style[testMvc]
}
assert testcontroller3 {
mvc_controller_style[testMvc]
}
check testcontroller for 8 but 1 Configuration
check viewtest for 8 but 1 Configuration
check testmodel for 8 but 1 Configuration
check testcontroller3 for 8 but 1 Configuration
那么,有人对我该如何解决这个问题有任何想法,因为我认为1配置8元素将为所有扩展信号设置范围。
编辑*
我用建议更新了我的合金模型,但仍然出现相同的错误:“您必须为sig“ this / Controller”指定范围。上面的合金代码在Alloy Analyzer中起作用,并给出以下结果:
Executing "Check testcontroller for 8 but 1 Configuration"
Solver=sat4j Bitwidth=0 MaxSeq=0 SkolemDepth=1 Symmetry=20
83 vars. 26 primary vars. 98 clauses. 5ms.
No counterexample found. Assertion may be valid. 1ms.
Executing "Check viewtest for 8 but 1 Configuration"
Solver=sat4j Bitwidth=0 MaxSeq=0 SkolemDepth=1 Symmetry=20
65 vars. 25 primary vars. 75 clauses. 5ms.
No counterexample found. Assertion may be valid. 0ms.
Executing "Check testmodel for 8 but 1 Configuration"
Solver=sat4j Bitwidth=0 MaxSeq=0 SkolemDepth=1 Symmetry=20
65 vars. 25 primary vars. 75 clauses. 5ms.
found. Assertion is invalid. 6ms.
Executing "Check testcontroller3 for 8 but 1 Configuration"
Solver=sat4j Bitwidth=0 MaxSeq=0 SkolemDepth=1 Symmetry=20
83 vars. 26 primary vars. 98 clauses. 6ms.
No counterexample found. Assertion may be valid. 0ms.
您的Alloy模型包含语法错误,因此您也无法使用Alloy Analyzer运行它。
首先,指定测试控制器检查范围的正确方法是
check testcontroller for 8 but 1 Configuration
这意味着“对于所有事物的8个原子,但对于配置1个原子”,而您编写的内容不是事件解析的。
接下来,未定义mvc_controller_style
谓词,这也会导致您遇到问题。
至于您的API使用情况,只需将parseOneModule
更改为parseEverything_fromFile
,它应该可以工作。 我也希望parseOneModule
在这种情况下可以工作(因为您的模型中只有一个模块),但实际上却没有,因为某些原因,某些名称无法正确解析。 我不确定这是一个错误还是该方法不应该成为公共API的一部分。 无论如何,这是我的代码可以正确地用于您的示例:
public static void main(String[] args) throws Exception {
A4Reporter rep = new A4Reporter();
Module world = CompUtil.parseEverything_fromFile(rep, null, "mvc.als");
A4Options options = new A4Options();
options.solver = A4Options.SatSolver.SAT4J;
options.skolemDepth = 1;
for (Command command : world.getAllCommands()) {
A4Solution ans = null;
try {
ans = TranslateAlloyToKodkod.execute_commandFromBook(rep, world.getAllReachableSigs(), command, options);
System.out.println(ans);
} catch (Err ex) {
Logger.getLogger(AlloyTest.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.