使用Alloy API为合金分析仪

时间:2015-06-29 17:20:39

标签: alloy

我刚刚阅读了软件抽象书,并且非常喜欢Alloy的预期用途。但是我想将它用于超出其预期目的。创造性地思考,我想使用Alloy来查找从真实数据推断出的模型实例中的反例(断言检查)。是否可以对您自己的数据实例使用Alloy API?我希望底层API足够模块化,以便我可以编写自己的工作流程,而无需详细了解整个系统。如果有这方面的例子,我会很感激指针。谢谢。

1 个答案:

答案 0 :(得分:2)

使用Alloy java API,您可以轻松评估实例中的表达式。

  1. 使用CompUtil类的一种方法获取生成实例的模块。
  2. 然后检索您感兴趣的实例(之前保存在xml文件中),如下所示:A4SolutionReader.read(module.getAllReachableSigs(), new XMLNode(new File("full/path/to/yourInstance.xml"))) ;
  3. 最后使用刚刚获得的A4Solution对象的eval(ExprVar e)方法来评估实例中的表达式。 (您需要使用computil类中的方法parseOneExpression_fromString从String中获取ExprVar对象。)
  4. 如果您不愿意使用API​​,还有另一种方法可以单独使用分析器来执行您想要的操作。 它是对您的原始模型进行过度约束,以便只有您感兴趣的实例才能符合它。然后你必须检查你对这个模型的断言。

    关于如何约束模型的一个小例子:

    假设您有一个模型:

    sig A{
    } 
    sig B{
      a:A
    }
    sig C{}
    

    您对该实例感兴趣:

    A:{A$0,A$1}
    B:{B$0} 
    a:> (B$0,A$0)
    C:{}
    

    然后你过度约束的模型将是:

    //=== model ====
    abstract sig A{
    } 
    abstract sig B{
      a:A
    }
    abstract sig C{}
    
    //==== instance ===
    one sig A_0,A_1 extends A{}
    one sig B_0 extends B{
    }{ 
       a=A_0
    }
    
    fact {
      no C // should be specified explicitly as the Alloy analyzer will instantiate abstract signatures if they are not inherited.   
    }