Я часто сталкиваюсь с чем-то вроде следующего:
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
, я легко запутаюсь в этом факте.
Такое ощущение, что мне нужно уметь анализировать типы, но я не знаю каких-либо возможностей для этого.
Есть предложения?