我发现自己经常遇到以下情况:
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
值,但决不允许Hardware
和Software
实例具有共同的属性。
我真的不想那样写fact
。如果添加第四种Unit
,我很容易弄乱事实。
感觉我需要能够对类型进行自省,但是我不知道有什么设施可以做到这一点。
有什么建议吗?
答案 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
}