Function 如何访问Alloy函数返回的集合中的元素?

Function 如何访问Alloy函数返回的集合中的元素?,function,get,return,alloy,Function,Get,Return,Alloy,我的模型中有一个合金功能,如: fun whichFieldIs[p:Program, fId:FieldId, c:Class] : Field{ {f:Field | f in c.*(extend.(p.classDeclarations)).fields && f.id = fId} } 此函数在我的模型中工作,可以返回一组元素,例如: {字段$0,字段$1} 虽然函数返回不是“设置字段”。我已经通过Alloy evaluator工具(alloy4.2

我的模型中有一个合金功能,如:

fun whichFieldIs[p:Program, fId:FieldId, c:Class] : Field{
     {f:Field | f in c.*(extend.(p.classDeclarations)).fields && f.id = fId}    
}
此函数在我的模型中工作,可以返回一组元素,例如: {字段$0,字段$1} 虽然函数返回不是“设置字段”。我已经通过Alloy evaluator工具(alloy4.2.jar中提供)看到了这一点。我要做的是在另一个谓词中获取该集合的第一个元素,例如:

pred expVarTypeIsOfA[p:Program, exprName:FieldId, mClass:Class, a:ClassId]{

    let field = whichFieldIs[p, exprName, mClass],
         fieldType = field[0].type 
    {
     ...
    }
}

即使我将函数的返回更改为“set Field”,也会出现错误“This expression failed to typecheck”。我只想获取函数返回的集合的第一个元素,有什么帮助吗?

在这种情况下顺序真的重要吗?如果是这样的话,你应该看看这个:

在下面的示例中,对于每个人p,“p.books”是一个序列 图书目录:

sig Book { }
  sig Person {
      books: seq Book
  }
…因此,如果s是Book的序列,那么第一个元素是s[0]

seq
现在是一个保留字,但只不过是一个关系
Int->Elem


如果不重要,您可以使用适当的量词,例如:

pred expVarTypeIsOfA[p:Program, exprName:FieldId, mClass:Class, a:ClassId]{

    some field: whichFieldIs[p, exprName, mClass] | {
         field.type ...
    }
}

如何向seq添加元素。对我来说,s.add[bk]不起作用(这里是bk:Book)