我正在创建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
似乎比我所知道的更广泛。