sig ItemId, Name{} sig Inventory { itemDB: ItemId lone -> lone Item } sig Item { name : Name, count: Int } pred init[its: Inventory] { no its.itemDB } pred itemRegistration[its, its': Inventory, itemId: ItemId, quantity: Int, n: Name] { some it: Item | { no itemId2: ItemId | its.itemDB[itemId2] = it its'.itemDB = its.itemDB + itemId -> it it.name = n it.count = quantity } } pred receivingOrShipping[its, its': Inventory, itemId: ItemId, quantity: Int] { some it': Item | { no itemId2: ItemId | its.itemDB[itemId2] = it' its'.itemDB = its.itemDB ++ itemId -> it' it'.name = its.itemDB[itemId].name it'.count = plus[its.itemDB[itemId].count, quantity] } } pred execute[] { some disj its, its', its'': Inventory, itemId: ItemId, n: Name | { init[its] itemRegistration[its, its', itemId, 100, n] receivingOrShipping[its', its'', itemId, -50] } } run execute for 2 but 3 Inventory, 8 Int