def iterate_partition(pi, f): pi_prime = [] for part in pi: d = {part: set() for part in pi} for elem in part: b = f(elem) for part in pi: if b in part: d[part].add(elem) break for v in d.values(): if v: pi_prime.append(frozenset(v)) return pi_prime, pi != pi_prime def print_partition(pi): print(list(map(set, pi))) def main(): n = 20 b1 = frozenset(range(1, n)) b2 = frozenset([20]) pi = [b1, b2] f = lambda x: x + 1 if x < n else x print_partition(pi) while True: pi, changed = iterate_partition(pi, f) if not changed: break print_partition(pi) if __name__ == "__main__": main()