怎么表达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" 方法来定义集合:

  1. 0在集合中。
  2. 如果i在集合中,那么i+2在集合中。
  3. 集合中没有其他内容。

我正在努力处理最后一个 - 集合中没有其他内容。我该如何表达?

下面是我创建的 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 类型,因此请查看树或文本视图。