我如何确定我的断言实际上正在检查我想要检查的东西?
How can I be sure that my assert is actually checking the thing that I want checked?
下面是电子邮件地址簿的 Alloy 模型。地址簿中的每个名字都映射到一个名字或一个地址。
我希望每个名字最终映射到一个地址,例如 Family -> Tom -> Tom_addr。我创建了一个事实来实现这一点。为了检查我的事实是否正确,我创建了一个断言。
我对在断言中放置什么感到困惑。奇怪的是,我放在 "fact" 部分的表达式似乎是放在断言中的正确表达式。但是断言只会重复事实,这没有帮助。所以我创建了一些其他的东西放在断言中。
我不完全相信我放在 "assert" 部分的内容实际上会检查每个名称最终是否映射到地址。
问题:
在 "fact" 部分,我是否正确表达了每个名称最终映射到一个地址的约束条件?
在 "assert" 部分,是否有更好的方法来断言每个名称最终都映射到一个地址?
sig Addr {}
sig Name {
address: some Addr + Name
}
fact {
// No cycles.
no n: Name | n in n.^address
// All names eventually map to an Addr.
// Here's how I implemented the constraint:
// There is no name n that is mapped-to (i.e., m -> n),
// which does not map-to something (i.e., n -> p).
no n: Name {
n in univ.address
n not in address.univ
}
}
assert All_names_eventually_map_to_an_Addr {
all n: Name | some n.^address & Addr
}
check All_names_eventually_map_to_an_Addr
重复事实的断言是您可能不想拥有的东西,因为它确实很有用。 (考虑假设下的 checking/proving a 属性 - (Q and P) 形式的蕴涵意味着 P 显然对任何 成立P 和 Q.)
话虽如此,属性:
every name eventually maps to an address
应该按照您的代码片段中给出的方式正确表达。 (闭包只能映射到 Address
的一个元素,因为关系 address
没有为 Address
的实例定义。)
下面是电子邮件地址簿的 Alloy 模型。地址簿中的每个名字都映射到一个名字或一个地址。
我希望每个名字最终映射到一个地址,例如 Family -> Tom -> Tom_addr。我创建了一个事实来实现这一点。为了检查我的事实是否正确,我创建了一个断言。
我对在断言中放置什么感到困惑。奇怪的是,我放在 "fact" 部分的表达式似乎是放在断言中的正确表达式。但是断言只会重复事实,这没有帮助。所以我创建了一些其他的东西放在断言中。
我不完全相信我放在 "assert" 部分的内容实际上会检查每个名称最终是否映射到地址。
问题:
在 "fact" 部分,我是否正确表达了每个名称最终映射到一个地址的约束条件?
在 "assert" 部分,是否有更好的方法来断言每个名称最终都映射到一个地址?
sig Addr {}
sig Name {
address: some Addr + Name
}
fact {
// No cycles.
no n: Name | n in n.^address
// All names eventually map to an Addr.
// Here's how I implemented the constraint:
// There is no name n that is mapped-to (i.e., m -> n),
// which does not map-to something (i.e., n -> p).
no n: Name {
n in univ.address
n not in address.univ
}
}
assert All_names_eventually_map_to_an_Addr {
all n: Name | some n.^address & Addr
}
check All_names_eventually_map_to_an_Addr
重复事实的断言是您可能不想拥有的东西,因为它确实很有用。 (考虑假设下的 checking/proving a 属性 - (Q and P) 形式的蕴涵意味着 P 显然对任何 成立P 和 Q.)
话虽如此,属性:
every name eventually maps to an address
应该按照您的代码片段中给出的方式正确表达。 (闭包只能映射到 Address
的一个元素,因为关系 address
没有为 Address
的实例定义。)