[英]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始終為真:對於任何模型實例,實例中的人員集合將與實例中的人員集合相同。 因此,條件將始終為真,並且事實實際上不會對模型實例施加任何約束。
目前尚不清楚如何最好地幫助您前進。 也許一種開始的方法是問自己要嘗試在模型中捕獲以下哪些語句。
請注意,這些語句不能同時全部成立。 (如果不是很明顯,那么您可能比嘗試找出原因做得更糟。Alloy在此方面可能會有所幫助。)
祝好運。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.