[更新]我花了很多时间研究@ Hovercouch的奇妙解决方案(请参阅下面的解决方案)。我采取了他的解决方案,以及彼得克里恩的见解,并写了一个摘要:3 ways to model the set of non-negative even numbers。我欢迎你的评论。
我正在尝试创建一个定义一组整数的Alloy模型。我想将集合约束为整数0, 2, 4, ...
我想使用"生成"定义集合的方法:
0
在集合中。i
,那么i+2
就在集合中。我正在努力争取最后一个 - 没有别的东西在集合中。我该如何表达?
以下是我创建的Alloy模型。
one sig PositiveEven {
elements: set Int
}
pred generate_set_members {
0 in PositiveEven.elements
all i: Int | i in PositiveEven.elements => i.plus[2] in PositiveEven.elements
// Nothing else is in the set - How to express this?
}
答案 0 :(得分:1)
最简单的方法是创建一个关系,将每个数字N映射到N + 2,然后将该关系的自反传递闭包超过0。
one sig PositiveEven {
elements: set Int
}
one sig Generator {
rel: Int -> Int
} {
all i: Int | i.rel = i.next.next
}
pred generate_set_members {
PositiveEven.elements = 0.*(Generator.rel)
}
assert only_positive_elements {
generate_set_members =>
all i: Int | i in PositiveEven.elements <=> i >= 0 and i.rem[2] = 0
}
请注意,不能使用i.plus[2]
而不是i.next.next
,因为合金整数溢出为负数。
答案 1 :(得分:1)
您怎么看待这个:
let iset[min,max,step] = { i : Int |
i>= min
and i<max
and i.minus[min].div[step].mul[step]
= i.minus[min] }
pred show[ s : set Int ] {
iset[ 0, 10, 2 ] = s
}
run show for 0 but 8 int
可视化工具不显示Int类型,因此请在树或文本视图中查看。