[英]How to specify signature expressly in Alloy?
我正在學習合金建模語言,我看到了這段代碼。
sig Person {
partner: Person
}
fact partnerProperties {
partner = ~partner
no p: Person | p in p.partner
}
此代碼表示“人的partner
關系是相互的”。
上面的代碼我可以理解,但我認為如何表達partner
是在Person
明確寫出的關系。 因為可讀性。
我想寫成這樣。
fact partnerProperties {
Person.partner = ~Person.partner
no p: Person | p in p.partner
}
我畢業來幫助我。
你可以寫一個量化如下:
sig Person {
partner: Person
}
fact partnerProperties {
all p1,p2:Person| p1.partner=p2 implies p2.partner=p1
no p: Person | p in p.partner
}
run{}
請注意,在這種情況下,每個人只能有一個合作伙伴。 這個模型允許多元化:
sig Person {
partner: some Person
}
fact partnerProperties {
all p1,p2:Person| p2 in p1.partner implies p1 in p2.partner
no p: Person | p in p.partner
}
run{} for 5
您可以通過將其作為事實添加到 Person 使其更加簡潔
sig Person { partner : Person } {
this not in partner
this in partner.@partner
}
添加到一個事實sig
將做自動定量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⁰│
└───────────┴───────┘
請注意, Person.partner
並不代表您認為的含義。 它是集合 Person 和關系伙伴的連接。 要指定屬於簽名 Person 的關系合作伙伴,您可以編寫Person <: partner
,但這不是必要的,因為 Alloy 會推斷它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.