簡體   English   中英

如何在Alloy中明確指定簽名?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM