下界多重性some
和one
三元关系的语义很难掌握。根据Software Abstractions (Rev. ed.) pp.79-80,关系addr: Book -> (Name -> some Addr)
应该等同于all b: Book | b.addr in Name -> some Addr
(另见 p.97)。但是后一个公式究竟是什么意思呢?我的想象力在这里失败了。这就是为什么我在 Alloy Analyzer 4.1.0 中做了一些实验。该模型的含义:
sig Name, Addr {}
sig Book { addr: Name -> some Addr }
assert implication {
#Book = 0 or all n: Name | some b: Book, a: Addr | n in b.addr.a
}
check implication
成立(没有找到反例)。因此,如果有任何书籍,则每个名称都应至少在其中一本中注册。允许未记录的地址,并且没有书籍,未记录的名称突然似乎也被允许。
以下模型中的含义:
sig Name, Addr {}
sig Book { addr: Name some -> Addr }
assert implication {
#Book = 0 or all a: Addr | some b: Book | #b.addr.a > 0
}
check implication
再次持有。这是之前模型的镜像:禁止无证 Addrs,除非根本没有 Book。并且对于名称的文档没有任何限制。
两种模型都可以组合起来更简洁:
sig Name, Addr {}
sig Book { addr1: Name -> some Addr, addr2: Name some -> Addr }
assert implications {
some Book implies Name in Book.addr1.Addr and Addr in Book.addr2[Name]
}
check implications
因此,如果有任何 Book,所有Names 都应该参与关系 addr1,所有Addr 都应该参与 addr2。多重one
性行为相似。
就下界约束而言,似乎软件抽象和分析器并没有讲述关于R: A -> (B m -> n C)之类的构造的相同故事,但我可能遗漏了一些东西。我发现的含义不是我所期望的,并且可能还有其他我尚未发现的奇怪含义。我越来越觉得嵌套的下界多重性根本没有意义。我能说对吗?