此签名包含两个字段,每个字段包含一个整数:
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
}
}
这是为什么?为什么有时一系列约束被隐含地“和”在一起,而有时候我必须明确地约束这些约束?
答案 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