Вы делаете его более кратким, добавляя его в качестве факта в Person
sig Person { partner : Person } {
this not in partner
this in partner.@partner
}
Факт, добавленный к sig
, сделает автоматическое c количественное определение с this
по всем атомам из sig
. Все поля, которые являются частью sig
, будут расширены с this.
перед ними. Это объясняет использование знака @
. Без знака @
расширение будет выглядеть следующим образом:
sig Person { partner : Person } {
this not in this.partner
this in this.partner.this.partner
}
this.
подходит для первого partner
, но для второго partner
соединение должно быть с результатом (this.partner)
а не this
. Знак @
перед вторым partner
говорит Alloy не ставить this
перед ссылкой. Расширение тогда:
sig Person { partner : Person } {
this not in this.partner
this in this.partner.partner
}
Это решение:
┌───────────┬───────┐
│this/Person│partner│
├───────────┼───────┤
│Person⁰ │Person³│
├───────────┼───────┤
│Person¹ │Person²│
├───────────┼───────┤
│Person² │Person¹│
├───────────┼───────┤
│Person³ │Person⁰│
└───────────┴───────┘