如何实现一系列数字,每个连续对增加4?

时间:2017-04-26 21:52:05

标签: alloy

我有一个数字序列(seq)。

我希望每对连续数字的加法等于4。

以下是我尝试实施此功能。但是,这是错误的。合金分析仪通过生成此实例向我显示它是错误的:

2, 2, -2, 4

第一对增加到4.(2 + 2 = 4)

第二对没有。 (2 + -2 = 0)

实现这个的正确方法是什么?注意:我需要使用序列(seq),因此请不要更改签名或其字段。我希望你能告诉我表达fact的正确方法。或者,告诉我使用seq来实现它是不可能的。

one sig Test {
    numbers: seq Int
}

fact {
    all disj n, n': Test.numbers.elems { 
        (plus[Test.numbers.idxOf[n], 1] = Test.numbers.idxOf[n']) =>
            plus[n, n'] = 4
    }
}

run {#Test.numbers.indsOf[2] > 1}

1 个答案:

答案 0 :(得分:1)

要解释为什么您的事实不正确,请考虑以下反例:eval $SONAR start序列为Test.numbers

在那个反例中:

  • 2, 2, 2, 4评估为Test.numbers.elems
  • 2, 4Test.numbers.idxOf[2](元素0的第一个索引)
  • 2Test.numbers.idxOf[4]
  • 3中没有两个不相交的nn'(即Test.numbers.elems),{2, 4}所以plus[Test.numbers.idxOf[n], 1] = Test.numbers.idxOf[n']这个事实非常简单。

以下事实应正确表达您所需的财产:

fact {
    all i: Test.numbers.inds - (#Test.numbers).prev | 
      plus[Test.numbers[i], Test.numbers[i.next]] = 4
}
  • mySeq.inds计算序列mySeq
  • 的索引
  • i.next评估为i + 1
  • i.prev评估为i - 1