如何表达集合中的其他内容?

时间:2017-12-01 18:11:36

标签: alloy

[更新]我花了很多时间研究@ Hovercouch的奇妙解决方案(请参阅下面的解决方案)。我采取了他的解决方案,以及彼得克里恩的见解,并写了一个摘要:3 ways to model the set of non-negative even numbers。我欢迎你的评论。

我正在尝试创建一个定义一组整数的Alloy模型。我想将集合约束为整数0, 2, 4, ...

我想使用"生成"定义集合的方法:

  1. 0在集合中。
  2. 如果集合中有i,那么i+2就在集合中。
  3. 集合中没有其他内容。
  4. 我正在努力争取最后一个 - 没有别的东西在集合中。我该如何表达?

    以下是我创建的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?
    }
    

2 个答案:

答案 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类型,因此请在树或文本视图中查看。