Alloy 包含与排除关系-可以';t型成型机_
比方说Alloy 包含与排除关系-可以';t型成型机_,alloy,Alloy,比方说 有四个唯一的对象A、B、C和D 还有四个独特的框b1、b2、b3和b4 A、B、C、D集合中的一些对象放在b1框中;完全移除以将对象集返回到其先前的A、B、C、D配置;然后放入b2箱;删除等等。在b4之前,换句话说,我们有四个“重组回合” 一个长方体可以容纳所需数量的对象,但 有一个约束:每一个对象将在四个重组轮中的一轮中丢失一次,也就是说,这些轮将是(顺序不重要): ABC、ABD、ACD、BCD 好的,现在-如果我尝试使用“Skipound”关系来建模: abstract si
- 有四个唯一的对象A、B、C和D
- 还有四个独特的框b1、b2、b3和b4李>
- A、B、C、D集合中的一些对象放在b1框中;完全移除以将对象集返回到其先前的A、B、C、D配置;然后放入b2箱;删除等等。在b4之前,换句话说,我们有四个“重组回合”
- 一个长方体可以容纳所需数量的对象,但
- 有一个约束:每一个对象将在四个重组轮中的一轮中丢失一次,也就是说,这些轮将是(顺序不重要): ABC、ABD、ACD、BCD
好的,现在-如果我尝试使用“Skipound”关系来建模:
abstract sig Object {
skipround: one Box
}
abstract sig Box {}
one sig A,B,C,D extends Object {}
one sig b1, b2,b3, b4 extends Box {}
fact {
all b:Box | one o:Object | o.skipround=b
}
run {} for 5
。。。它是有效的。
OTOH,如果我建立一个“includedinround”关系模型:
/// note the fact turnaround
abstract sig Object {
includedinround: set Box
}{#includedinround = 3}
abstract sig Box {}
one sig A,B,C,D extends Object {}
one sig b1, b2,b3, b4 extends Box {}
fact {
all o:Object | one b:Box | o.includedinround != b
}
run {} for 5
。。。。没有找到实例
给你什么?我认为你的事实部分应该是这样的:
fact {
all o:Object | one b:Box | b not in o.includedinround
}
在您的原始事实中,
b
始终是一个单例集,即它只有一个元素。但是o.includedinaround
有三个元素。因此,b
和o.includedinaround
永远不可能相等。所以o.includedinround!=b
对每个b都是真的,而不仅仅是一个b,而且事实永远不会是真的。因此,没有找到任何实例。我认为合金分析仪解释签名原子并对其进行量化的方式有点混乱。对于第一个模型,一旦事实陈述对Box
进行了量化,Alloy就知道宇宙中正好有四个不同的Box
对象。但在第二个事实中,量词在宇宙中可以有无限多的对象
原子。假设o1
和o2
是对象的两个原子,那么包含在周围的可以是{o1->b1,o1->b2,o1->b3,o1->b1,o2->o3->b3}
。基本上,原子之间的区别并不意味着你可能想要的唯一性的实际语义。这些量词称为未绑定量词
一般来说,这个问题的一个解决方案是编写一个谓词来保证复合签名的实际唯一性,如Object
:
fact uniqe_fact{all disj o,o': Object | o.includedinround = o'.includedinround}
现在,fact inclusion1_fact{all o:Object | one b:Box | b!in o.includedinround}
将起作用;尽管如此,由于附加事实中的约束,有四个唯一的对象原子
,这使得包含1_事实
不必要
另一种可能的解决方案是在绑定实体上进行量化,在本例中是Box
。以下事实也起作用,因为要量化的Box
正好有四个原子:
fact inclusion2_fact{all b:Box | one o: Object | (b + o.includedinround) = Box}
谢谢你看。我只是按照你的建议更新了模型,结果是,有些盒子有四个对象,有些盒子只有一个。不是预期的结果-我的观点是每个对象都要从一个框中准确地排除一次。