Первый сгенерированный экземпляр уже показывает две проблемы с моей моделью:
Когда разрешение имеет отношение «к пользователю», должно быть и обратное отношение «по»;
Обычно плохой идеей является наличие двунаправленных связей в Alloy, поскольку их легко перемещать в обоих направлениях. Модели значительно проще, когда вы просто делаете их в наиболее удобном направлении. Вы всегда можете использовать функцию или макрос, чтобы пройти их назад. @wmeyer правильно показывает, как ограничить обратную ссылку, но ваша модель становится намного более сложной и, следовательно, более сложной для отладки.
Два разрешения для одного пользователя могут удалить его, что не имеет смысла , Всегда должно быть ноль или одно разрешение для конкретной операции для пользователя.
Почему это не имеет смысла? Подобные ограничения трудно применять и, насколько я понимаю, очень мало значат. Если вы получите роли в этой модели, я мог бы увидеть, что у вас может быть несколько идентичных разрешений для объекта. Ограничение модели может привести к тому, что у модели не будет решений. Даниэль Джексон также указывает, что лучший способ работать - это минимизировать ограничения.
Если вы по-прежнему хотите применять не повторяющиеся разрешения, я бы представил объект Role, который содержит разрешения.
I Я понимаю (я думаю), почему вы хотите, чтобы пользователь расширил объект, но это делает решения модели неудобными для просмотра. Здесь также может помочь роль.
Итак, моя модель 2cts будет иметь вид:
abstract sig Object {}
enum Operation { View, Update, Add, Delete }
sig Transaction extends Object {}
sig User extends Object {
role : set Role
}
sig Role {
permit : Operation lone -> Object
}
С решением:
┌─────────┬─────┐
│this/User│role │
├─────────┼─────┤
│User⁰ │Role²│
│ ├─────┤
│ │Role³│
├─────────┼─────┤
│User¹ │Role⁰│
│ ├─────┤
│ │Role¹│
│ ├─────┤
│ │Role³│
└─────────┴─────┘
┌─────────┬─────────────┐
│this/Role│permit │
├─────────┼───────┬─────┤
│Role⁰ │Delete⁰│User¹│
├─────────┼───────┼─────┤
│Role¹ │Update⁰│User⁰│
│ ├───────┼─────┤
│ │View⁰ │User¹│
├─────────┼────┬──┴─────┤
│Role² │Add⁰│User¹ │
├─────────┼────┴──┬─────┤
│Role³ │Add⁰ │User⁰│
│ ├───────┼─────┤
│ │Update⁰│User¹│
└─────────┴───────┴─────┘