Alloy:How 了解 Alloy 演示中的反例?
Alloy:How to understand the counterexample in the Alloy demo?
出于好奇,我写了一个关于 "assert" 的奇怪 Alloy 演示。
假设有一个"Program","Program"有2个"Varieties",每个"Variety"有一个"Value"来自"Data"集合.
然后我还设置了一个"fact",即"Variety"的所有"Value"都是"data1"。
最后,我设置了一个"assert",对于所有"Program","Program"中的"Variety"的所有"Value"都是"data1".
我认为"assert"满足"fact",但是当我检查"assert"时,它给出了一个反例,我无法理解,为什么它有反例?
出现代码如下:
enum Data{data1,data2}
sig Program{
Var1:Variable,
Var2:Variable
}
sig Variable{
Value:Data
}
fact{
all v:Variable{
v.Value=data1
}
}
assert test{
all p:Program{
all v:(Program->Variable){
p.v.Value=data1
}
}
}
反例如下:
我对您的示例有点困惑,因为似乎没有使用 var1 和 var2 字段。但是你得到一个反例的原因可能是因为 v 可以是空的,在这种情况下 p.v.Value
求值为空关系,而 data1
求值为单例,所以它们不相等。
我的问题有两个错误,我修改了代码,现在就可以了
enum Data{data1,data2}
sig Program{
Var1:Variable,
Var2:Variable
}
sig Variable{
Value:Data
}
fact{
all p:Program{
//In theory, there should be "all v:(Program->Variable)", but Alloy does not support HOL.
//all v:(Program->Variable){
p.Var1.Value=data1
p.Var2.Value=data1
// }
}
}
assert test{
all p:Program{
p.Var1.Value=data1
p.Var2.Value=data2
// And here is another mistake, Var1 and Var2 is only the subset of "all v:(Program->Variable)"
// all v:(Program->Variable){
// p.v.Value=data1
// }
}
}
check test for 10 but 1 Program
出于好奇,我写了一个关于 "assert" 的奇怪 Alloy 演示。
假设有一个"Program","Program"有2个"Varieties",每个"Variety"有一个"Value"来自"Data"集合.
然后我还设置了一个"fact",即"Variety"的所有"Value"都是"data1"。
最后,我设置了一个"assert",对于所有"Program","Program"中的"Variety"的所有"Value"都是"data1".
我认为"assert"满足"fact",但是当我检查"assert"时,它给出了一个反例,我无法理解,为什么它有反例?
出现代码如下:
enum Data{data1,data2}
sig Program{
Var1:Variable,
Var2:Variable
}
sig Variable{
Value:Data
}
fact{
all v:Variable{
v.Value=data1
}
}
assert test{
all p:Program{
all v:(Program->Variable){
p.v.Value=data1
}
}
}
反例如下:
我对您的示例有点困惑,因为似乎没有使用 var1 和 var2 字段。但是你得到一个反例的原因可能是因为 v 可以是空的,在这种情况下 p.v.Value
求值为空关系,而 data1
求值为单例,所以它们不相等。
我的问题有两个错误,我修改了代码,现在就可以了
enum Data{data1,data2}
sig Program{
Var1:Variable,
Var2:Variable
}
sig Variable{
Value:Data
}
fact{
all p:Program{
//In theory, there should be "all v:(Program->Variable)", but Alloy does not support HOL.
//all v:(Program->Variable){
p.Var1.Value=data1
p.Var2.Value=data1
// }
}
}
assert test{
all p:Program{
p.Var1.Value=data1
p.Var2.Value=data2
// And here is another mistake, Var1 and Var2 is only the subset of "all v:(Program->Variable)"
// all v:(Program->Variable){
// p.v.Value=data1
// }
}
}
check test for 10 but 1 Program