示例#1
0
    def construct(self):

        self.force_skipping()
        conversation = Conversation(self)
        conversation.add_bubble("A co sjednotit všechny ordinály?")
        self.revert_to_original_skipping_status()

        forti_pic = ImageMobject("BuraliForti1.jpg", use_cache = False)
        forti_pic.scale(0.43)
        forti_pic.to_corner(UP+LEFT)

        ordinal_class = OrdinalClass(color = BLUE).shift(UP)
        ordinal_class.next_to(forti_pic, coor_mask = X_MASK)
        num = 7
        subordinals = VGroup([ordinal_class.copy() for _ in range(num)])
        for subord, x in zip(subordinals, np.linspace(0.3, 1, num)):
            i = int(x*len(subord.line))
            subord.line.remove(*subord.line[i:])

        lines_dest = VGroup([subord.line for subord in subordinals]).copy()
        bars_dest = VGroup([subord.bars for subord in subordinals]).copy()
        subordinals.arrange_submobjects(UP, False, coor_mask = Y_MASK)
        subordinals.next_to(conversation.dialog, UP, coor_mask = Y_MASK)
        lines = VGroup([subord.line for subord in subordinals])
        bars = VGroup([subord.bars for subord in subordinals])

        self.wait_to(3)
        self.play(FadeIn(subordinals))
        self.wait_to(4.5)
        self.play(
            Transform(lines, lines_dest),
            Transform(bars, bars_dest),
        )
        self.remove(subordinals)
        self.add(ordinal_class)
        self.wait_to(6)
        conversation.add_bubble("Cesare Burali-Forti paradox")

        next_bar = ordinal_class.bars[0][0].copy().next_to(ordinal_class)
        next_bar.highlight(YELLOW)
        self.wait_to(9)
        self.play(ShowCreation(next_bar))

        brace = BraceText(VGroup(ordinal_class, next_bar), "Nový ordinál", UP)
        self.wait_to(15)
        self.play(brace.creation_anim())

        picture = VGroup(ordinal_class, brace, next_bar)
        picture.save_state()
        picture.next_to(forti_pic, coor_mask = X_MASK)

        self.wait_to(29)
        self.play(FadeIn(forti_pic))

        self.wait_to(49)
        self.play(*map(FadeOut, [
            picture,
            conversation.dialog,
            forti_pic,
        ]))
示例#2
0
    def construct(self):

        negatives = VGroup(*[self.number_tex(-n) for n in range(9)])
        positives = VGroup(*[self.number_tex(n) for n in range(9)])
        negatives.shift(UP)

        neg_brace = BraceDesc(negatives, "\\aleph_0", UP)
        pos_brace = BraceDesc(positives, "\\aleph_0", DOWN)

        self.play(ShowCreation(negatives))
        self.play(neg_brace.creation_anim())
        self.dither()

        self.play(ShowCreation(positives))
        self.play(pos_brace.creation_anim())
        self.dither()

        self.play(
            positives.shift,
            UP,
            pos_brace.shift,
            UP,
        )
        self.remove(positives[0])
        self.play(
            FadeOut(pos_brace),
            neg_brace.shift_brace,
            VGroup(negatives, negatives[-1].copy().move_to(positives[-1])),
        )
        self.dither()

        return
        conversation = Conversation(self)
        conversation.add_bubble("Hey, what happened to the merged zero?")
        self.dither()
        conversation.add_bubble("The size is still countable infinite.")
        self.dither()
