簡體   English   中英

如何防止 Model 中的循環關系?

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

您還可以通過將PackagePackageManager之間的關系聲明為 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.

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