【发布时间】:2021-09-06 16:16:02
【问题描述】:
我正在尝试对 Alloy 中的一组数字求和。 例如,在签名 abc 中,我希望值为 a.value + b.value + c.value 之和,即 4+1+3=8。
但是,如果我使用 "+",它会给我联合集而不是总和。
PS。我知道有 "plus"(就像我在 sig sumab 中使用的那样),但这只允许我将两个值相加。
谢谢
open util/integer
sig a{value: Int}
{
value = 4
}
sig b{value: Int}
{
value = 1
}
sig c{value: Int}
{
value = 3
}
sig abc{value: set Int}
{
value = a.value + b.value + c.value
}
sig sumab{
value : Int
}
{
value = plus[a.value, b.value]
}
pred add{}
run add for 4 int, exactly 1 sumab, exactly 1 a, exactly 1 b, exactly 1 c, exactly 1 abc
注意:我是用伪代码写的,可能有助于得到答案:
fun plusN [setInt : set de Int] : Int { // function "plusN" should take a set of integers "setInt", return an integer
if #setInt = 2 //if only two numbers in set, sum them
then plus[max setInt , min setInt]
else // if more than 2, use recursion
plusN [max setInt , plusN[{setInt - max setInt}]]
}
注意 2。函数 sum 似乎是个好主意,但如果我将 1+1+1=1 相加,结果将是 1 而不是 3 作为唯一的数字设置为 1。
【问题讨论】:
-
为什么要对集合中的值求和?如果你能给我们一些你想要完成的事情的背景,它可能会帮助我们建议一种对你有用的技术。
-
我有一组任务,每个任务都有不同的成本;以及它们可以处理的具有最大成本的一组处理单元。对于每个生成的模型,我将分配给每个处理单元的任务成本求和,以使其不超过其容量。谢谢。
-
好的——那么您确定 Alloy 是解决您问题的正确工具吗?
-
好吧,我可以将任务分配给处理单元。我的问题是当我尝试在带宽之间获取每个处理单元的任务成本总和时。谢谢。
-
我的意思是,你正在解决的问题(如果我理解正确的话)看起来有点具体——一点也不抽象。因此,我想知道 Alloy 是否适合您的目的。
标签: alloy model-checking