以下是Alloy模型,它将一组数字约束为正数和偶数。我展示了两种方式(两个谓词)来实现约束。我相信这两种方式是等价的(谓词产生的集合是相同的)。
为了测试这两个谓词是等价的,我创建了一个断言:
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
答案 0 :(得分:1)
我在4.2_2015-02-22中再现了这个,但在4.2上没有。据我所知,这是4.2_2015如何将Kodkod表示转换为SAT问题的一个错误。您可以通过将SAT解算器更改为&#34;输出CNF到文件&#34;来重现这一点。并在4.2和4.2_2015上运行相同的规范,然后在.cnf文件上运行SAT4J。 4.2将有72个条款并且可以满足(发现错误),而4.2_2015 cnf将有66个条款并且不可满足。 4.2是稳定版本,而4.2_2015是实验性的,所以现在切换回来应该解决这个问题。