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)