包括vs排除关系 - 无法模拟前_properly_

时间:2015-01-18 05:07:25

标签: alloy

让我们说,

  • 有四个独特的对象A,B,C和D.
  • 还有四个独特的方框b1,b2,b3和b4。
  • A,B,C,D组中的一些物体放在方框b1中;完全删除后将对象集返回其先前的A,B,C,D配置;然后放入方框b2;删除等等。直到b4 ..换句话说,我们有四轮"重组轮次"
  • 一个框可以容纳所需数量的对象,但
  • 有一个约束:每个对象将在四个重组轮次中的一个中恰好丢失一次,也就是说,轮次将是(命令不会): ABC,ABD,ACD,BCD。

好的,现在 - 如果我尝试使用" skipround"来模拟它关系:

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,如果我模仿"包括在内外"关系:

/// 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

....没有找到实例

是什么给了什么?

2 个答案:

答案 0 :(得分:0)

我认为你的事实部分应该是这样的:

fact {
    all o:Object | one b:Box | b not in o.includedinround
}

在您最初的事实中,b始终是一个单例集,即它只有一个元素。但o.includedinaround有三个要素。因此bo.includedinaround永远不会相等。因此o.includedinround != b适用于每个 b,而不仅仅是一个 b,事实永远不会成立。所以没有找到实例。

答案 1 :(得分:0)

我认为合金分析仪解释签名原子并量化它们的方式会让人感到有些困惑。对于第一个模型,一旦事实陈述量化超过Box,Alloy就知道宇宙中恰好有四个不同的Box对象。但在第二个事实中,量词可以在宇宙中拥有无限数量的Objects个原子。假设o1o2Object的两个原子,则includedinround可以是{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}可行;但是,由于附加事实中的约束,有Object的四个独特原子使得inclusion1_fact不必要。

另一种可能的解决方案是对绑定实体进行量化,在这种情况下为Box。以下事实也有效,因为正好有四个Box原子被量化:

fact inclusion2_fact{all b:Box | one o: Object | (b + o.includedinround) = Box}