假设我的模块中有一个与信号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.
答案 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原子。如果是这样,那么你的工作就是:
如果你的问题只是分析师向你展示模型的实例,这些实例并不是彼此有趣的,那么请参阅Aleksandar Milicevic的回复。