An EXCEPT construct updates a function / record at a fixed number of positions, so it is not suitable by itself to perform an update on a number of positions that is determined by a variable or parameter. Also, the deep nesting of records will make the notation a little heavy-handed. You could write the following inMemoryState' = LET hks(ims,m) == ims.hkState[m] \* retrieve the hkState component for a machine from an inMemoryState IN [p \in RMs |-> [inMemoryState[p] EXCEPT !.hkState = [m \in 1 .. MachinesInRing |-> [hks(@,m) EXCEPT !.state = "working"]]]] Alternatively, you can encapsulate the update in a suitable operator definition and use it in your action, such as SetToWorking(ims) == [ims EXCEPT !.hkState = [m \in 1 .. MachinesInRing |-> [@[m] EXCEPT !.state = "working"]]] \* within the action definition: ... /\ inMemoryState' = [p \in RMs |-> SetToWorking(inMemoryState[p])] ... Note that "@" in the definition of SetToWorking refers to ims.hkState. Hope this helps, Stephan
|