我刚刚阅读了软件抽象书,并且非常喜欢Alloy的预期用途。但是我想将它用于超出其预期目的。创造性地思考,我想使用Alloy来查找从真实数据推断出的模型实例中的反例(断言检查)。是否可以对您自己的数据实例使用Alloy API?我希望底层API足够模块化,以便我可以编写自己的工作流程,而无需详细了解整个系统。如果有这方面的例子,我会很感激指针。谢谢。
答案 0 :(得分:2)
使用Alloy java API,您可以轻松评估实例中的表达式。
A4SolutionReader.read(module.getAllReachableSigs(), new XMLNode(new File("full/path/to/yourInstance.xml"))) ;
如果您不愿意使用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.
}