簡體   English   中英

合金均等

[英]Equality in alloy

我有一個包含以下內容的Alloy模型:

abstract sig person{}

one sig john,Steve extends person  {Gender: man} 

sig man{}

fact {
  all name: person, Gender: man | 
      name.Gender = name.Gender => person =person}

如何使兩個簽名相等?

從您的問題中尚不清楚您要做什么,並且從您的示例Alloy代碼來看,您似乎似乎正遭受一些困惑。

首先,您顯示的模型以兩種不同的方式使用名稱Gender,這本身不是非法的,但似乎暗示了一些混淆。 (這肯定會使讀者迷惑不解。)

在兩個單例簽名john和Steve的聲明中,性別表示兩個二進制關系,一個在簽名john和簽名的man之間持有,另一個在Steve和man之間持有。 用符號形式說同樣的事情,性別代表(a)john-> man的一些子集,和(b)Steve-> man的一些子集。

但是,在匿名事實中,性別表示類型為man的變量。

如果您找到一種方法來重命名它們中的一個,則模型將更容易理解。 由於量化表達式中的變量名稱是任意的,因此,如果將其重新格式化為

fact { all P : person, M : man | P.M = P.M => person = person }

如果這不是您要說的話,那么您可能想說些類似的話

fact { all P : person, M : man | 
    P.Gender = P.Gender => person = person 
}

重命名變量將迫使您選擇一種含義或另一種含義。 這是一件好事。 (一個不幸的事實是,Alloy的配方都不令人滿意。但是讓我們一次處理一個問題;擺脫雙重使用Gender是第一步。)

第二個問題是無論您要表達的事實是什么,幾乎可以肯定它並不意味着您要表達的意思。 暫時忽略模型的細節,您的事實采用以下形式

fact { all V1 : sig1, V2 : sig2 | 
  Expression = Expression => sig1 = sig1
}

對於模型中定義的某些Relation,其中Expression為V1.V2或V1.Relation。 這里有幾處錯誤:

  • V1.V2是無意義的,其中V1和V2都是簽名的名稱或在給定簽名范圍內的變量:點運算符僅在其參數之一是關系的名稱時才有意義。

  • 如果任何表達式E都是有意義的,則無論E意味着什么,形式為E = E的布爾表達式(例如person.Gender = person.Gender)都是正確的。 用E表示的任何事物自然都將等於其自身。 所以有條件的話也可以寫成

     1 = 1 => person = person 
  • 出於相同的原因,無論模型如何,person = person始終為真:對於任何模型實例,實例中的人員集合將與實例中的人員集合相同。 因此,條件將始終為真,並且事實實際上不會對模型實例施加任何約束。

目前尚不清楚如何最好地幫助您前進。 也許一種開始的方法是問自己要嘗試在模型中捕獲以下哪些語句。

  • 有一組人。
  • 有些人是男性(性別=“男人”)。 其他不是男性。
  • 約翰是男性。
  • 史蒂夫是男性。
  • 約翰和史蒂夫是不同的人。
  • 如果x和y是具有相同性別的個體,則x和y是相同的個體。 即沒有兩個人具有相同的性別。

請注意,這些語句不能同時全部成立。 (如果不是很明顯,那么您可能比嘗試找出原因做得更糟。Alloy在此方面可能會有所幫助。)

祝好運。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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