怎么表达Nothing else in the set?
How to express Nothing else in the set?
[更新] 我花了很多时间研究@Hovercouch 的绝妙解决方案(请参阅下面他的解决方案)。我采用了他的解决方案以及 Peter Krien 的见解并写了一个摘要:3 ways to model the set of non-negative even numbers。欢迎大家发表意见。
我正在尝试创建一个 Alloy 模型来定义一组整数。我想将集合限制为整数 0, 2, 4, ...
我想使用 "generative" 方法来定义集合:
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?
}
执行此操作的最简单方法是创建一个将每个数字 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
,因为 Alloy 整数溢出为负数。
你怎么看这个:
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 类型,因此请查看树或文本视图。
[更新] 我花了很多时间研究@Hovercouch 的绝妙解决方案(请参阅下面他的解决方案)。我采用了他的解决方案以及 Peter Krien 的见解并写了一个摘要:3 ways to model the set of non-negative even numbers。欢迎大家发表意见。
我正在尝试创建一个 Alloy 模型来定义一组整数。我想将集合限制为整数 0, 2, 4, ...
我想使用 "generative" 方法来定义集合:
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?
}
执行此操作的最简单方法是创建一个将每个数字 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
,因为 Alloy 整数溢出为负数。
你怎么看这个:
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 类型,因此请查看树或文本视图。