示例#3
0
    def construct(self):

        self.h_space = 2
        self.colors = color_gradient(
            [YELLOW, GREEN, BLUE, DARK_BLUE, DARK_GRAY], 20)

        numbers = self.make_numbers()
        self.play(
            ShowCreation(numbers[0]),
            ShowCreation(numbers[1]),
        )
        brace = BraceDesc(numbers[0], "\\aleph_0", DOWN)
        brace.next_to(numbers[1], DOWN, coor_mask=Y_MASK, buff=0.3)
        self.play(brace.creation_anim())

        skip = False
        denominator = 2
        parts = []
        while True:
            parts.append(numbers[0].copy())
            self.add(parts[-1])
            self.play(VGroup(numbers, brace).shift, 0.9 * DOWN)
            self.remove(numbers)
            if denominator == 6: break
            numbers = self.make_numbers(denominator, numbers)
            ori_numbers = self.make_numbers(denominator - 1, numbers)
            if skip:
                offset = (len(ori_numbers[1]) // 2 + 1) % 2
                for label in ori_numbers[1][offset::2]:
                    label.set_fill(opacity=0)
            if denominator == 4: skip = True
            if skip:
                offset = (len(numbers[1]) // 2 + 1) % 2
                for label in numbers[1][offset::2]:
                    label.set_fill(opacity=0)

            self.play(ReplacementTransform(ori_numbers, numbers))
            denominator += 1

        self.dither()
        self.remove(brace, numbers)

        while denominator < len(self.colors) + 1:
            part = self.make_dots(denominator)
            part.move_to(parts[-1])
            part.shift(0.5 * DOWN)
            parts.append(part)
            denominator += 1

        parts.reverse()
        parts = VGroup(*parts)
        parts_dest = parts.copy()
        for part in parts_dest:
            part.center()
        self.play(Transform(parts, parts_dest), run_time=2)
        self.dither()

        rationals = TexMobject('|', "\\text{Rational Numbers}",
                               "| = \\aleph_0")
        rationals.shift(0.5 * DOWN - rationals[1].get_edge_center(UP))
        self.play(Write(rationals[1]))
        self.dither()

        dots7 = self.make_dots(7)
        dots7.shift(2 * DOWN)
        center = len(dots7) // 2
        pi_dot = dots7[center + 22]
        pi_label = TexMobject("\\frac{22}{7}")
        pi_label.next_to(pi_dot, DOWN)
        self.play(Write(pi_label))
        self.dither()
        self.play(ShowCreation(dots7))
        self.play(FocusOn2(pi_dot, scale=3))
        dots7.remove(pi_dot)
        self.play(FadeOut(dots7))
        self.play(VGroup(pi_dot, pi_label).shift, 2 * UP)
        self.dither()

        self.play(FadeOut(VGroup(pi_dot, pi_label)))
        self.play(Write(VGroup(rationals[0], rationals[2])))

        conversation1 = Conversation(self)
        conversation1.add_bubble("Are all sets countable?")
        self.dither()
        conversation2 = Conversation(self, start_answer=True)
        conversation2.add_bubble("Of course not.")
        self.dither()

        self.prepare_overall_picture()
        self.overall_picture.to_edge(UP, buff=0.4)
        self.overall_picture.remove(self.uncountable_brace)
        self.play(FadeIn(self.overall_picture))
        self.dither()
        self.play(self.uncountable_brace.creation_anim())
        self.dither()
        real_size = TexMobject("|\\mathbb R|")
        real_size.set_color(GREEN)
        real_size.next_to(self.sizes, buff=1)
        self.play(Write(real_size))
        self.dither()
示例#4
0
    def construct(self):

        # self.force_skipping()

        # left-closed, right-open, two intervals

        interval1 = SemiOpen()
        interval2 = interval1.copy()
        VGroup(interval1, interval2).arrange_submobjects(buff=1)
        self.play(
            FadeIn(interval1),
            FadeIn(interval2),
        )
        self.wait_to(11)

        self.play(
            interval1.move_to,
            LEFT,
            interval2.move_to,
            RIGHT,
        )
        self.remove(interval1.second_point)
        self.play(interval2.first_point.scale_in_place, 0)

        interval = SemiOpen(2 * LEFT, 2 * RIGHT)
        self.remove(interval1, interval2)
        self.add(interval)
        self.dither()
        interval_dest = SemiOpen(LEFT, RIGHT)
        self.play(Transform(interval, interval_dest))
        self.wait_to(22)
        self.play(FadeOut(interval))

        interval1 = SemiOpen()
        interval2 = interval1.copy()
        VGroup(interval1, interval2).arrange_submobjects(buff=1)
        for interval in [interval1, interval2]:
            interval.stretch_in_place(-1, 0)

        # left-open, right-closed, two intervals

        self.play(
            FadeIn(interval1),
            FadeIn(interval2),
        )

        self.play(
            interval2.move_to,
            RIGHT,
            interval1.move_to,
            LEFT,
        )
        self.remove(interval2.second_point)
        self.play(interval1.first_point.scale_in_place, 0)

        interval = SemiOpen(2 * RIGHT, 2 * LEFT)
        self.remove(interval1, interval2)
        self.add(interval)
        interval_dest = SemiOpen(RIGHT, LEFT)
        self.play(Transform(interval, interval_dest))
        self.wait_to(27.5)

        # left-open, right-closed, omega

        omega = OrdinalOmega()
        omega.highlight(DARK_GREY)
        interval_copies = []
        for bar in omega:
            interval_copy = SemiOpen(RIGHT * bar.x1,
                                     RIGHT * bar.x0,
                                     dot_radius=0.1 * bar.height)
            interval_copies.append(interval_copy)

        final_interval = SemiOpen(RIGHT * omega.x0, RIGHT * omega.x1)
        interval_copies.reverse()
        interval_copies = VGroup(interval_copies)
        VGroup(omega, interval_copies, final_interval).shift(UP)

        self.play(
            FadeIn(omega),
            interval.shift,
            0.8 * DOWN,
        )
        interval_copies_src = interval_copies.copy()
        for interval_copy in interval_copies_src:
            interval_copy.scale_in_place(0)
        self.play(ReplacementTransform(interval_copies_src, interval_copies))
        to_shrink = []
        for interval_copy in interval_copies:
            self.remove(interval_copy.second_point)
            to_shrink.append(interval_copy.first_point)

        self.add(interval_copies[-1].second_point)
        to_shrink = VGroup(to_shrink)
        to_shrink_ori = to_shrink.copy()
        shrinked = to_shrink.copy()
        for dot in shrinked:
            dot.scale_in_place(0)
        self.play(
            Transform(to_shrink, shrinked),
            UnapplyMethod(final_interval.second_point.scale_in_place, 0),
            run_time=0.5,
        )
        self.remove(interval_copies)
        self.add(final_interval.line, interval_copies[-1].second_point)
        self.add_foreground_mobjects(final_interval.second_point)

        self.wait_to(42)

        # left-closed, right-open, omega

        self.play(Rotate(interval, in_place=True))  # 43

        self.dither()  # 44

        self.play(
            Transform(to_shrink, to_shrink_ori),
            run_time=0.5,
        )  # 44.5

        interval_copies_dest = interval_copies.copy()
        bg, bg_dest, fg, fg_dest = [], [], [], []
        for interval_copy_dest in interval_copies_dest:
            interval_copy_dest.scale_in_place(-1)
            bg_dest += [
                interval_copy_dest.line, interval_copy_dest.second_point
            ]
            fg_dest.append(interval_copy_dest.first_point)
        for interval_copy in interval_copies:
            bg += [interval_copy.line, interval_copy.second_point]
            fg.append(interval_copy.first_point)

        bg, bg_dest, fg, fg_dest = map(VGroup, (bg, bg_dest, fg, fg_dest))

        self.remove(final_interval)
        self.add_foreground_mobjects(final_interval.second_point)
        self.play(
            Transform(bg, bg_dest, path_arc=np.pi),
            Transform(fg, fg_dest, path_arc=np.pi),
        )
        self.remove(bg)
        self.add(final_interval)

        shrinked = to_shrink.copy()
        for dot in shrinked:
            dot.scale_in_place(0)

        self.play(
            Transform(to_shrink, shrinked),
            run_time=0.5,
        )

        # left-closed, right-open, omega*2

        interval_template = interval  # some renaming
        interval = final_interval

        omega_cdot_2 = OrdinalFiniteProd(OrdinalOmega, 2)
        omega_cdot_2.set_color(DARK_GREY)

        intervals2 = [
            SemiOpen(RIGHT * ordinal.x0, RIGHT * ordinal.x1)
            for ordinal in omega_cdot_2[0], omega_cdot_2[1][0], omega_cdot_2[1]
            [1], omega_cdot_2
        ]
        intervals2.append(
            SemiOpen(RIGHT * omega_cdot_2.x0, RIGHT * omega_cdot_2[1][1].x1))
        VGroup(omega_cdot_2, intervals2).shift(UP)

        self.wait_to(50)
        self.play(
            ReplacementTransform(omega, omega_cdot_2[0]),
            Transform(interval, intervals2[0]),
        )
        self.revert_to_original_skipping_status()
        self.wait_to(52.5)

        self.remove_foreground_mobjects(interval.second_point)
        interval2_1_src = intervals2[1].copy()
        interval2_1_src.set_color(BLACK).shift(RIGHT)
        self.play(ShowCreation(omega_cdot_2[1][0]), Animation(interval),
                  ReplacementTransform(interval2_1_src, intervals2[1]))
        self.remove(interval.second_point)
        interval.line.scale_about_point(1.1,
                                        interval.line.get_edge_center(LEFT))
        self.play(intervals2[1].first_point.scale_in_place, 0, run_time=0.5)
        self.wait_to(54.5)

        interval2_2_src = intervals2[2].copy()
        interval2_2_src.set_color(BLACK).shift(RIGHT)
        self.play(ShowCreation(omega_cdot_2[1][1]), Animation(intervals2[1]),
                  ReplacementTransform(interval2_2_src, intervals2[2]))
        self.remove(interval, intervals2[1], intervals2[2])
        interval = intervals2[4]
        self.add(interval)
        self.play(intervals2[2].first_point.scale_in_place, 0, run_time=0.5)
        self.remove(intervals2[2].first_point)
        self.wait_to(56)

        self.play(
            FadeIn(VGroup(omega_cdot_2[1][2:]),
                   submobject_mode="lagged_start"),
            Transform(interval, intervals2[3]),
        )
        self.wait_to(60 + 7)

        conversation = Conversation(self)
        conversation.add_bubble(
            "Neměl by být výsledek delší než první činitel?")
        self.wait_to(60 + 20.5)
        conversation.add_bubble("Intervaly nejsou dobře uspořádané.")
        self.wait_to(60 + 49)

        self.play(FadeOut(VGroup(omega_cdot_2, interval, conversation.dialog)))
示例#5
0
    def construct(self, fast_play=False):
        #self.force_skipping()
        omega = OrdinalOmega()
        omega_plus_5 = OrdinalSum(OrdinalOmega, 0.75,
                                  lambda **kwargs: OrdinalFinite(5, **kwargs))
        omega_times_3 = OrdinalFiniteProd(OrdinalOmega, 3)
        omega_pow_3 = make_ordinal_power(3, q=(0.7, 0.84, 0.84))
        ordinals = VGroup(omega, omega_plus_5, omega_times_3, omega_pow_3)
        ordinals.stretch(0.4, 1)
        ordinals.arrange_submobjects(DOWN, aligned_edge=LEFT, center=False)
        ordinals.shift(-Y_MASK * ordinals.get_center())
        dots = TexMobject("\\vdots")
        dots.next_to(ordinals, DOWN)

        if fast_play:
            self.add(ordinals, dots)
        else:
            self.play(ShowCreation(omega))
            self.wait_to(6)
            self.play(ShowCreation(omega_plus_5))
            self.wait_to(7.3)
            self.play(ShowCreation(omega_times_3))
            self.wait_to(8.7)
            self.play(ShowCreation(omega_pow_3))
            self.play(FadeIn(dots))

        result = OrdinalFiniteProd(OrdinalOmega, 5, x1=8)
        result_stretched = result.copy()
        result_stretched.stretch(
            omega[0].get_height() / result_stretched[0][0].get_height(), 1)

        al_omega = result_stretched[0].copy()
        al_omega.shift(omega[0].get_center() - al_omega[0].get_center())

        al_omega_plus_5 = VGroup(result_stretched[0].copy())
        al_omega_plus_5.shift(omega_plus_5[0][0].get_center() -
                              al_omega_plus_5[0][0].get_center())
        al_five = omega_plus_5[1].copy()
        for bar, dest in zip(al_five, result[1]):
            bar.move_to(dest, coor_mask=X_MASK)
        al_omega_plus_5.add(al_five)

        al_omega_times_3 = VGroup(*result_stretched[:3]).copy()
        al_omega_times_3.shift(omega_times_3[0][0].get_center() -
                               al_omega_times_3[0][0].get_center())

        result_in_pow_3 = result_stretched.copy()
        result_in_pow_3.shift(omega_pow_3[0][0][0].get_center() -
                              result_in_pow_3[0][0].get_center())
        al_omega_pow_3 = omega_pow_3.copy()
        al_omega_pow_3.next_to(result_in_pow_3, buff=0)
        al_omega_pow_3[0].add_to_back(*result_in_pow_3.submobjects)

        al_ordinals = VGroup(al_omega, al_omega_plus_5, al_omega_times_3,
                             al_omega_pow_3)
        if not fast_play: self.wait_to(17.5)
        self.play(ReplacementTransform(ordinals, al_ordinals))

        al_ordinals.remove(al_omega_pow_3)
        al_ordinals.add(result_in_pow_3)
        result_bottom = result.copy()
        result_bottom.stretch(0, 1)
        result_bottom = VGroup(*[result_bottom.copy() for _ in range(5)])
        result_bottom.arrange_submobjects(DOWN, buff=0.3, center=False)
        result_bottom.to_edge(DOWN, buff=0)
        al_ordinals.add(result_bottom)

        mrg_omega = result[0].copy()
        mrg_omega_plus_5 = VGroup(result[0], VGroup(*result[1][:5])).copy()
        mrg_omega_times_3 = VGroup(*result[:3]).copy()
        mrg_ordinals = VGroup(
            mrg_omega,
            mrg_omega_plus_5,
            mrg_omega_times_3,
            result.copy(),
            VGroup(result.copy()),
        )
        if not fast_play: self.wait_to(19)
        self.play(
            FadeOut(dots),
            ReplacementTransform(al_ordinals, mrg_ordinals),
        )

        self.remove(mrg_ordinals)
        self.add(result)
        if fast_play: return result
        brace = BraceDesc(result, "\\omega_1", UP)
        self.wait_to(20.2)
        self.play(brace.creation_anim())
        self.wait_to(22)

        conversation = Conversation(self)
        conversation.add_bubble(
            "Ale podle kapitoly 5 si nemůžeme vzít všechny ordinály.")
        self.wait_to(29.5)
        conversation.add_bubble("To ne, ale všechny spočetné můžeme.")
        self.wait_to(39)

        self.add_foreground_mobjects(conversation.dialog)
        self.play(FadeOut(VGroup(brace, result)))

        omega = OrdinalOmega()
        omega.shift(2 * UP)
        self.play(ShowCreation(omega))
        self.wait_to(48.5)
        self.play(FadeOut(conversation.dialog))
示例#6
0
    def construct(self):

        conversation = Conversation(self, start_answer=True)

        conversation.add_bubble("Existuje množina všech množin?")
        conversation.add_bubble("Jasně, proč by neměla?")
        self.dither()
        conversation.add_bubble(
            "A co množina všech množin, které neobsahují samy sebe?")
        self.dither(2)
        conversation.add_bubble("Tak z té první některé vyhodíme.")
        self.dither()
        conversation.add_bubble("Obsahuje taková množina samu sebe?")
        conversation.add_bubble("Jejda...")
        self.wait_to(12.5)
示例#7
0
    def construct(self):

        num = 5
        ordinals_cnt_base = OrdinalFiniteProd(OrdinalOmega,
                                              num,
                                              x1=-4 + num * 2.5)

        ordinals_cnt = VGroup(
            [VGroup(ordinals_cnt_base[:i]).copy() for i in range(1, num + 1)])
        ordinals_cnt.save_state()
        ordinals_cnt.arrange_submobjects(DOWN, center=False, coor_mask=Y_MASK)
        ordinals_cnt.to_edge(UP)

        self.play(ShowCreation(ordinals_cnt))

        #self.wait_to(7)
        self.dither()
        self.play(ordinals_cnt.restore)

        self.remove(ordinals_cnt)
        self.add(ordinals_cnt_base)

        omega1 = Omega1()
        brace = BraceDesc(omega1, "\\omega_1", DOWN)

        omega1.line.save_state()
        omega1.line.behind_edge(RIGHT)

        omega1_bars_src = make_ordinal_power(2)
        omega1_bars_src.next_to(ordinals_cnt_base)
        omega1_bars_src.add_to_back(*ordinals_cnt_base)

        brace.desc.highlight(BLUE)
        brace.save_state()
        brace.shift_brace(omega1_bars_src)
        brace.highlight(BLACK)

        self.play(
            brace.restore,
            omega1.line.restore,
            ReplacementTransform(omega1_bars_src, omega1.bars),
        )

        #self.wait_to(11)
        self.dither()

        aleph1 = TexMobject("\\aleph_1", "=|", "\omega_1", "|")
        aleph1[2].highlight(BLUE)
        aleph1[0].highlight(RED)
        aleph1.shift(brace.desc.get_center() - aleph1[2].get_center())
        aleph1.remove(aleph1[2])

        self.play(Write(aleph1))
        #self.wait_to(15)
        self.dither()

        ordinals_a1 = VGroup([omega1.copy() for _ in range(num)])

        aleph1[0].save_state()
        aleph1[0].next_to(omega1, LEFT, coor_mask=X_MASK)
        self.play(
            omega1.to_edge,
            UP,
            FadeOut(VGroup(brace, aleph1[1:])),
            MoveFromSaved(aleph1[0]),
        )
        #self.wait_to(18.5)
        self.dither()
        aleph1 = aleph1[0]

        scale_center = np.array(ordinals_a1[0].line.get_start())
        for i, o in enumerate(ordinals_a1):
            o.line.scale(1 + i * 0.2, about_point=scale_center)

        ordinals_a1_lines_dest = VGroup([o.line for o in ordinals_a1]).copy()
        ordinals_a1_bars_dest = VGroup([o.bars for o in ordinals_a1]).copy()
        ordinals_a1.arrange_submobjects(DOWN, False, coor_mask=Y_MASK)
        ordinals_a1.to_edge(UP)
        ordinals_a1_lines = VGroup([o.line for o in ordinals_a1])
        ordinals_a1_bars = VGroup([o.bars for o in ordinals_a1])

        self.remove(omega1)
        self.add(ordinals_a1[0])
        self.play(FadeIn(VGroup(ordinals_a1[1:])))
        self.play(
            Transform(ordinals_a1_lines, ordinals_a1_lines_dest),
            Transform(ordinals_a1_bars, ordinals_a1_bars_dest),
        )
        self.remove(*ordinals_a1[:-1])
        omega2_src = ordinals_a1[-1]
        omega2 = LongOrdinal(ordinal_end=0.3, line_start=0.2)

        brace = BraceDesc(omega2, "\\omega_2", DOWN)
        brace.desc.highlight(BLUE)
        brace.save_state()
        brace.shift_brace(omega2_src)
        brace.highlight(BLACK)

        self.play(
            brace.restore,
            ReplacementTransform(omega2_src, omega2),
        )

        #self.wait_to(24.5)
        self.dither()

        aleph2 = TexMobject("\\aleph_2", "=|", "\omega_2", "|")
        aleph2[2].highlight(BLUE)
        aleph2[0].highlight(RED)
        aleph2.shift(brace.desc.get_center() - aleph2[2].get_center())
        aleph2.remove(aleph2[2])

        self.play(Write(aleph2))
        #self.wait_to(28)
        self.dither()

        ordinal_fin = OrdinalFinite(7, x1=SPACE_WIDTH + 1).highlight(BLUE)
        ord_labels = VGroup([
            TexMobject("\\omega_{}".format(i + 1)).highlight(BLUE).next_to(
                bar, UP) for i, bar in enumerate(ordinal_fin[:4])
        ])
        card_labels = VGroup([
            TexMobject("\\aleph_{}".format(i + 1)).highlight(RED).next_to(
                bar, DOWN) for i, bar in enumerate(ordinal_fin[:4])
        ])

        self.play(
            FadeOut(VGroup(aleph2[1:], brace, omega2)),
            ReplacementTransform(aleph1, card_labels[0]),
            ReplacementTransform(aleph2[0], card_labels[1]),
        )

        for i, t in enumerate((29, 31, 35.5, 38)):
            #self.wait_to(t)
            self.play(FadeIn(ord_labels[i]), ShowCreation(ordinal_fin[i]))
            if i >= 2: self.play(FadeIn(card_labels[i]))

        #self.wait_to(41)
        self.play(ShowCreation(VGroup(ordinal_fin[4:], rate_func=rush_into)))

        omega = OrdinalOmega().highlight(BLUE)
        omega_src = omega.copy()
        omega_src.next_to(ordinal_fin, buff=1)
        omega_src.add_to_back(*ordinal_fin)

        label1 = VGroup(ord_labels[0], card_labels[0])
        labels_to_fade = VGroup(list(zip(ord_labels[1:], card_labels[1:])))
        labels_to_fade.save_state()
        for l, bar in zip(labels_to_fade, omega[1:4]):
            l.move_to(bar, coor_mask=X_MASK)
            l.highlight(BLACK)

        limit_bar = omega[0].copy().next_to(omega)
        limit_lord = TexMobject("\\omega_\\omega").highlight(BLUE).next_to(
            limit_bar, UP)
        limit_lcard = TexMobject("\\aleph_\\omega").highlight(RED).next_to(
            limit_bar, DOWN)
        limit_g = VGroup(limit_bar, limit_lord, limit_lcard)

        limit_g.next_to(omega, coor_mask=X_MASK)
        limit_g.save_state()
        limit_g.next_to(omega_src, coor_mask=X_MASK)

        self.play(
            MoveFromSaved(labels_to_fade),
            ReplacementTransform(omega_src, omega),
            Animation(label1),
            limit_g.restore,
        )
        self.remove(labels_to_fade)
        #self.wait_to(52)

        plus1_bar = limit_bar.copy()
        plus1_label = TexMobject("\\omega_{\\omega+1}").highlight(
            BLUE).next_to(plus1_bar, UP)
        plus1_g = VGroup(plus1_bar, plus1_label)
        plus1_g.next_to(limit_g, coor_mask=X_MASK, buff=0.5)

        self.play(FadeIn(plus1_label), ShowCreation(plus1_bar))
        #self.wait_to(55)

        omega_pow = make_ordinal_power(2, q=(0.8, 0.9, 0.9)).highlight(BLUE)
        omega_pow_src = omega_pow.copy()
        omega_pow_src.behind_edge(RIGHT)
        omega_pow_src[0].add_to_back(limit_bar, plus1_bar)
        omega_pow_src.add_to_back(omega)

        limit_g.remove(limit_bar)
        limit_g.save_state()
        plus1_label.save_state()

        limit_g.move_to(omega_pow[1][0], coor_mask=X_MASK)
        plus1_label.move_to(omega_pow[1][1], coor_mask=X_MASK).highlight(BLACK)

        pow_bar = limit_bar.copy()
        pow_label = TexMobject("\\omega_{\\omega\\cdot\\omega}").highlight(
            BLUE).next_to(pow_bar, UP)
        pow_g = VGroup(pow_bar, pow_label)
        pow_g.next_to(omega_pow, coor_mask=X_MASK, buff=-.2)
        pow_g.save_state()
        pow_g.next_to(omega_pow_src, coor_mask=X_MASK)

        self.play(
            MoveFromSaved(plus1_label),
            ReplacementTransform(omega_pow_src, omega_pow),
            MoveFromSaved(limit_g),
            pow_g.restore,
        )
        self.remove(plus1_label)

        #self.wait_to(59)
        self.dither()

        labels_to_fade = VGroup(label1, limit_g, pow_label)
        labels_to_fade.save_state()
        labels_to_fade.highlight(BLACK)

        omega1 = Omega1(color=BLUE)
        omega1_bar = pow_bar.copy()
        omega1_label = TexMobject("\\omega_{\\omega_1}").highlight(
            BLUE).next_to(omega1_bar, UP)
        omega1_g = VGroup(omega1_bar, omega1_label)
        omega1_g.shift(omega1.line.get_end() - omega1_bar.get_center())
        omega1_g.add(omega1.line)
        omega1_g.save_state()
        omega1_g.behind_edge(RIGHT)

        limit_g.move_to(omega1.bars[1][0], coor_mask=X_MASK)
        pow_label.move_to(omega1.bars[-1], coor_mask=X_MASK)
        pow_bar.save_state()
        pow_bar.scale(0)
        pow_bar.set_stroke(width=0)
        pow_bar.move_to(omega1.bars[-1])

        self.play(
            MoveFromSaved(labels_to_fade, remover=True),
            omega1_g.restore,
            MoveFromSaved(pow_bar, remover=True),
            ReplacementTransform(omega_pow, omega1.bars),
        )
        #self.wait_to(60+7.5)
        self.dither()

        ordinal_fin = OrdinalFinite(6, x1=SPACE_WIDTH + 1).highlight(BLUE)
        omega1.save_state()
        omega1.stretch_about_point(0, 0, ordinal_fin[0].get_center())

        labels = VGroup([
            TexMobject((i + 1) * "\\omega_{" + "\\omega_1" +
                       (i + 1) * "}").next_to(bar, UP)
            for i, bar in enumerate(ordinal_fin[:3])
        ])
        labels.highlight(BLUE)

        next_bar = VGroup(labels[1], ordinal_fin[1])
        next_bar.save_state()
        next_bar.shift(8 * RIGHT)

        self.play(
            MoveFromSaved(omega1, remover=True),
            next_bar.restore,
            ReplacementTransform(omega1_label, labels[0]),
            ReplacementTransform(omega1_bar, ordinal_fin[0]),
        )
        #self.wait_to(60+11)
        self.play(FadeIn(labels[2]), ShowCreation(ordinal_fin[2]))
        #self.wait_to(60+13)
        self.play(ShowCreation(VGroup(ordinal_fin[3:]), rate_func=rush_into))
        #self.wait_to(60+21.5)
        self.dither(2)

        conversation = Conversation(self)
        conversation.add_bubble("What about the union of all the ordinals?")

        self.play(FadeOut(VGroup(labels, ordinal_fin)),
                  Animation(conversation.dialog))
示例#8
0
    def construct(self):

        conversation = Conversation(self, start_answer=True)

        conversation.add_bubble("Is there a set of all sets?")
        conversation.add_bubble("Sure, why shouldn't be?")
        self.dither()
        conversation.add_bubble(
            "What about the set of all sets not containing themselves?")
        self.dither()
        conversation.add_bubble(
            "Just discard some elements of the previous one?")
        self.dither()
        conversation.add_bubble("Does such a set contain itself?")
        conversation.add_bubble("Oops...")