如何对函数体使用集合推导

How to use a set comprehension for the body of a function

假设我有以下签名:

sig A {}
sig B {}

sig P {
    a: A,
    b: B
}

我如何编写一个函数 f,例如 f returns P 的集合,每个成员的值都为 x: Aa 字段?

在计算器中输入表达式 {p: P | p.a = x} 返回一个集合,但是当我尝试以这种方式定义 f

fun f(a: A) : set P {
    { p: P | p.a = a }
}

alloy 告诉我我犯了一个错误:

A type error has occurred This cannot be a legal relational join where left hand side is p (type = {this/P}) right hand side is a (type = {this/A})

问题是您用函数参数隐藏了 a 关系。如果将 f(a: A) 替换为 f(a': A),它会起作用。或者,您可以使用 @ 运算符,它 returns 全局值而不是集合的局部值:

fun f(a: A) : set P {
    { p: P | p.@a = a }
}