【问题标题】:How can A imply B and B imply A and yet A and B are not equivalent?A 怎么能暗示 B 和 B 暗示 A 而 A 和 B 不等价?
【发布时间】:2017-12-02 15:23:51
【问题描述】:

下面是一个合金模型,它将一组数字约束为正数和偶数。我展示了两种方法(两个谓词)来实现约束。我相信这两种方式是等价的(两个谓词产生的集合是相同的)。

为了测试这两个谓词是否等价,我创建了一个断言,它说:

defining_property => generate_set_members

检查断言没有产生反例。

然后我创建了一个断言:

generate_set_members => defining_property

检查该断言也没有产生反例。

最后,我使用iff 创建了一个断言:

defining_property iff generate_set_members

检查产生了一个反例。反例是一组包含正偶数和负偶数的数字。

嗯?

A => BB => 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 =&gt; BB =&gt; A。有什么我想念的吗?

标签: alloy


【解决方案1】:

我在 4.2_2015-02-22 中复制了此内容,但在 4.2 中没有。据我所知,这是 4.2_2015 如何将 Kodkod 表示转换为 SAT 问题的一个错误。您可以通过将 SAT 求解器更改为“将 CNF 输出到文件”并在 4.2 和 4.2_2015 上运行相同的规范,然后在两个 .cnf 文件上运行 SAT4J 来重现这一点。 4.2 将有 72 个子句并且是可满足的(发现错误),而 4.2_2015 cnf 将有 66 个子句并且是不可满足的。 4.2 是稳定版本,而 4.2_2015 是实验性版本,因此现在切换回应该可以解决此问题。

【讨论】:

  • 这是一部很棒的侦探作品。谢谢@Hovercouch(您是Alloy 开发人员之一吗?)哪个是最新版本:4.2 或4.2_2015-02-22?我应该切换到 4.2 版本吗?
  • @RogerCostello 4.2 较旧,但它是稳定版本,而 4.2_2015 是实验性的。 2015 并没有给语言本身增加任何东西,所以我建议暂时切换回去。我不是开发人员之一,但我真的很喜欢正式的方法,Alloy 是我的最爱之一 :)
  • 非常感谢@Hovercouch。我下载了 4.2 并将从现在开始使用它。哦,天哪,它为我的合金模型提供了完全不同的结果。我认为我需要弄清楚为什么 generate_set_members 没有做我认为应该做的事情。
  • 我们正在尝试使用源代码创建一个 Github 站点。由于 Alloy 需要 Java VM,因此在 MacOS 上安装很麻烦。因此,在github.com/AlloyTools/org.alloytools.alloy 上发布了适用于 Mac 的版本,尽管我们还没有准备好正式发布。 @Hovercouch 你能帮忙找到这个错误吗(如果它在当前的源代码中?)
  • 我认为这是 Int 处理的问题。在 4.2_2015-02-22 中,对 int 进行了一些优化,其中处理溢出。然而,恕我直言,这不能很好地工作,因为 Int 是有限的(4 位为 -8,+7),加上加号意味着你得到 > 7。
猜你喜欢
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-10
  • 2014-03-29
  • 1970-01-01
  • 2021-10-06
  • 2011-08-10
相关资源
最近更新 更多