Семантику нижних множеств some
и one
в троичных отношениях трудно понять. Согласно Software Abstractions (Rev. ed.), стр. 79–80, отношение addr: Book -> (Name -> some Addr)
должно быть эквивалентно all b: Book | b.addr in Name -> some Addr
(см. также стр. 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
Таким образом, если есть какая-либо Книга, все Имена должны участвовать в отношении addr1, а все Адреса должны участвовать в отношении addr2. Множественность one
ведет себя одинаково.
Кажется, что Software Abstractions и Analyzer не рассказывают одну и ту же историю о таких конструкциях, как R: A -> (B m -> n em> C) в отношении ограничений нижней границы, но я мог что-то упустить. Обнаруженные мной следствия оказались не такими, как я ожидал, и могут быть и другие странные следствия, которые я еще не обнаружил. Я все больше и больше чувствую, что вложенные множественности с нижней границей вообще не имеют смысла. Могу ли я быть прав в этом?