【发布时间】:2017-12-02 15:23:51
【问题描述】:
下面是一个合金模型,它将一组数字约束为正数和偶数。我展示了两种方法(两个谓词)来实现约束。我相信这两种方式是等价的(两个谓词产生的集合是相同的)。
为了测试这两个谓词是否等价,我创建了一个断言,它说:
defining_property => generate_set_members
检查断言没有产生反例。
然后我创建了一个断言:
generate_set_members => defining_property
检查该断言也没有产生反例。
最后,我使用iff 创建了一个断言:
defining_property iff generate_set_members
检查产生了一个反例。反例是一组包含正偶数和负偶数的数字。
嗯?
A => B 和 B => A 怎么可能是真的而A iff B 是假的?
one sig PositiveEven {
elements: set Int
}
/*
To be in the set, a member must have these two properties:
- it must be be positive
- it must be even
*/
pred defining_property {
PositiveEven.elements = {i: Int | i >= 0 and (rem[i,2] = 0)}
}
/*
0 is in the set
If i is in the set, then i+2 is in the set
Nothing else is in the set
*/
pred generate_set_members {
0 in PositiveEven.elements
all i: PositiveEven.elements - 0 | i.minus[2] in PositiveEven.elements
// Create a complete set of positive even elements
all i: Int | i.minus[2] in PositiveEven.elements => i in PositiveEven.elements
}
assert equivalent_constraints {
//defining_property iff generate_set_members
//defining_property => generate_set_members
generate_set_members => defining_property
}
assert only_positive_even_numbers {
//generate_set_members =>
defining_property =>
all i: Int | i in PositiveEven.elements <=> i >= 0 and i.rem[2] = 0
}
run defining_property
run generate_set_members
check equivalent_constraints
check only_positive_even_numbers
【问题讨论】:
-
您能发布完整的规格吗?我得到了你提供的两个断言的反例。
-
嗨@Hovercouch,我包含了我完整的合金文件。看上面。感谢您对此进行调查!
-
0 不是正数
-
哈!我新的人会指出这一点。我认为说正整数比说非负整数更容易。谢谢@JonMark Perry。
-
@RogerCostello 有了新的规范,我仍然得到
equivalent_contraints的反例,A => B和B => A。有什么我想念的吗?
标签: alloy