CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In

Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place.

| Download

Try doing some basic maths questions in the Lean Theorem Prover. Functions, real numbers, equivalence relations and groups. Click on README.md and then on "Open in CoCalc with one click".

Project: Xena
Views: 18536
License: APACHE
oleanfile3.4.2, commit cbd2b6686ddb��3cinitdatanatsqrtdatanatgcddatalistbasicdatalistpermalgebragroup_powertacticwlog�;�export_decloptionnonenonesomesomeexport_declboolffffttttexport_declhas_andthenandthenandthenexport_declhas_powpowpowexport_declhas_appendappendappendexport_decldecidableis_trueis_trueis_falseis_falseto_boolto_boolexport_declhas_purepurepureexport_declhas_bindbindbindexport_declhas_monad_lift_tmonad_lift!monad_liftexport_declmonad_functor_tmonad_map$monad_mapexport_declmonad_runrun'runexport_decllistmmap*mmapmmap'*mmap'mfilter*mfiltermfoldl*mfoldlexport_declnativenat_map3rb_mapmkexport_declname_mapnativerb_mapmkexport_declexpr_mapnativerb_mapmkexport_decltacticinteraction_monadfailedfailexport_decltactic_resultinteraction_monadresultexport_decltacticFtransparencyreducibleGreduciblesemireducibleGsemireducibleexport_decltacticmk_simp_attrLmk_simp_attrexport_declmonad_exceptthrowOthrowcatchOcatchexport_declmonad_except_adapteradapt_exceptTadapt_exceptexport_declmonad_state_adapteradapt_stateWadapt_stateexport_declmonad_readerreadZreadexport_declmonad_reader_adapteradapt_reader]adapt_readerexport_declis_lawful_functormap_const_eq`map_const_eqid_map`id_mapcomp_map`comp_mapexport_declis_lawful_applicativeseq_left_eqgseq_left_eqseq_right_eqgseq_right_eqpure_seq_eq_mapgpure_seq_eq_mapmap_puregmap_pureseq_puregseq_pureseq_assocgseq_assocexport_declis_lawful_monadbind_pure_comp_eq_maptbind_pure_comp_eq_mapbind_map_eq_seqtbind_map_eq_seqpure_bindtpure_bindbind_assoctbind_assocexport_decltraversabletraverse}traversedeclnatprimepnat�andhas_lelenathas_lebit0nathas_addhas_oneonenathas_onemHhas_dvddvdcomm_semiring_has_dvdnatcomm_semiringoreq"�PInfo�$VMR�VMC��doc�`prime p` means that `p` is a prime number, that is, a natural number
 at least 2 whose only divisors are `p` and `1`.decl�equations_eqn_1� �*�eqrefl.�PInfo�$ATTR_refl_lemma���EqnL�SEqnL�decl�primetwo_lepa.�andleft)�PInfo�&nspace�decl�primeone_ltp�.has_ltlt�has_lt��primetwo_le�PInfo�(decl�primene_onephp.ne��.nesymmne_of_ltpartial_orderto_preorderordered_comm_monoidto_partial_orderordered_cancel_comm_monoidto_ordered_comm_monoidordered_semiringto_ordered_cancel_comm_monoid�ordered_semiring�primeone_lt�PInfo�*decl�prime_def_ltpiff.mH@�%!%�and_congr_right)up2forall_congr��%$"��m%�o�rm�intro��h�l@�d%�resolve_right!��%a��h�d�orimp_left>preorderto_has_lt`%�rq�l��decidablelt_or_eq_of_le_ab�decidable_le%��le_of_dvd%��le_of_succ_le�succhas_zerozeronathas_zero���PInfo�-decl�prime_def_lt'plm���%not����trans.v��prime_def_ltzu�p2~�������m���h�m26l@%�d��not_lt_of_ge`�%eqsubst_x���symm��of_as_true��decidable_lttrivialh�l�d�natcases_on�����������!�����zero�@�+��+���/��1���mul_zero_classto_has_zerosemiringto_mul_zero_classcomm_semiringto_semiring!�+forall_prop_decidable�?��?�A��>h�?�decidable_eq�+�eqmp� �?eqrec� _a,	3�R�>eq_zero_of_zero_dvd� ������@����%� ��r��u�����o��q��t��z��|!�������+�@��
