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

时间:2017-01-18 02:24:34

标签: function get return alloy

我的模型中有一个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 
    {
     ...
    }
}

即使我将函数的返回值更改为"设置字段",错误"此表达式未能进行类型检查"出现。我只想获得函数返回的集合的第一个元素,任何帮助?

1 个答案:

答案 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 ...
    }
}