表达几个实例之间的等价

时间:2013-06-18 10:10:18

标签: alloy

假设我的模块中有一个与信号B相关的信号A.

现在想象我们有几个实例:

A$1 -> B$1   , A$2 -> B$2

A$1 -> B$2   , A$2 -> B$1

我想表示B $ 1和B $ 2是等价的(在某些条件下),只会生成此实例A$1 -> B , A$2 -> B.

其中一个解决方案可能是在声明sig B时使用关键字“one”,但在我的情况下它不起作用,因为B有几个字段,使B原子不一定等效。简而言之,只有两个原子的相应值具有相同的值,它们才是等价的。

理想情况下,我想删除B的编号,但仍然可以有几个原子B.

2 个答案:

答案 0 :(得分:4)

Alloy Analyzer不会对后续实例的生成方式(或如何破坏对称性)提供太多控制,因此您通常必须在模型级别解决这些问题。

对于您的示例,也许这是正确的模型

sig B{}

one sig BA extends B {}

sig A {
  b: one BA
}

run { #A=2 }

答案 1 :(得分:1)

首先你说你描述的两个实例是等价的,虽然在肤浅的层面上它们看起来有不同的价值,分别为1澳元和2澳元。然后你说“2个原子只有......他们的领域[具有]相同的值”。如果那是等价的定义,那么你的两个实例并不等同;如果你的两个实例是等价的,那么你的定义就不能捕捉到你想要的东西。

听起来好像你的意思是(1)B原子要么(1a)总是等价,要么(1b)在某些情况下是等价的,并且(2)如果A原子的所有值都是等值的话A原子是等价的相同或等同。并且好像你想要禁止等效的A原子。如果是这样,那么你的工作就是:

  • 定义一个谓词,对于两个B元素,当且仅当它们是等价的时才为真。
  • 为两个A元素定义谓词,当且仅当它们是等效的时才为真。
  • 定义谓词(或事实),指定实例中没有两个A原子是等价的。

如果你的问题只是分析师向你展示模型的实例,这些实例并不是彼此有趣的,那么请参阅Aleksandar Milicevic的回复。