A如何暗示B和B暗示A而A和B不相等?

时间:2017-12-02 15:23:51

标签: alloy

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

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

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

1 个答案:

答案 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是实验性的,所以现在切换回来应该解决这个问题。