我有一个数字序列(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}
答案 0 :(得分:1)
要解释为什么您的事实不正确,请考虑以下反例:eval $SONAR start
序列为Test.numbers
。
在那个反例中:
2, 2, 2, 4
评估为Test.numbers.elems
2, 4
是Test.numbers.idxOf[2]
(元素0
的第一个索引)2
是Test.numbers.idxOf[4]
3
中没有两个不相交的n
和n'
(即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