首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合金分析仪4.2 (mac)与合金api

合金分析仪4.2 (mac)与合金api
EN

Stack Overflow用户
提问于 2013-01-27 03:52:47
回答 1查看 711关注 0票数 2

我目前正在编写一个程序,它在java中处理一些注释,然后构建一个合金模型,使用合金api解析它,然后运行一些合金命令。当我在合金应用程序中测试生成的合金模型时,它工作正常,并给出了预期的结果。然而,当我通过API运行生成的合金模型时,它告诉我:“您必须为sig this/ObjectName指定一个作用域”。我从这样的字符串中读取合金代码。

代码语言:javascript
复制
world = CompUtil.parseOneModule(String model);

我使用的唯一选项是SAT4J求解器和skolemdepth为1。

然后,我迭代来自world的命令,将它们转换为kodkod,并执行它们。

代码语言:javascript
复制
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);
        }
}

我更新的合金代码如下所示:

代码语言:javascript
复制
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

那么,有谁知道我如何解决这个问题,因为我认为for 1配置,8个元素将设置所有扩展sigs的范围?

编辑*

我用建议更新了我的合金模型,但仍然得到相同的错误:“你必须为sig " this /Controller”指定一个作用域。上面的合金代码在合金分析器中工作,并给出如下结果:

代码语言:javascript
复制
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.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-27 04:36:48

你的合金模型包含语法错误,所以你也不能使用合金分析器运行它。

首先,指定测试控制器检查的范围的正确方法是

代码语言:javascript
复制
check testcontroller for 8 but 1 Configuration

这意味着“8个原子的一切,但1个原子的配置”,而你写的不是事件解析。

接下来,mvc_controller_style谓词是未定义的,这也会给您带来问题。

至于您的接口使用,只需将parseOneModule更改为parseEverything_fromFile,它应该可以工作。我也希望parseOneModule能在这种情况下工作(因为在您的模型中只有一个模块),但它就是不能,因为,由于某些原因,一些名称不能被正确解析。我不确定这是否是一个bug,或者该方法不应该是公共API的一部分。无论如何,下面是我的代码,它们在您的示例中工作正常:

代码语言:javascript
复制
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);
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14540945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档