什么时候约束是隐式AND'ed与什么时候必须约束明确AND?

时间:2017-09-05 21:55:08

标签: alloy

此签名包含两个字段,每个字段包含一个整数:

sig Test {
    a: Int,
    b: Int
}

此谓词包含一系列约束:

pred Show (t: Test) {
    t.a = 0
    t.b = 1
}

这些约束是隐含的“和”。所以,该谓词等同于这个谓词:

pred Show (t: Test) {
    t.a = 0 and
    t.b = 1
}

此断言包含一系列约束,后跟一个蕴涵运算符:

assert ImplicationTest {
    all t: Test {
        t.a = 0
        t.b = 1 => plus[t.a, t.b] = t.b
    }
}

但是在这种情况下,约束不是隐含地并且在一起。如果我想要他们和他们在一起,我必须明确地和他们:

assert ImplicationTest {
    all t: Test {
        t.a = 0 and
        t.b = 1 => plus[t.a, t.b] = t.b
    }
}

这是为什么?为什么有时一系列约束被隐含地“和”在一起,而有时候我必须明确地约束这些约束?

1 个答案:

答案 0 :(得分:1)

我查看了解析器,据我所知,它将换行符/空格的右侧和左侧视为带括号的表达式。

expr exprs -> expr and exprs

因此:

t.a = 0  t.b = 1   t.c =2  => plus[t.a, t.b] = t.b

相当于:

(t.a = 0) and (t.b = 1 and ( t.c => plus[t.a, t.b] = t.b))

以下模型似乎表明这些表达式是等价的:

sig Test {
    a: Int,
    b: Int,
    c: Int
}

pred simple( t: Test ) {
    t.a = 0 t.b = 1 t.c = 2 => plus[t.a, t.b] = t.b
}

pred full( t: Test ) {
    (t.a = 0) and  ((t.b = 1) and (t.c=2 => plus[t.a, t.b] = t.b))
}

assert Equivalent {
    all t : Test {
        simple[t] <=> full[t]
    }
}

check Equivalent for 10