����y������2��m����n�@��p�y���s�{�������elim���
!��%�������%%�PInfo�3decl�prime_def_le_sqrtplm���sqrt%�������prime_def_lt'z���p2����
��������a��mm2l������%lt_of_le_of_lt`%�����sqrt_lt_self��a��
thismk����A%I�.has_mulmul�has_mul�%
mm2l��_x��._a��Existsdcases_onc!�X��to_has_mul�<��"�� falsewh�id_rhs_x_1preorderto_has_leUlinear_orderto_partial_order�linear_order�.�+�.�le_total�'�.ordcases_on�-�0�2�7mk�-� �%�.km�0� %�lt_of_mul_lt_mul_rightdecidable_linear_ordered_semiringto_linear_ordered_semiring�decidable_linear_ordered_semiring%�eqmpr>�Uordered_cancel_comm_monoidto_partial_order[linear_ordered_semiringto_ordered_semiring�N���8�to_semiring�X��c%��]��hid,�i�l�V�semigroupto_has_mulmonoidto_semigroup�monoid
�Dto_has_one�v�_a,�]�d� �c�� �]��3�i�one_mul�v��S�l�k�y�n,�l���V��scomm_semigroupto_semigroup�comm_semigroup%�_a,�]� ����3�l�y��y���Q!�y��%�����V���%_a,!�{�� ���3����mul_comm���%��zero_le���AnnotcheckpointAnnothavemkmk��m1�e!�.����mpr���������le_sqrt���_x�����������mul_le_mul_left���%�#intro�%!� ���PInfo�=decl�decidable_prime_1pdecidable.�^decidable_of_iff'.���anddecidable��natdecidable_lo_hi��anotdecidable�decidable_dvd�PInfo�]TVMR�]_lambda_1VMR�]VMC�iT�e_fresh5����h	VMC�]T�^natdecidable_lt	�i�d	decidable_of_decidable_of_iffdoc�]This instance is slower than the instance `decidable_prime` defined below,
but has the advantage that it works in the kernel.

If you need to prove that a particular number is prime, in any case
you should not use `dec_trivial`, but rather `by norm_num`, which is
much faster.decl�]equations_eqn_1�^ �'�]�A�^2�'�E�PInfo�rTATTR����rEqnL�rSEqnL�]decl�primene_zeronh.J��u�v.hn"�
h2�-�
�_x.��%Annot�QAnnot�R��Q�8�P�D���PInfo�tXdecl�primeposppp.@��|�}.�lt_of_succ_lt�f�PInfo�{]decl�not_prime_zero�Q�a�PInfo�`decl�not_prime_one�-��q�8�p�D��PInfo��bdecl�prime_two-��x�D��PInfo��ddecl�prime_three-bit1
����D����PInfo��fdecl�primepred_posppp.�f�pred����.����@��lt_pred_iff�f�PInfo��hdecl�succ_pred_primeppp.!�������.�succ_pred_eq_of_pos�primepos�PInfo��kdecl�dvd_primepmpp-kp'���������p'dp�right����$"�%h'�elimrq��er�_x����one_dvd�e���������dvd_refl��PInfo��ndecl�dvd_prime_two_lepmpp��H6k�������������6��r�����dvd_prime�%or_iff_right_of_impr����r��ne_of_gt`%�PInfo��qdecl�primenot_dvd_oneppp.�o����.a��"�not_le_of_gt`%d%��gt?�����PInfo��tdecl�not_prime_mulaba1Bb1B�-�������B��Bh�"a���natmul_lt_mul_of_pos_left���k�%�S!�(�!���n,�5�8a��e_1"��e_2�=congr!��7%congr_arg���!��(�mul_one�v�������mp���8�dvd_prime_two_le��%dvd_mul_right���PInfo��wprvmin_fac_lemma_private����min_fac_lemmadecl��nkh���@has_subsub�has_sub����has_addadd
���������}����@����natsub_lt_sub_right_iff���������%��%le_of_not_gt�'��%natlt_add_of_pos_right��������PInfo��|decl�min_fac_aux_aux_meta_1well_founded_tactics��mk_xexprbooltt_xlist��has_bindsequnit��tacticmonadto_has_bind��interaction_monadmonadtactic_statetacticsave_infoposmk������������step����interactiveexact
Quote
_�_�measure_wf�����k���
��Annotfrozen_name
��Annot��sqrt�����n�����
Prenum2Annotanonymous_constructorwell_founded_tacticsdefault_dec_tac�PInfo�ρVMR��_lambda_1VMR��_lambda_2VMR��_lambda_3VMR��VMC���αVMC���s��t₂t₁βα��	VMC�������������tacticinteractiveexactFstep�
Fsave_info����has_bindseqVMC�����well_founded_tacticsdefault_dec_tacdecl�min_fac_aux_main_meta_auxn����*dite�|��{h�|%��}itep�:%
���

�RecFn����%Annot�QAnnot�R��%�PInfo��VMR�VMC����natmul�o	�h	
natadd�declmin_fac_aux_main_pack_wf_rec_mk_dec_tactic_aux_1�k�@���������%has_well_foundedrhas_well_foundedmkmeasure�����������8������-�n�C�n�9�A�S@���A�����n,�M��chas_lt����e_2�=����e_3�=�@>�.��U�%�K�U�?�K��eqtrans�������@���l�o���succ_sub_succ_eq_sub�l�o�w�����������PInfo��decl�
_pack�_x�*��*well_foundedfix���/�1�3�����<��has_well_foundedwf��_x�_F_y��/�1�3���������<���0���@������������������:%�%
�@����%��%
%������Annot�QAnnot�R��%�PInfo�)�VMR�)_lambda_1VMR�)_lambda_2VMR�)VMC�2�a�4VMC�3��0�/�j_fresh)�����o	�h	
�VMC�)	��*��3�2well_foundedfixdecl�)equations_eqn_1�� ���)��|���<
����Annot�Q��well_foundedfix_eq���������PInfo�;�EqnL�;decl�
������PInfo�
�VMR�
VMC�
�����o	�h	
��decl�
equations_eqn_1��!�
����
����Annot�Q���;�PInfo�?�decl�min_fac_aux�����PInfo�@�VMR�@VMC�@���
decl�@equations_eqn_1��!�@����
���Annot�Q��
equations_eqn_1�PInfo�B�EqnL�Bdecl�min_fac_main�������� �����:������PInfo�F�VMR�FVMC�F���h	��)decl�Fequations_eqn_1!�F���id_delta�7�PInfo�H�ATTR����HEqnL�Hdecl�Fequations_eqn_2!�6���;�>�PInfo�K�ATTR����KEqnL�Kdecl�Fequations_eqn_3n!�6���/�N���;�C�PInfo�M�ATTR����MEqnL�Mdecl�min_fac���6�PInfo�O�VMR�OVMC�O��Fdoc�OReturns the smallest prime factor of `n ≠ 1`.decl�Oequations_eqn_1!�O��Fequations_eqn_1�PInfo�Q�ATTR����QEqnL�Qdecl�Oequations_eqn_2!�J�Fequations_eqn_2�PInfo�U�ATTR����UEqnL�Udecl�Oequations_eqn_3�N!�J���/�Fequations_eqn_3�PInfo�Y�ATTR����YEqnL�Ydecl�O_sunfold���5�PInfo�\�decl�min_fac_zero�Mrfl�K�PInfo�]�ATTR����]ATTRsimp���]decl�min_fac_one�Q�Y�O�PInfo�`�ATTR����`ATTR�_���`decl�min_fac_eqn!�J�,����b��b�a�"�L�K�Z�b��b!�J�n��%�n�(�n��n���"�P��%�(����S��!���n,�����U�O�`�����k�����p�y��{��y!��cdvd_oneiff_false_intro��
�I����decidable���J�Annotshow����if_simp_congr�y��{������������if_false�����S�����A������������:����
�����Annot�Q�n,�����V��_a����3�����B�����b�"�T��%���(���.
�k��&
�S!�J�A��%�A�(�A��A��!��%�(���������n,��*�U�
� �Y��)������������c�je_1,h�&%�l�F�t�ne_4 %e��p�e_5 ��j�.��y� �.�%�����y�j�&� ���X�.��T��.��j�je_1�E�l�F�m���n�ne_4�I�p��p�e_5�Leqdrec���j�r,�y � ��{�X� ����V�{�Y�X� �.��h�.��n�.�s ��.�s�n�w�{3�{� ���%�p�.�t����s���2�.�T�V���Y���3���.�%���X� �y���X� �.���%congr_fun�.�p�.��`�e���n�.�p�� �_�d�w���m���n�p%�^�c���&���m�����T�T�]���l�����Tsubsingletonelim��decidablesubsingleton���]��.���3���%�����?Annot�QAnnot�Riffsymm�&�natdvd_add_iff_left���PInfo�a�
prvmin_fac_prop����
3min_fac_propdecl��nk����m����%�PInfo���VMR��VMC������prv��equations_eqn_1��equations_eqn_1decl������,���.����3�3�PInfo���ATTR�����EqnL��SEqnL��decl�min_fac_aux_has_propnn2nd2��ki�"������m��o��%�1�.��.��������;�������;���������;_x�,��ie�@�����o� �C�1����������_x�"_F_y��/�1�3k�������.�<�i���q�?�����o���.%�1�X��X������q�����o�X�t�1� �� ����������qa���S�����@� ���� ��� ���:�� �
�����Annot�Q�n,�����V��_a,�x�y��x3������� �dite������h���S�x�@�X����X���X���X�:��X�
�y���Annot�Q�x�X�n,��������e_1�=����e_2�=�@�1��1�%�G�%���1��X�X���X���X�k���true��������iff_true_intro���X�����X���������X���X����������if_true���X��andintro�Y�X�X����o�y�{%� �	�	�	"���Xmm2d�	le_of_eq`�{%�%�{�c��{q�{�g�{%��-�{�{�
���������prime_def_le_sqrt�{�	�	9�	C�ymm2l�	=d�	?����lt_of_lt_of_le`�	M�{���@�	M�{@�	L��{�{�sqrt_lt�	L�{�� �%��������x���n���	������������������X�����	����X���X���	����	���	��X���������	dk���S�1����.���:�.���.������.�	��.�n,�	��	������������	��.�k�	������	����	����	��.�	��.���	����	��.�	��.�	��	����.���	��	�	��.�	��	�.�	�����o�{�X%�V���<���k������o���)���@�{��%�������	����<���%���@�y����<����
����<�.����
��.��.�	��%�	�	��	�%������	��	��	��n�	��
&�	��	��	����	���	����	��.�	��	��	���	��.�	��.�	��
.�	��	����
/�.�	�
�@�������.�����
G�.
�.��������y����S!�
Q���<�
X�����n,�
^���j�
^�����
e!�����
�
k�
f�U�
Q�
k�k�
Q���
j��add_semigroupto_has_addadd_comm_semigroupto_add_semigroup�add_comm_semigroup�
jchas_add����e_2�=����e_3�=�?���.��
��%�G�����
��
��
j�k��
�
}���
�add_comm�
z�
�����
��
j�
]�
k�k�
]�
��
i�
�
~�
��
����
����
��
��
[�
��k�distribto_has_mul�distrib����to_has_add�
���
�
~�
�
��
��
���
��
�left_distrib�
���
��
��
���
�
��Z�
����������
��
���add_left_comm�
z���
propext!���
wadd_right_cancel_semigroupto_add_semigroupordered_cancel_comm_monoidto_add_right_cancel_semigroup]�
j��
fadd_right_inj��
j�
��
f��eq_self_iff_true�mm2d�	��:!��%@��%_x�!�$���y�nateq_or_lt_of_le��%�.%me�!�V�y������o���	;%���y���{�	Labsurd���7��������%ml�$orresolve_left!��y�@�Y��.�Y��n��[me�[�n������<�����	L����<�����	L�D�%�7�dvd_of_mul_right_dvd�)�7�	>�Q��{�	L�k�V�{_a,����7�n�73���h�X�Q��	L���V�_a,���7�73��������%Annot�QAnnot�R����.�%%�PInfo���
decl�min_fac_has_propnn1I�2�J���������O�����n0�O�S�1%�J%�n,�����
d�������������%�����o��	������1�����%����k���K��e_1�=�G%�J%��]���a��e_1�Eb��e_2�E�>��%�F���������3�������
d���������4�����
��%�>���_inst_1�a��%%�%�5%�7%�9%dvd_zero%�����
dx����x������forall_congr_eq�e�i���
d���6��imp_congr_eq��63�
d�y���6h'��6trueintro�v�x���
��>���_�}�
����������	���forall_prop_of_true�������
��s��imp_self�
�a����forall_const���inhabited�
��=��and_self���
�����and_true��le_refl`����O������%%�(%�%���n�����%��%�����min_fac_eq%��������d2���S�1���%��(��������n,��������������k�������������������������������
�������	�
���	��������o��	����	���
#kk2d�
 ������������n���
3����������������������
��������
;���
���
<���min_fac_aux_has_prop�������!���K�	�������@���I�+�,�D�
_���
_�
b���+���
_�D�
a���
a�,�
h��
a��+���������!�n���I�p�s����!�����I�����D�
����
��
��������
��D�
����
����
���
�����������!�����I�����D�
����
��
��������
��D�
����
��
�������
�����%����Y��mm2d�
 �X��%@%�.%mt�
��%�.e�
��_x� �����PInfo�ֶ
decl�min_fac_dvdn�\�����
V�J�
�n1�
��_x�
����O�:�O����
�9��������J�%�����
��min_fac_has_prop�PInfo���
decl�min_fac_primenn1��-������_a����dcases_on����%����o��J�%���-�J�left�$right�2������
 �J�.%�#������o�.�J�%�	�B�J-�*right_left�Bright_right�����A�J� %�"-�:���X�:�����R���J�X���:�	�[�c�mm2l�]d�_�
�J�����%dvd_trans��k�����PInfo��
decl�min_fac_le_of_dvdnm��p�2%��
���n1�
�mm2d��_x�\����le_trans`�O%��$`�O��O������
���PInfo��
decl�min_fac_posn�f�\��
���n1�
��_x���
���f�O��O��������min_fac_prime�PInfo��
decl�min_fac_lenH�f��� �!������min_fac_dvd�PInfo��
decl�prime_def_min_facpl�]�$�.��pp.�	6!��E_a���1�&��!�2���$�	�@�K�	�M!�*�right_left�Bright_right�W�"!�:�.�X�����c�:�.�������.�:����:����f_x��_a6���#�	�!��%�*�	��-���	��	���"�R��S���������PInfo�#�
decl�decidable_prime�(p�*���prime_def_min_fac�.���0�J�\�PInfo�+�prt�+VMR�+VMC�+��,�o	�Fnatdecidable_eq	�pdoc�+This instance is faster in the virtual machine than `decidable_prime_1`,
but slower in the kernel.

If you need to prove that a particular number is prime, in any case
you should not use `dec_trivial`, but rather `by norm_num`, which is
much faster.decl�+equations_eqn_1�,�C�+�C�,�I�F�PInfo�1�ATTR����1EqnL�1SEqnL�+ATTRinstance���+classdecidable�+��decl�not_prime_iff_min_fac_ltnn2k���@���5�6��L����Onot_congr�����������;and_iff_right6������I����g�����j�jlt_iff_le_and_ne_���_�n�j�min_fac_le��PInfo�4�
decl�min_fac_le_divnpos��np�L��has_divdivnathas_div%���<�=���>�L_a�'��%�7���C�8�
�����(�)����(�)����:�F����E�)�A��*�+�"�;���.�:�D�f�.����S�����f����n,�����V�._a,��f����3�����S����f��6�8�semiring�n,�����V�����:��_a,��f��E���3����mul_zero���:����8�������(�)�����n��(�)���R�n�^���X�^�)!������"�S��� �R�S��O���O�n,���W_a,�������\3�le_antisymm_� �le_of_lt_succ� �Q��R>��)� �U��+� _a,��Y3�%�*�
��/�*not_le�'� �Q�%��%�,�D_a,�1�3�D�%�
��D�%or_false�%�Q�C����D�,�X_a,�H�X�H3�Y��
��X�not_true�Q�C��� �Y�,�l_a,�H���X�H�3�n���
��l���� �Q�C�!�R� �n�V�R_a,�H�!�^�X�H��
V�X3��� �� �R�Q�����R�V�y�R�}_a,���^�3���R�Z�R�Q��R�����,��_a,��Y��3�����
�����not_and_distrib�R���� �Q�-� ���,��_a,�-�X�v3�����
������;� �.�succ_le_of_lt�� ��S���n,����V�O_a���3����S�����n,���
�V��_a���3��natdiv_one���(�)������"���S���������A�^�n��*�chas_le����%e_3 �������e_4 �.�>���.��9�%�F�������9��^�^���^���)�chas_div����%e_3�2������e_4�5�6�����.��]�%�@a�� ���]����X�'�k�X�'�'�V�X_a� ���'�n!�'�'���'�^�^�U�S�*���A�n,�*���V����^�A�^_a,�k����k��k��3�*�Anatmul_div_cancel_left�A�^�min_fac_pos�X�min_fac_le_of_dvd�X�A��A��A���%� ���^�S���A�^����^�A�n,�����V���A�^_a,� ���k�|3�������A�^��%�PInfo�;�decl�exists_dvd_of_not_primenn2np�LExistsm�������o�p�q�L������	�'I���%���	������d����%��a��%�c�-%@��%�not_prime_iff_min_fac_lt%�PInfo�n��decl�exists_dvd_of_not_prime2nn2np�L��m��m��v�w�x�L��-����$����	�$�E����"�PInfo�u�decl�exists_prime_and_dvdnn2��p.�{�|��E���	� �
������PInfo�z�	decl�exists_infinite_primesn��p��.�	p�J���fact
f1I���Y

pp��

np�)
����B.��	����"Annot�QAnnot�Rle_of_not_ge�'�%hge�*�%
h₁��Y�

h₂�
�primenot_dvd_one��Annot�QAnnot�R���~����Y�natdvd_add_iff_right�������Annot�QAnnot�R�dvd_fact�������|Annot�QAnnot�R�����Y%Annot�QAnnot�R���`�succ_lt_succ��^�fact_pos�PInfo�~�doc�~ Euclid's theorem. There exist infinitely many prime numbers.
Here given in the form: for every `n`, there exists a prime number `p ≥ n`.decl�primeeq_two_or_oddphp."!has_modmod�Ahas_mod����.���������natmod_two_eq_zero_or_oneh��orinlq!��%�
�%�X���
����	�����$"��dvd_of_mod_eq_zero%�������orinr�����PInfo���decl�factors_lemmak@�����S�����div_lt_self���S���������d�S�����I��������PInfo���decl�factors_main_meta_aux���������listnil����	m�S
�@���A�A
listcons
�RecFn�����Annot�QAnnot�R�factors_lemma�PInfo���!VMR��VMC���!��_c_1�F��natdiv��declfactors_main_pack_wf_rec_mk_dec_tactic_aux_1k����/has_well_founded_of_has_sizeofnathas_sizeof��
��
Annotinnaccessible

Annot���>�@�>
Annot��������n�J�nsizeof_measure�9�<�I�n@sizeof�9�<�V�I�S@natsizeof�<�\�I@�<�?
�C
�E�n,�`�i�g�]�<��equations_eqn_1�<�_�h�p�h�S�i�b�d�n,�i�{�g�<�<���<�h�zadd_zero�add_monoid�z�PInfo���!decl��_pack_x����������;���:_x���_F_y��;������������������n�����������p����������������������������I������	���

�@�&�
�$%�������Annot�QAnnot�R�-%�PInfo���!VMR��_lambda_1VMR��_lambda_2VMR��VMC���!�4�4VMC���!�����_c_1�F����VMC���!�������9decl��equations_eqn_1 ������������;������PInfo���!EqnL��decl��equations_eqn_2 ��������PInfo���!EqnL��decl��equations_eqn_3�� ��������	���S
�#���Annot�Q�������PInfo���!EqnL��decl�������PInfo���!VMR��VMC���!�����F������decl��equations_eqn_1 ��������PInfo���!decl��equations_eqn_2��������PInfo���!decl��equations_eqn_3��������	���S
�����Annot�Q�����PInfo���!decl�factors����PInfo���!VMR��VMC���!��doc��`factors n` is the prime factorization of `n`, listed in increasing order.decl��equations_eqn_1��������equations_eqn_1�PInfo���!EqnL��decl��equations_eqn_2������equations_eqn_2�PInfo���!EqnL��decl��equations_eqn_3�������	���S
����Annot�Q��equations_eqn_3�PInfo���!EqnL��decl�mem_factorsnp�has_memmem�listhas_mem�����_x�S���,�;��_x���_F_y�������(�%���5�"��������5ph������=��falseelim.�������������5����(��s���"��������5�?���S�D���"��������5ph�(��A%�H�����Z�����^	m�J��
�@������

h₁��'������
orcases_on�7%�'�����	�%-�h₂�q�T�������
Q�I�
Q���
Q���u���.�Annot�QAnnot�R�c�j�$�m�olistmem_cons_iff��m%Annot�QAnnot�R�-��PInfo���(decl�prod_factorsn���!listprod��)��_x�S����;��_x��_F_y�����g!���2%���"�������H2���!�������������lt_irrefl`���������������f�p!���J�s�"�������h�f!������������Y�����"�������h�f�I!���#�J���&���������	m��
�@����

�!���$��d��
h₁�f�
�S!���#%��k%��!�y%���x�|����n,��!�V��_a,!���#���t��	��
V�	�3��listprod_cons�v�%�S�!!�����n,�!�B�V���_a,!�y���*�	�!�I�	�3�!�������S�B!�����n,�B�b�V��J���k�g_a,!�I�)�	��03�B��natmul_div_cancel'���g��������Annot�QAnnot�Rnatpos_of_ne_zero�h!��
��a��%
�I�	��������	����Q!�	���������V�����_a,�
Z����
Z3����zero_mul���Annot�QAnnot�R�c!�i��a���gnatdiv_eq_iff_eq_mul_left���g������yAnnot�fAnnot�QAnnot�R�-��PInfo���2decl�primecoprime_iff_not_dvdpnpp��k�coprime%������������co��d�%��%�dvd_of_dvd_mul_left���S�����n,�����
d������chas_dvd����e_2�=��e_3�=�@�.����%�K������������Z��
����������nd���coprime_of_dvd�%mm2Amp�
 �_x��.�.%�	/�.�c�q�.�g�.%���PInfo��>decl�primedvd_iff_not_coprimepnpp��k������-�.�/�����H��iff_not_comm������natdecidable%�primecoprime_iff_not_dvd%�PInfo�,�Bdecl�primedvd_mulpmnpp�k��%����7�8�9�:���b�fH�b�����%a������or_iff_not_imp_left���o���h�r����������������X��%orrec���e��%h��dvd_mul_of_dvd_left��%h�edvd_mul_of_dvd_right�%��PInfo�6�Edecl�primenot_dvd_mulpmnpp�Hm���Hn��o�����G�H�I�J��K���L���
������s�c�����primedvd_mul���%�S������n,�����
d������a�Oe_1�E�&%�����
d���������e_1�E����e_2�E���%�*�����
���������s��
��s����s�
����or_self��
�����not_false_iff��PInfo�F�Jdecl�primedvd_of_dvd_powpmnpp�h�has_powpow�has_pow%���W�X�Y�Z��[��rec�Y�[�����	���[����+��������%nIH�(�[�	����p����pow�.%�9�.�?�c�9��<�.�=�?����<�.��n�?%�PInfo�V�Ndecl�primemul_eq_prime_pow_two_iffxyphp.hxI�hy�_k!����+�A��7��e�f�g�h.�i�_�j�_��c�hh�c
pdvdxy���.�
�fcase�	�� �	��drec�9�X�9�m�z�|�iI���j�_�k!�	[�����l�y����!�	;�{���{�m�z�e�f�m���iI%�j���k!�����l�	;�`��%���	L�m�	>�.��	L���	L�aha����#"�7��7��7�c�8$�����7�	L��%!����Q!��s�semigroup��7!�7���,��_a,!��%� ��3�����
�����eq_comm���7�Q!���7����7�7���,!������_a,!�����������3�����
�����natmul_left_inj�7���7���7�	L�Q!���7������V�����_a,!����%� ���
V��3���mul_assoc���7��Q�
��7��V�,_a,�����3�-��natpow_two�7�Q!�� ��,�-�W_a,!��X� �2!�z� �23�C�
�_x#�S���������n,�a���
d�a�=���4�^���
d�^�������U�X���n�^�Q���^�p�X������k����chas_mul����e_2�=����e_3�=�
���.����%�
�������������%�Z���������
��m������`���
d�`�m���U� ���n�`�Q�I�`�
d�I!��� ���`�U�G������X����� � ��� �2���<���
����`����� �������7������������_x��falserec�a�����������������!�������������k�G���� ����� �����n�����t���x������� � ���%����� �2�����
��������������
�����natmul_right_eq_self_iff��� ���
������������%�m�|�i���j�_�k���l��of_eq_true���
d��a��jI�	>�k!�@�	L��	;�l���F�7� �	L���	L���D��I�	;�k!���	>���l���H��	>���	>�V�D��!�r�	;��{�l�E�\��	;!�	L�	;�f�D���B�i���!�	>���u�D�����~�D��������is_commutativecommlatticehas_infinf��semilattice_infto_has_inflatticesemilattice_inf_botto_semilattice_inf��semilattice_inf_bot_of_bounded_lattice��bounded_lattice_Prop��inf_is_commutative�������
d������������������3����������������
d������������and_eq_of_eq_true_right����eq_true_of_and_eq_true_right�������V�����f�V���u�f���~�u���~��imp_eq_of_eq_true_left�x���
d�x�B��	;�.��eq_of_heq�x����a'e_0�=�V%��heq�	L���heqrefl��%�i������i�k�����i������i������comm_semigroup_to_is_commutative���.�	;eq_true_intro�����u�l�x�}���m����m�k�i���l�����f�k�m�t���Z��
d�Z������n,�Z�3�Znot_eq_of_eq_false�eq_false_intro�����V�j�Z�e���E�1�
d�E������n,�E�73�E�%�6�'�6%���i�E�U�e�f�m���i���j���k���,�l���`��%���m�.��O���O��o�p�R��"��_��_�co�_$�`���_�O��%!����Q���_!�_���,�u�r,���o3�u�x�
��u�x���_�Q!���_����_�_�u�,!�������t,!���o����o�o3���u�
����u���_���_���_�O�Q!���_������V������w,!���o%� ���
V��3�����%�_��Q����_���V���y,����o��3�����<�_�Q�B�����W�|,�H���L��3������}#�S��o��o���n,�����
d���=���4�����
d���p�o���p�o�n���Q������w���o�k�����o���o�o���o%�Z�o�o�o��
������o�����
d��������o�n���Q�����
d��!��� �������6���o� � � �������<�o�
��8�����o� �o���o�_��o�o��)������`�����3��5����5�7�o���5!���6���f���i������ ����� �����n����o��w�
�v��o� � ���%�o�o� �����D�
��k�f�I�6�o�M�
��f���!�o� �M�,��.�	;��������
d������������1����I�1�����I�����I�����E�,��3���
d�������������������������������������-�F���.�c���[�.������.����.��%Annot�QAnnot�R�S�t��$�n,�t��V�s_a,���3�t��S����n,����
d�����������<��
��������������F��b%����%�����7��9�%dvd_mul_left�%���_x�h_a����A��#��������k�m�B��.��k�	��.�"_x!�z�X�� �X��}��X��X��_x!�@�{�� �������[��<��PInfo�d�Sdecl�primedvd_factnphp.ko����%������.�brec_on����%��_F�below������.������.����%�������k��^��������+�"k��Y��(�iff_of_false������%not_le_of_lt`�����%�������n�"k��Y�o���o�S��k���p�^���n,�����V�Y�p_a,k���Y��B��k�"��3�����fact_succ�S��k��p�����n,����,��_a,k����s����k��3����
��������p�^��S�k������n,��%�,��_a,k���s������k�,��3����
�����pprodfst��natadd�+�rec
n��punit
��ih��pprod

��
���F�@��

�I�A�R�F����#��h�#���+�C�����s�succ_pos%�le_succ_of_le�%h���������A���,�Clt_or_eq_of_le_���functioncomp�t�C�x���+�C�"�%h�v���	����s��S�������n,������_a,�9����3���������%�PInfo���ddecl�primecoprime_pow_of_not_dvdpmapp�h��e���$���������������1coprimepow_right�%��symm%������%���X�%�PInfo���mdecl�coprime_primespqpp��pq��k���%�^%��������������������X�%�W���%�g%�E��PInfo���pdecl�coprime_pow_primespqnmpp�"pq�"hI�����q��6������������"���"����coprimepow�.��������.����coprime_primes�.�%�PInfo���sdecl�coprime_or_dvd_of_primeppp.i�������.���S�-�+��*�n,�-�3�,�,_a,���e�:3�-�2�
��,�2�primedvd_iff_not_coprime%decidableem�*�T�PInfo���wdecl�dvd_prime_powppp.mik�+��k�r��%H�Zq�6����.�����#����k�\�����[���Zq�����Sk�$�+�����Y���+���vq�q���n,�~���
d�~k�
��
���a��e_1�Eb��e_2�E�k�k�%�*k��t�
��
d�t�
�����s�k�s�$�chas_pow����e_2�=����e_3�=�
���.����%�
���������+��nat_zero_eq_zeronatpow_zero��
����
����}�
��
d�}a"�6��
��������
W����p�H��He_1 �H�F�H%���|��funextxx�wh�v�y������
d���v�����
�����exists_prop�v���4�v�
W�
d�v����
W�]�.����e_2�=����e_3�=�@�.���%�K�����+����
���
W�le_zero_iff����3���
���������q�q��exists_eq_left����U�������
�����iff_self�
��mIH�p�����w�	�k�q�s�����Y�������`q�zh�w��%q����|k��z�������Y�������r�7��ae�k�V��X��k����.�����Y��������q�k�Sk���X�q�����Y��������!��y���yk�������X���n,�����V��_a,k���%������������!��{���k����3�����pow_succ�X��S��k�����X�����n,�����V�����X_a,k������.������3���������X�S��ko�����n,�����,�F�F��_a,k�������������3�����
�����natmul_dvd_mul_iff_left�X�����X� �S��k�����Y���.��� ������n,��� �,��_a,k�������3��� �
���� ��� ��h� ����Y������ 5�7������ :�����Y���� ��� >!������kh_h� 9�$��� ��� M�A��%��Y� M� Q�����Y�������� V!��	>���	>h� Me� P����Y���Y��� e!��� ��	L���\��� U��� s� Z� [���succ_le_succ����S!��	;�.�J��!���.�	;� ��n,� �� ��V���	;�._a,� v�
V� u3� �� ����	;�.�S� �!���J��	;� ��n,� �� ���_a,!���	>� u!���	>� u3� �� ���� ���������������Y��� ��� ��A� C�h_h��� L��� =��� �� B� O� �Y� �� ������Y������� ��� \�� ��� ����� e�� k�����Y���	;��� �����U���+� U�� Z� [�+���������Y������� �� �1��	L�	>�S� ���� g�n,� ��!�V_a,�7�!3� �� g�� g�Q� h� i�+� h�U� g� g��� g�!�k�!� i����	L�	L���	L�+������	L�o�	L� k��n�Y�� h� i�p�� �%� q%�����!A� �1��le_of_succ_le_succ%���Q!���7��+%�7��!N�,!�M�!P_a,!������!C��3�!Q�!S�
��!V�!Snatmul_right_inj�7�X�!N��Q�!M�+�s�!Q�V�!n_a,�!Y�1���!Y3�!o�!P���7%�Q!�	�X�!n�!o�V���7�X_a,!����!s�
V�!s3�!��!L���7�X�������w�o���������Y�������!����d�!��S�y�����s���r���t�n,�y�!���_a,�����������A������������q��3�y�coprimeeq_one_of_dvd%�n�primecoprime_pow_of_not_dvd� ��%���!��� q������!�����������Y�)�!���x�)�y���kd_h�w� L�������"�A��%�0�Y�"�"	������l�"e�"�S�	��k� =�k��"�n,�"�"��_a,�9����X�"3�"�"�pow_dvd_pow�{�� =�PInfo���zdecl�mem_list_primes_of_dvd_prodphp.l��pH�(�������s%�6�7.�6�7.�8�listbrec_on�8���"F���"G�'�%�8�_F�;below�8���"F����"G�'�.%�8��=�"Z�8���"F��9�"G�'� %listcases_on�8��=�"Z�8���"F��	�"G�'��%��9�:�(%����	��%�"n��=�"Z�8���"F�� �"G�'�X%��"h₁�9�:�(��>��h₂�"����"��"��"��A�"��B�"��D�	�"��"���X� l_hdl_tl��=�"Z�8���"F����"G�'�y%�$�"h₁�9�:�(�"�>�%��h₂�����"��"��"����E�"��F�"�
h₃�������

hq-�
�p�E�.�E����'���"��.��c�E�r�"��"��"������.�"��{h�"��_x�'�	>����	;��Q������"��,�"�_a,���{� 3�"��"��
��"��"�not_not�"��J�	;��Q��Y��"��,�"�_a,��F� �v3�"��"�nedef�	;��Q����	;��"��,�#_a,����	>� �v3�#	�"��
��#�"���	;����Q����#	�,�# _a,��� 3�# �#	�
��# �#	�F�	;���listmem_cons_self�	;�.h�"�
hlpH�(���
���"��#� ��"��"�����	>� ����"��#H�=�8���"F��!�"G�'��%��?recn����Fhdtl�ih���H�I�8���"F��O�"G�'�_%�F��T�I�#W�#n�F�.Annot�QAnnot�Rphlp�#@�.���'�#�X� "�X�#~� ���X� ���#��#�Annot�QAnnot�R%��#:��Annot�QAnnot�R�_x�B��#���y����9���PInfo�5��decl�mem_factors_iff_dvdnphn�ghp��k�'%����a�b�c�g�d����#��h�#��_x�������prod_factors�%listdvd_prod��#�h��mem_list_primes_of_dvd_prod��#��mem_factors��#���#���#���#��PInfo�`��decl�perm_of_prod_eq_prodl₁�l₂��!�"G���pH�(�����$listperm���n��o���#���$��$�"P�n��$��n�_F�"Z�$
�o��!�"x�#���p�q�(�����$�n��o���#���$��$�t�$
��"l�n��!�#��"���"w�t�$
%�$�� ��!��������p�q�(����t�$
��"l�o���"F��$!�"G�$�%���$&��$!�$ �"�$)��rpermnill₂_hdl₂_tl��pH�(�����$!���$9�"�$�"��"�
ha�
�D�~�$?�"���%��#:��Annot�QAnnot�R�#����}listprod_nil�v�#����(%�$ ��$ �$X�#��I�%��$W��$b�$`�9%��o��$_�%l₁_hdl₁_tl��!���"����.��p�q�(�$W���t�$
�$W�"l�o���"F�!���#�.��"G�$�#��.%�X��$&�!���#���$ �"�$�"��"�
ha�	�
�D�9�$�"���.�"������#:��.Annot�QAnnot�R�_x�9�$P�}�$U�$��$��$ �$��y�.����$���$��$��9��.�o�.�$�l₂_hdl₂_tl���$<�!���$��$=�"�$�"�� ��"�
hl₁'pH�(� ��

hl₂'pH�(�?erase���$�����

ha�"n�$�

hb�$�$��#�y�$��$��y

hl!���y���$��$��{
�utrans�"����{�#���$��#D���$��uskip���{�$��=�$
�{�#]�Z�[��\���H�I�$
�F�{�T�I�$��%�F�X�$����ssymm�#D�$�Annot�QAnnot�R�c!�	[�$��	[�$��$����{�$��$����{�X�{�#:�{�y�S�%!!��#�{�y�% �n,�%!�%4�V�y�{��y_a,!�����{�����$��
V�%A3�%!�%2��%2�%;�9�y�{�S�%4�%3��%0�$��n,�%4�%V�V�%9��$�_a,!��$��{�%A�%`3�%4�%U��%U�%\�9�$��{�S�%V�%3���s�ucomm_monoidto_monoid�comm_monoid�{�%v�$��n,�%V�%}�V�%{�%T_a,�%`��$��%c3�%V�%|��%|�%��rprod_eq_of_perm�%u�$��%T�Annot�QAnnot�R�rperm_erase���y�$�Annot�QAnnot�R�#�������#:���X�$���_x�����#���X�$�%�S���%����y����X�n,�%��%��V��%�_a,�����$����%�3�%��%��9�X���o���%�Annot�QAnnot�Rphp�$�� .�|mem_of_mem_erase���y�$�Annot�QAnnot�Rphp�$���Rmem_cons_of_mem���X�.%�%��%��%�PInfo�m��decl�factors_uniquenl�h₁�$h₂�"w�$%�#���������&&���"w
hn�f�
�perm_of_prod_eq_prod��#��S!�"��#��&1��n,�&2�&4�V�#�_a,!�$"�����&:3�&2��#�%�#�Annot�QAnnot�R���h��listrec������"F���#������$&���$!��D�&Z����&Z���$ ��al�hi�&W���$���!�$X�natmul_ne_zero��"�O��a�������$I%php�$��%��.��Q!���#��!�#���V�#�_a,�$���
W3�&��#��#���Q�&4�&1���_a,�&:��&?3�&4�%�PInfo����decl�succ_dvd_or_succ_dvd_of_succ_sum_dvd_mulpp_prime.mnklhpm�\�hpn�x�hpmn������%�`�z���.�z�������.�����������&����&����&�
hpd��z���� �s

hpd2�	��������

hpd3�����A�����

hpd4������������.

hpd5�B�����k� �B���k�

�����X���y���� �������E���y�&��E�&��&��&���&�����J���	;�{��J�X�	;�y�mul_dvd_of_dvd_div�	;�{�'� ��'���'	�'�'�y�'�Annot�fAnnot�QAnnot�R�c�B��&��&��&����{�&��&��yAnnot�QAnnot�R�S�&������G��&��&��n,�&��'<��y�y���y�&��';natdiv_mul_div�X�&�� �&���Annot�QAnnot�R�Q���&����	���&�������	��'X�&��b�Ya��e_2�=����e_3�=�
����.��'b�%�
��'b����A�A���A�'W�&�natpow_add���.�Annot�QAnnot�R�dvd_div_of_mul_dvd�&��X�Annot�QAnnot�R�PInfo����decl�primes��subtypep.�PInfo����VMR��VMC��doc��The type of prime numbersdecl��equations_eqn_1eq�����'������'��PInfo����ATTR�����EqnL��SEqnL��nspace�primesdecl��has_reprhas_repr�'�has_reprmk�'�p�'�reprnathas_repr��val�'��PInfo����	prt��VMR��VMC����	���'�natreprdecl��equations_eqn_1 �'����'�2�'��'��PInfo����	ATTR�����EqnL��SEqnL��ATTR�2����class������decl��inhabitedinhabited�'�inhabitedmk�'�subtypemk�'��prime_two	�PInfo����	prt��VMR��VMC����	decl��equations_eqn_1 �'����'�2�'��'��PInfo����	ATTR�����EqnL��SEqnL��ATTR�2����class������decl��coe_nathas_coe�'�has_coemk�'��'�	�PInfo����	prt��VMR��VMC����	c�'�decl��equations_eqn_1 �'����'�2�'��'��PInfo����	ATTR�����EqnL��SEqnL��ATTR�2����class������decl��coe_nat_injp�'�q�'��!coe�'�coe_to_lift�'�coe_base�'��'��'� �'�%���'����'�h�'�subtypeeqx.%�PInfo����decl�monoidprime_powu_1�_inst_1monoidhas_pow�'����'����'���mk�'�xp�'��]�monoidhas_pow�%�'�	�PInfo����	prt��nspace��VMR��VMC����	��'������monoidpow_maindecl��equations_eqn_1�����'����'����'������(���'����'���'��(�PInfo���	ATTR����EqnL�SEqnL��ATTR�2����class�����EndFile