[英]How To Prevent Circular Relationships In Model?
我正在使用合金 6,我正在嘗試 model 系統為各種 package 管理器創建包。 例如,系統可能會為 ChocolateyNuget 和 Flatpak(包管理器)創建一個 Rebar3(包)。 如果還有其他需要安裝的軟件包(例如 Erlang),那將是一個依賴項。
這是迄今為止我想出的 model:
module assembler3
some sig Package{
dependencies: this -> some Package
}
{
// Package cannot be its own dependency
no p:Package | p in p.^(dependencies)
}
some sig PackageManager{
packages: set Package
}
fact "A package cannot belong to more than one package manager" {
//A package can only belong to one package manager
all p: Package |
one pm: PackageManager |
p in pm.packages
}
這是潛在的情況之一:
正如您從潛在實例中看到的那樣,我的 model 現在站着,我可以讓 Package1 依賴於 Package2,而 Package2 依賴於 Package1。 我想防止這種循環關系,但我不太清楚如何表達約束。 有人可以建議我如何找到正確的約束來防止 package 依賴項之間的循環關系嗎?
我認為dependencies
關系沒有很好地定義,它不需要this ->
。 字段是父(包)和字段之間的關系。 所以應該是:
dependencies : set Package
你的約束也不同:
this not in this.^@dependencies
需要@
以防止將關聯規則的自動this
連接應用於 sig。
您還可以通過將Package
和PackageManager
之間的關系聲明為 Package 中的必填字段來降低 model 的復雜性。 那么你不需要一個事實來強制執行這一點,恕我直言總是更好。
module assembler3
some sig PackageManager{}
some sig Package{
manager : PackageManager,
dependencies: set Package
} {
this not in this.^@dependencies
}
進一步的簡化是沒有 Package 管理器。 對於依賴問題,實際的 package 管理器往往是 package 的屬性,而不是關系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.