Рассуждение о свойствах подтипов - PullRequest
1 голос
/ 17 апреля 2019

Я часто сталкиваюсь с чем-то вроде следующего:

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, я легко запутаюсь в этом факте.

Такое ощущение, что мне нужно уметь анализировать типы, но я не знаю каких-либо возможностей для этого.

Есть предложения?

1 Ответ

0 голосов
/ 18 апреля 2019

Возможно, это не самое элегантное решение, но вы можете определить подтип свойства для каждого подтипа модуля.

Таким образом, вам не нужно будет вручную писать кросс-продукт, делая его менее ошибочным.склонный: -).

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
}
...