我的模型中有一个Alloy函数,如:
fun whichFieldIs[p:Program, fId:FieldId, c:Class] : Field{
{f:Field | f in c.*(extend.(p.classDeclarations)).fields && f.id = fId}
}
此函数在我的模型中工作,可以返回一组元素,例如: {Field $ 0,Field $ 1} 虽然函数返回不是"设置字段"。我已经通过Alloy评估工具(合金4.2.jar)看到了这一点。我想要做的是在另一个谓词中获取此集合的第一个元素,例如:
pred expVarTypeIsOfA[p:Program, exprName:FieldId, mClass:Class, a:ClassId]{
let field = whichFieldIs[p, exprName, mClass],
fieldType = field[0].type
{
...
}
}
即使我将函数的返回值更改为"设置字段",错误"此表达式未能进行类型检查"出现。我只想获得函数返回的集合的第一个元素,任何帮助?
答案 0 :(得分:0)
在这种情况下,订单真的重要吗?如果是这样,您应该看一下:seq
在以下示例中,对于每个人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 ...
}
}