如何实现相互依赖?

时间:2017-08-23 18:46:30

标签: alloy

我正在创建iCalendar数据格式的Alloy模型。

iCalendar文件包含一个或多个对象。每个对象都包含属性和组件。

sig iCalendarObject {
    obj_properties: set Property,
    components: set Component
}

每个对象可以选择具有方法属性。

sig iCalendarObject {
    obj_properties: set Property,
    components: set Component
} {
    lone prop: method | prop in obj_properties
}

每个组件都包含属性。

abstract sig Component {
    comp_properties: set Property
} 

vevent是一种组件。

sig vevent extends Component {}

vevent可以选择具有dtstart属性。

sig vevent extends Component {}
{
    lone prop: dtstart | prop in comp_properties 
}

如果一个对象没有方法属性(回想一下该方法是可选的),那么对象中的任何vevent组件必须具有dtstart属性。

因此,对象中的method属性与对象中vevent组件中的dtstart属性之间存在相互依赖关系。

sig iCalendarObject {
    obj_properties: set Property,
    components: set Component
} {
    lone prop: method | prop in obj_properties
    // VEVENT must have DTSTART if no METHOD in object
    no prop_method: method | prop_method in obj_properties =>
        all comp: components {
           comp in vevent
           one prop_dtstart: dtstart | 
              prop_dtstart in comp.comp_properties
       }
}

不幸的是,该模型并不能完成我想要它做的事情。

当Alloy Analyzer生成实例时,将忽略相关性。也就是说,实例显示了一个对象,该对象在对象中没有方法属性和vevent组件,但是vevent组件没有所需的dtstart属性。

这让我很难过。你能帮忙吗?

更新:我找到了解决方案。我只需要括号:

(no prop_method: method | prop_method in obj_properties) =>

通过这个小小的改变,现在的代码顺序就像预期的那样。

no似乎比我所知道的更广泛。

0 个答案:

没有答案