我有以下签名:
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)
现在我想我会使用某种集合理解,但问题是集合理解只适用于一元集,而不是二元集。
答案 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 }