def setter_postconditions( self, message: Message, field: Field, field_type: Type ) -> Sequence[Expr]: return [ *[ Call("Invalid", [Name("Ctx"), Name(p.affixed_name)]) for p in message.successors(field) if p != FINAL ], *self.common.valid_path_to_next_field_condition(message, field, field_type), *[ Equal(e, Old(e)) for e in [ Selected("Ctx", "Buffer_First"), Selected("Ctx", "Buffer_Last"), Selected("Ctx", "First"), Call("Predecessor", [Name("Ctx"), Name(field.affixed_name)]), Call("Valid_Next", [Name("Ctx"), Name(field.affixed_name)]), ] + [ Call(f"Get_{p.name}", [Name("Ctx")]) for p in message.definite_predecessors(field) if isinstance(message.types[p], Scalar) ] ], ]
def context_cursor_unchanged( message: model.Message, field: model.Field, predecessors: bool ) -> List[Expr]: lower: model.Field upper: model.Field if predecessors: if len(message.predecessors(field)) == 0: return [] lower = message.fields[0] upper = message.fields[message.fields.index(field) - 1] else: if len(message.successors(field)) == 0: return [] lower = message.fields[message.fields.index(field) + 1] upper = message.fields[-1] return [ ForAllIn( "F", ValueRange( lower=Variable(lower.affixed_name), upper=Variable(upper.affixed_name), type_identifier=ID("Field"), ), Equal( Call( "Context_Cursors_Index", [ Call( "Context_Cursors", [Variable("Ctx")], ), Variable("F"), ], ), Call( "Context_Cursors_Index", [ Old( Call( "Context_Cursors", [Variable("Ctx")], ) ), Variable("F"), ], ), ), ) ]