sig AccountId, Name, Tweet { } sig Accounts { accountDB: AccountId lone -> lone Account } sig Account { name: Name, tweets: List } sig List { size: Int, element: Int -> lone Tweet } pred init[acs: Accounts] { no acs.accountDB } pred signUp[acs, acs': Accounts, id: AccountId, n: Name] { some ac': Account | acs.accountDB[id] = ac' implies { all id': AccountId | acs'.accountDB[id'] = acs.accountDB[id'] } else { some ac: Account | { no id2: AccountId | acs.accountDB[id2] = ac acs'.accountDB = acs.accountDB + id -> ac ac.name = n ac.tweets.size = 0 no ac.tweets.element } } } pred tweet[acs, acs': Accounts, id: AccountId, contents: Tweet] { some ac': Account | { no id2: AccountId | acs.accountDB[id2] = ac' acs'.accountDB = acs.accountDB ++ id -> ac' ac'.name = acs.accountDB[id].name ac'.tweets != acs.accountDB[id].tweets ac'.tweets.size = plus[acs.accountDB[id].tweets.size, 1] ac'.tweets.element[minus[ac'.tweets.size, 1]] = contents all n: Int | n != minus[ac'.tweets.size, 1] implies ac'.tweets.element[n] = acs.accountDB[id].tweets.element[n] } } pred execute[] { some disj acs, acs', acs'', acs''': Accounts, id: AccountId, disj n, n': Name, contents: Tweet | { init[acs] signUp[acs, acs', id, n] signUp[acs', acs'', id, n'] tweet[acs'', acs''', id, contents] } } run execute for 2 but 4 Accounts