在下面的Alloy模型中,有三个单子子签名(Tom,John和Barb)。他们扩展了人。然后有一个断言说人只由汤姆,约翰和巴布组成。我预计合金分析仪会产生一个反例,但事实并非如此。为什么?人不是抽象的,所以可能有人不在(汤姆+约翰+倒钩),对吗?奇怪的是,当我删除"一个"从每个子签名,然后分析器生成一个反例。我很困惑。你能解释一下这里发生了什么吗?
sig Person {}
one sig Tom extends Person {}
one sig John extends Person {}
one sig Barb extends Person {}
assert No_Person_Not_In_The_Extension_Signatures {
Person = (Tom + John + Barb)
}
check No_Person_Not_In_The_Extension_Signatures
答案 0 :(得分:2)
这是因为默认范围是3.检查范围为4,您将看到反例:
sig Person {}
one sig Tom extends Person {}
one sig John extends Person {}
one sig Barb extends Person {}
assert No_Person_Not_In_The_Extension_Signatures {
Person = (Tom + John + Barb)
}
check No_Person_Not_In_The_Extension_Signatures for 4