在Alloy中使用二元关系的集合理解

时间:2015-03-07 23:52:02

标签: alloy

我有以下签名:

sig Id, Grade {}

sig Foo {
    result : Id -> Grade
}

现在我想创建一个接收foo变量的函数并返回所有关联的Foo - >成绩关系:

fun results[ id : Id ]: Foo -> Grade {
    //return all Foo->Grade binary relationships such that "id -> grade" in Foo.result
}

所以如果"结果"关系是这样的:

(foo0, id0, grade0)
(foo0, id1, grade0)
(foo0, id2, grade1)
(foo1, id0, grade2)
(foo1, id3, grade3)
(foo2, id0, grade0)

我运行功能"结果[id0]"我会得到:

(foo0, grade0)
(foo1, grade2)
(foo2, grade0)

现在我想我会使用某种集合理解,但问题是集合理解只适用于一元集,而不是二元集。

1 个答案:

答案 0 :(得分:4)

  

现在我想我会使用某种集合理解,但问题是集合理解只适用于一元集,而不是二元集。

第一次正确(是的,使用集合理解),第二次不正确(设置理解与关系一起工作正常)。请参阅语言参考的B.8部分或软件抽象的3.5.5。

尝试这样的事情(未选中!):

fun results[ id : Id ]: Foo -> Grade {
/* return all Foo->Grade binary relationships
   such that "id -> grade" in Foo.result */
   { f : Foo, g : Grade 
     | f -> id -> g in result } 
   /* not Foo.result, that was a slip */
}

可能有一种聪明的方法来编写所需的集合而不需要理解,只需使用盒子连接和点连接,但是如果有的话,那么它就是在逃避我。我得到的最接近的是

{ f : Foo, g : Grade | f.result.g = id }