A 暗示 B 和 B 暗示 A 但 A 和 B 不等价怎么可能?
How can A imply B and B imply A and yet A and B are not equivalent?
下面是一个 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
我在 4.2_2015-02-22 中复制了这个,但在 4.2 中没有。据我所知,这是 4.2_2015 如何将 Kodkod 表示形式转换为 SAT 问题的错误。您可以通过将 SAT 解算器更改为 "output CNF to file" 和 运行 4.2 和 4.2_2015 相同的规格,然后在两个 .cnf 文件上更改 运行 SAT4J 来重现此问题。 4.2 将有 72 个子句并且是可满足的(发现错误),而 4.2_2015 cnf 将有 66 个子句并且是不可满足的。 4.2 是稳定版本,而 4.2_2015 是实验性版本,所以切换回来应该暂时解决这个问题。
下面是一个 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
我在 4.2_2015-02-22 中复制了这个,但在 4.2 中没有。据我所知,这是 4.2_2015 如何将 Kodkod 表示形式转换为 SAT 问题的错误。您可以通过将 SAT 解算器更改为 "output CNF to file" 和 运行 4.2 和 4.2_2015 相同的规格,然后在两个 .cnf 文件上更改 运行 SAT4J 来重现此问题。 4.2 将有 72 个子句并且是可满足的(发现错误),而 4.2_2015 cnf 将有 66 个子句并且是不可满足的。 4.2 是稳定版本,而 4.2_2015 是实验性版本,所以切换回来应该暂时解决这个问题。