2017-01-18 4 views
0

Ich habe eine Legierung Funktion in meinem Modell wie:Wie kann auf die Elemente in der Menge zugegriffen werden, die von einer Legierungsfunktion zurückgegeben werden?

fun whichFieldIs[p:Program, fId:FieldId, c:Class] : Field{ 
    {f:Field | f in c.*(extend.(p.classDeclarations)).fields && f.id = fId}  
} 

Diese Funktion ist in meinem Modell arbeitet und eine Reihe von Elementen wie zurückgeben kann: return {Feld $ 0, Feld $ 1} obwohl die Funktion nicht "Feld setzen". Ich habe dies bereits durch das Legierungs-Evaluierungswerkzeug gesehen (erhältlich in alloy4.2.jar). Was ich versuche, das erste Element dieses Satzes in einem anderen Prädikat zu tun bekommt, zum Beispiel:

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

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

Selbst wenn ich die Rückkehr der Funktion ändern „gesetzt Feld“, „der Fehler Dieser Ausdruck fehlgeschlagen typechecked "erscheint. Ich möchte nur das erste Element einer Menge erhalten, die von einer Funktion zurückgegeben wird, irgendeine Hilfe?

Antwort

0

Ist die Reihenfolge in diesem Fall wirklich wichtig? Wenn ja, sollten Sie einen Blick auf diese: seq

Im folgenden Beispiel wird für jede Person p "p.books" ist eine Folge of Book:

sig Book { } 
    sig Person { 
     books: seq Book 
    } 

... Also, wenn s eine Folge des Buchs ist, dann ist das erste Element s [0] ...

seq ist jetzt ein reserviertes Wort, aber es ist nichts anderes als eine Beziehung Int -> Elem.


Wenn es spielt keine Rolle, könnten Sie eine angemessene quantifier verwenden, z.B .:

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

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