关于子类型的属性的推理

时间:2019-04-17 15:32:51

标签: alloy

我发现自己经常遇到以下情况:

sig Property {}

abstract sig Unit {
  property: some Property
}


sig Hardware, Software, Services extends Unit {}

fact  {
  no Hardware.property & Software.property
  no Hardware.property & Services.property
  no Software.property & Services.property
}

也就是说,我有一个声明属性的抽象签名,以及一些扩展该签名的子类型。我想确保子类型之间的属性property中没有重叠。

将允许两个Hardware实例共享property值,但决不允许HardwareSoftware实例具有共同的属性。

我真的不想那样写fact。如果添加第四种Unit,我很容易弄乱事实。

感觉我需要能够对类型进行自省,但是我不知道有什么设施可以做到这一点。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

这可能不是最优雅的解决方案,但是您可以为每个单元子类型定义一个属性子类型。

这样,您将无需手动编写叉积,从而减少了出错的可能性:-)。

abstract sig Property {}

abstract sig Unit {
  property: some Property
}

sig Hardware, Software, Services extends Unit {}
sig PropHard , PropSoft, PropServ extends Property{}

fact {
    Hardware.property in PropHard
    Software.property in PropSoft
    Services.property in PropServ
}