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����inittacticlint��Xexport_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_assocdecltacticinteractivefconstructortacticunitid_rhs~concat_tagstacticfconstructor�PInfo	VMRVMC	tacticfconstructortacticinteractiveconcat_tagsdocSimilar to `constructor`, but does not reorder goals.decl~try_formaxinteractiveparsepexpra
exprreflectboolffleanparserpexprstdprecmaxtac~itactic�� monadto_has_bindinteraction_monadmonadtactic_statenat"exprbooltt#}i_to_expr_stricttacticeval_expr#
Quote#max#s_aoptioninteraction_monadresultoptioncases_on8�988has_bindand_then!tactictracestringhas_to_format_to_has_to_tactic_formatFstringhas_to_format
Strtry_for timeout, using sorry~admit,val8?try_for8,_,�PInfo�	VMR�_lambda_1VMR�VMC�	�_fresh
��@�_fresh
��8VMC��	s���i_to_expr_strict	#tacticeval_expr	��try_for	�ycharof_natr�r�o�s� �g�n�i�s�u� �,�t�u�o�e�m�i�t� �r�o�f�_�y�r�t�stringemptystringstr���������������������������stringhas_to_format�Ftrace	���admit��doc� `try_for n { tac }` executes `tac` for `n` ticks, otherwise uses `sorry` to close the goal.
Never fails. Useful for debugging.decl~substsl	listname�ilistreflecth�hnamereflect
Quoteh�manyleanparser�parser_state�alternativeh�ident��D�mmap' hhh)}get_localtacticsubst~trytacticreflexivityI�PInfo� 	VMR�_lambda_1VMR�_lambda_2VMR�VMC� 	αVMC�!	��htacticget_local	
FsubstVMC� 	������listmmap'_main	tacticreflexivity�trydoc�Multiple subst. `substs x y z` is the same as `subst x, subst y, subst z`.decl~unfold_coesloc	�loc��interactivelochas_reflect�typeslocation��~unfoldlistconshnamemk_string
Strcoenameanonymous��
Strcoe_t����
Strhas_coe_t���
Strcoe_b����
Strhas_coe���
Strlift����
Strhas_lift���
Strlift_t����
Strhas_lift_t���
Strcoe_fn����
Strhas_coe_to_fun���
Strcoe_sort����
Strhas_coe_to_sort�listnilh�unfold_configmktacticsimp_configmksimpdefault_max_steps
'

'
'

'


''�PInfo�$	VMR�VMC���$	��simpdefault_max_stepsnameanonymouse�o�c�����namemk_string�t�_�e�o�c���������t�_�e�o�c�_�s�a�h������������e�o�c�������b�_�e�o�c���������e�o�c�_�s�a�h����������e�o�c�������t�f�i�l��������t�f�i�l�_�s�a�h�����������t�f�i�l��������t�_�t�f�i�l����������t�_�t�f�i�l�_�s�a�h�������������t�f�i�l��������n�f�_�e�o�c����������n�u�f�_�o�t�_�e�o�c�_�s�a�h�����������������e�o�c�������t�r�o�s�_�e�o�c������������t�r�o�s�_�o�t�_�e�o�c�_�s�a�h������������������e�o�c�������interactiveunfolddoc�Unfold coercion-related definitionsdecl~unfold_aux�}targettgt("h}decl_namenameh	to_unfoldname_setexprlist_names_with_prefix,"guardtacticalternativenotcoe_sortboolcoe_sort_bool�emptynedecidable�a�b�booldecidable_eq,�!'_x�simp_lemmasdsimplifysimp_lemmasmk�to_list,\tacticdsimp_configmk��'
''''''
'e(tacticchange'	�PInfo�+	VMR�_lambda_1VMR�VMC�9>+	��_fresh
��6��_fresh
��2(name_setempty�,_main				
interaction_monadfailed	8�name_setto_listsimp_lemmasmksimp_lemmasdsimplify	+1tacticchange6VMC�+	�tactictarget	tacticdecl_name	exprlist_names_with_prefix���9doc�Unfold auxiliary definitions associated with the current declaration.decl~recover"g(}metavariablestacticset_goals�PInfo�S6	VMR�SVMC�S6	�tacticmetavariables	tacticset_goalsdoc�S For debugging only. This tactic checks the current state for any
missing dropped goals and restores them. Useful when there are no
goals to solve but "result contains meta-variables".decl~continuetacs_x88,�]�cases_on�\�]a�successunitstare5aformatref5pos�j�PInfo�[;	VMR�[VMC�[;	�]�\		doc�[ Like `try { tac }`, but in the case of failure it continues
from the failure state instead of reverting to the original state.decl~swapnopt_param#bit0#nathas_addhas_oneone#nathas_one�j���V}get_goalsgs�T_a5(:(�u��~skip�(�Y�(listremove_nth(has_subsub#nathas_sub\���wnth(��,���PInfo�iA	VMR�iVMC�i!A	��j�y
CNatM2tacticget_goals	natsublistnth_main	
�skip����remove_nth_main�Zdoc�iMove goal `n` to the front.decl~rotaten�y������tacticrotate�PInfo��J	VMR��VMC��J	���y
CNatM1Frotatedoc��`rotate n` cyclically shifts the goals `n` times.
`rotate` defaults to `rotate 1`.decl~clear_tacticrepeat�V}local_contextl�Tlistmfirst �(h(�
return hexprlocal_pp_name'_ph_ahnamecases_on��h
match_failedinteraction_monadmonad_failAnnotdo_failure_eqaFa_1h��eqcharstringfront,charof_natbit1#���|����������chardecidable_eq����_x"�)�}infer_type}is_classcl������,'_xtacticclear��unsigneda_1h���wreverse(
�PInfo��M	VMR��_lambda_1VMR��_lambda_2VMR��_lambda_3VMR��VMC��M	�VMC��dO���(��namecases_on[����match_failed_��front��	�D	Ttacticinfer_type	 %tacticis_class*	+M�B	/16	356	7=�D@	AF	tacticclearK	
RY������VMC��M	�tacticlocal_context	��reverse���!��listmfirst_mainVMC��M	��Frepeatdoc��Clear all hypotheses starting with `_`, like `_match` and `_let_match`.decl~apply_iff_congr_core}applyc�
Striff_of_eq�Fapply_cfgmkFtransparencysemireducible'Fnew_goalsnon_dep_first''''�PInfo��U	VMR��VMC��:U	�q�e�_�f�o�_�f�f�i������������Fapplycdecl~congr_core'�tgt(has_orelseorelsealternativeto_has_orelse�}apply_eq_congr_core�5}apply_heq_congr_core�5~apply_iff_congr_core}failFJ
Strcongr tactic failed
�PInfo��X	VMR��VMC���X	��N	{c�_c_1 �_c_2t�_c_3a�_c_4i�_c_5d�e�l�f�r�g�n�o����������������������?fail��interaction_monad_orelsetacticapply_heq_congr_core����apply_eq_congr_core��decl~congr'_maina	5#��Ioptionhas_reflect#�#natreflect
Quote#optionalw|#�with_desc#coeF�mcoe_to_liftF�mcoe_baseF�mstring_to_format
Strn�small_nat���o:#���o}focus1�5~assumptionD~congr_core'~all_goals�5~reflexivity�5has_bindseq!tacticsave_infoposmk�}�}�}���}��������������step��interactiveapply
Quoteproof_irrel_heq�_�h�5����������������
Quoteproof_irrel���j�
�pRecFn��functormap5applicativeto_functor5�to_applicative5optionmonad##natpred�none#��#ite��#has_zerozero
#Annotinnaccessible
nathas_zeroAnnot��{decidable_eq��}failed�v�x�z�{�}����������some#�PInfo��e	VMR��_lambda_1VMR��_lambda_2VMR��_lambda_3VMR��_lambda_4VMR��VMC�e	�VMC�e	�t₂t₁βα��	VMC�;e	���	5�{pred�
map������applyFstepiFsave_info��has_bindseq�����%�&h�'���)���interactivereflexivity���all_goalsVMC�<e	��_fresh
���#��	6�#�$������%�&i�'���)�����%�&h�'���)���+���,VMC��e	�e���o	��assumption��Ffocus1natdecidable_eq	��0���1?faileddecl~congr'���J��I�P
Quote#�n���PInfo�5e	VMR�5VMC�5e	��doc�5Same as the `congr` tactic, but takes an optional argument which gives
the depth of recursive applications. This is useful when `congr`
is too aggressive in breaking down the goal. For example, given
`⊢ f (g (x + y)) = f (g (y + x))`, `congr'` produces the goals `⊢ x = y`
and `⊢ y = x`, while `congr' 2` produces the intended `⊢ x + y = y + x`.decl~replaceh	5h����Kho
Quoteh�Xhq₁	5
���K

Quote
�X
has_seq_rightseq_rightw�
to_has_seq_rightw��wz
�tk
Str:�texprq₂����
Quote
�	��
Str:=��7���8��>�&	hhoptionget_or_elseh���
Strthis�"��}try_core(�old���~have�\h��a����
Quoteh���_h�>coe_optionh,\��_x_a��_a�&��,���(:
�I�&,DD~swap�����Rval_1
��,,\�PInfo�6r	VMR�6_lambda_1VMR�6VMC�LDr	��_fresh
��h�_fresh
���&�_fresh
����tactictry_core	>�have	7	��5	0�i	
��$	
	%*
�i/	
4��<VMC�6!r	�>�&�8��7���s�i�h�t��������
get_or_else_main�?h�Ldoc�6Acts like `have`, but removes a hypothesis with the same name as
this one. For example if the state is `h : p ⊢ goal` and `f : p → q`,
then after `replace h := f h` the goal will be `h : q ⊢ goal`,
where `have h := f h` would result in the state `h : p, h : q ⊢ goal`.
This can be used to simulate the `specialize` and `apply at` tactics
of Coq.decl~classicaltacticclassical	�PInfo�[}	VMR�[VMC�[}	�Wclassicaldoc�[Make every propositions in the context decidableprvgeneralize_arg_p_aux_private�`���generalize_arg_p_auxdecl�b��
wprod
h��
exprcases_on
��
�r��#�r�\�q�r�_�z�r�b�z�rleanparserhas_coe'�q�=�qFJ
Strparse error��level��a_aha_a_1g����a_aha_a_1ha_a_2&
��a_aha_a_1ha_a_2binder_infoa_a_3����a_a��a_a_1���u�t���r,�t#���t����a_a_aha_a_a_1����a_a_aha_a_a_1ha_a_a_2����a_a_aha_a_a_1ha_a_a_2��a_a_a_3����a_a_a��a_a_a_1���u����r,�#�������a_a_a_aha_a_a_a_1����a_a_a_aha_a_a_a_1ha_a_a_a_2����a_a_a_aha_a_a_a_1ha_a_a_a_2��a_a_a_a_3����a_a_a_a��a_a_a_a_1����a_a_a_aha_a_a_a_1��a_a_a_a_2������a_a_a_aha_a_a_a_1����a_a_a_amacro_defa_a_a_a_1g��listcases_on�������r��a_a_a_a_1_hd��a_a_a_a_1_tl���u�����r,��#��������a_a_a_a_1_hd_aha_a_a_a_1_hd_a_1������h,�
Streq�namehas_decidable_eq,���r�������r���u�u���r�u#���u����a_a_1_aha_a_1_a_1����a_a_1_aha_a_1_a_1ha_a_1_a_2����a_a_1_aha_a_1_a_1ha_a_1_a_2��a_a_1_a_3���yw�
to_has_purew��qprodmk
h
\a_a_1_a��a_a_1_a_1����a_a_1_aha_a_1_a_1��a_a_1_a_2��a_a_1_a_3�����a_a_1_aha_a_1_a_1���a_a_1_a��a_a_1_a_1����a_a_a_a_1_tl_hd��a_a_a_a_1_tl_tl������a_a_a_a_1_hd_aha_a_a_a_1_hd_a_1ha_a_a_a_1_hd_a_2����a_a_a_a_1_hd_aha_a_a_a_1_hd_a_1ha_a_a_a_1_hd_a_2��a_a_a_a_1_hd_a_3����a_a_a_a_1_hd_a��a_a_a_a_1_hd_a_1����a_a_a_a_1_hd_aha_a_a_a_1_hd_a_1��a_a_a_a_1_hd_a_2���/�9a_a_a_a_1_hd_aha_a_a_a_1_hd_a_1���7a_a_a_a_1_hd_a��a_a_a_a_1_hd_a_1����a_a_aha_a_a_1��a_a_a_2�����Ma_a_aha_a_a_1���Ka_a_a��a_a_a_1����a_aha_a_1��a_a_2�����[a_aha_a_1���Ya_a��a_a_1�����PInfo�bVMR�bVMC�b�Z�ey��
exprcases_on
C����G�V�����r�_c_1e�_c_2o� �s�a�p�����������������gof_tactic'r�_c_3e�_c_4o� �s�a�p������������������r�_c_5e�_c_6o� �s�a�p������������������r�_c_7e�_c_8o� �s�a�p������������������r�_c_9e�_c_10o� �s�a�p��������������������
�I������M���
Q�
��
��r�_c_11e�_c_12o� �s�a�p�������������������Tr�_c_13e�_c_14o� �s�a�p�������������������Tr�_c_15e�_c_16o� �s�a�p�������������������Tr�_c_17e�_c_18o� �s�a�p�������������������Tr�_c_19e�	_c_20o�	 �	s�a�p�������������������T��
������S������W����r�_c_21e�_c_22o� �s�a�p�������������������
Or�_c_23e�_c_24o� �s�a�p�������������������
Or�_c_25e�	_c_26o�	 �	s�a�p�������������������
Or�	_c_27e�
_c_28	o�		
 �
s�	a�p�������������������
Or�
_c_29e�_c_30
o�

 �s�
a�p�������������������
Or�_c_31e�	_c_32o�	 �	s�a�p�������������������
Or�
_c_33e�_c_34
o�

 �s�
a�p�������������������
Or�
��e���
o�

 �s�
a�p�������������������
Or�
_c_35e�_c_36
o�

 �s�
a�p�������������������
Olistcases_on���r�_c_37e�	_c_38o�	 �	s�a�p�������������������
N��
��_�������		�	J�	��	��

r�_c_39e�_c_40o� �s�a�p�������������������
Mr�_c_41e�_c_42o� �s�a�p�������������������
M�q�e�����
namehas_decidable_eq	����r�_c_43e�
_c_44o�
 �
s�a�p��������������������	�����E��
���6�w������A�����r�
_c_45e�_c_46
o�

 �s�
a�p�������������������Dr�
_c_47e�_c_48
o�

 �s�
a�p�������������������Dr�_c_49e�_c_50o� �s�a�p�������������������Dr�_c_51e�_c_52o� �s�a�p�������������������D�Dr�_c_53e�_c_54o� �s�a�p�������������������Dr�_c_55e�_c_56o� �s�a�p�������������������Dr��e��o� �s�a�p�������������������Dr�_c_57e�_c_58o� �s�a�p�������������������Dr�_c_59e�_c_60o� �s�a�p��������������������r�_c_61e�_c_62o� �s�a�p�������������������
Mr�
_c_63e�_c_64
o�

 �s�
a�p�������������������
Mr�_c_65e�_c_66o� �s�a�p�������������������
Mr�_c_67e�
_c_68o�
 �
s�a�p�������������������
Mr�_c_69e�_c_70o� �s�a�p�������������������
Mr��e��o� �s�a�p�������������������
Mr�_c_71e�_c_72o� �s�a�p�������������������
Mr�_c_73e�
_c_74o�
 �
s�a�p�������������������Tr�_c_75e�	_c_76o�	 �	s�a�p�������������������Tr��#e�	�$o�	 �	s�a�p�������������������Tr�_c_77e�	_c_78o�	 �	s�a�p�������������������Tr�_c_79e�_c_80o� �s�a�p������������������r�_c_81e�_c_82o� �s�a�p������������������r��)e��*o� �s�a�p������������������r�_c_83e�_c_84o� �s�a�p������������������r�_c_85e�_c_86o� �s�a�p������������������prvgeneralize_arg_p�`�IA�{generalize_arg_pdecl�1�r�y�Z�q�h
Strexpr = idwwz
�q���y���b�PInfo�1�VMR�1_lambda_1VMR�1VMC�2��yleanparserpexpr		�bVMC�13��2d�i� �=� �r�p�x�e�����������formatof_string��decl~generalize_a_auxuα�9hx�x����,,,,�:�x�;�{,id,�PInfo�8�ATTRnolint���8�idecl~generalize_hyph�������
Quoteh��_x	�punitreflect�p	�q��qprodhas_reflect
ho
Quote

Quoteh�1l��@���A���D���G��
}get_unused_name�
Strh���h'h�
���
Strx���x'h"5�o((�����include_goal���,��'�����~refine
Quote~generalize_a_aux_�}_x������ ��������has_seqseq�
to_has_seq��(����(a(���((tacticintro,���������������g��%�U#�get_locals\tacticrevert_lstn#�~generalize��i��_x�}intron,_x_a��:���a�����i���prodcases_on((���val_fst(val_snd("g�oh(tacticapply�,_x���Z_x��\\�PInfo�?�	VMR�?_lambda_1VMR�?VMC�j�	snd(�_fresh
�s�(VMC�?��	��G��D���A���@���h����tacticget_unused_name	��x�����p	��locinclude_goal�B	$	!#$	%)h���refine	.c
Fintro	28�j=
	>P�t	BI
N
U
	V\a
h	
	i�
�locget_locals	mrtacticrevert_lstw
	x��generalize	�tacticintron	��		���Fapply	����	��������
�
�	
�	doc�?Like `generalize` but also considers assumptions
specified by the user. The user can also specify to
omit the goal.decl~convertsym	5��7�K��
Quote�Z�7�h
Str←�X�
Str<-r�n�J��I�P
Quote#�Y�#�
Strusing�l�~�I��J���V�}mk_mvarv(�����@is_some\�'�^'��exprsubst
�f
Quote_x_1���_x_2���eqmp,to_pexpr(exprhas_to_pexpr�p�Jpexprhas_to_pexpr�����f�f
Quote_x_1���_x_2���eqmpr,�t�z_x��gs�T��Y�����(_x��~congr'_x��gs'�T�Yhas_appendappend�T��has_append(\�PInfo�}�	VMR�}VMC�}o�	����V��J�~�IFmk_mvar	i�
is_some_main�B		��to_pexpr������exprsubst���s*���������m�����s	+b�	.[	�Z	4T���	;M
�	>F��append_main�ZKR
Y
`	
gdoc�}Similar to `refine` but generates equality proof obligations
for every discrepancy between the goal and the type of the rule.
`convert e using n` (with `n : ℕ`) bounds the depth of the search
for discrepancies, analogous to `congr' n`.decl~compact_decl_aux_main��i������(���Tg�oi�o��(��i������(���T��(���T������������i���h\���(��,���a_hd(a_tl�T�t'��(��,��#��
��RecFn������,������a_hd_aha_hd_a_1�������������a_hd_aha_hd_a_1ha_hd_a_2(���������\a_hd_aha_hd_a_1ha_hd_a_2��a_hd_a_3(��)�����dlocal_const'\��,t'(��and����	����(��anddecidable���tacticbinder_infohas_decidable_eq����exprhas_decidable_eq�������\�	������"������������vs�������������	��a_hd_a(a_hd_a_1(��a_hd_aha_hd_a_1��a_hd_a_2(a_hd_a_3(������������?a_hd_aha_hd_a_1(�=a_hd_a��a_hd_a_1�T���PInfo���	VMR��VMC����	�e���T��(������i������
 (0t|���������������
	exprlocal_const��	9m	��	=?Fexprhas_decidable_eq	CEF	Gc	��	P]��
b
k��r
���������������decl~compact_decl_aux�����PInfo�ε	VMR��VMC���	��decl~compact_decl_main�����T��������a_hd(a_tl�T����#��
��RecFn��,�����Ua_hd_aha_hd_a_1�����S��a_hd_aha_hd_a_1ha_hd_a_2(���S\a_hd_aha_hd_a_1ha_hd_a_2��a_hd_a_3(����t(~compact_decl_aux�����a_hd_a(a_hd_a_1(�[a_hd_aha_hd_a_1��a_hd_a_2(a_hd_a_3(���S���za_hd_aha_hd_a_1(�xa_hd_a��a_hd_a_1�T�[�PInfo�п	VMR��VMC��P�	�e���T����

6;@EJ��N��N��N��N����	%/	��4	
N��N��N��N��N��decl~compact_decl�����PInfo��	VMR��VMC���	��decl~clean_idsii��
Strid���
Strid_rhs���
Strid_delta���
Strhidden���PInfo���	VMR��VMC����	�d�i������s�h�r�_�d�i����������a�t�l�e�d�_�d�i������������n�e�d�d�i�h���������decl~cleanq�J���J�tgt(�+�f�f
Quote_x_1���_x_2���
,TyE�t�y,e(tacticexact�replacee(n#_a(����(��a#����(��������ha_1������ha_1ha_2(����ha_1ha_2��a_3(����(a_1(����(��,����a_aha_a_1����a_aha_a_1ha_a_2(��a_aha_a_1ha_a_2��a_a_3(��a_a(a_a_1(���	(��,�	#���	����a_a_aha_a_a_1������has_memmemhi��has_memh,~clean_ids��decidable_memh�)h�*h��,������(����a_a_aha_a_a_1ha_a_a_2(��a_a_aha_a_a_1ha_a_a_2��a_a_a_3(��a_a_a(a_a_a_1(��a_a_aha_a_a_1��a_a_a_2(���a_a_aha_a_a_1(�a_a_a��a_a_a_1�T��a_aha_a_1��a_a_2(a_a_3(���%(���%#������#����������������%����a_a_3_aha_a_3_a_1����a_a_3_aha_a_3_a_1ha_a_3_a_2(��a_a_3_aha_a_3_a_1ha_a_3_a_2��a_a_3_a_3(��a_a_3_a(a_a_3_a_1(��a_a_3_aha_a_3_a_1��a_a_3_a_2(�,�6a_a_3_aha_a_3_a_1(�4a_a_3_a��a_a_3_a_1�T��a_aha_a_1��a_a_2(��a_aha_a_1(�Da_a��a_a_1�T����ha_1��a_2(���S��ha_1(�Q����a_1�T��,�$�PInfo���	VMR��_rec_3VMR��_rec_4VMR��_rec_2VMR��_rec_1VMR��_lambda_1VMR��VMC�C)�	n(�_fresh
� (��
 #&�����decidable_mem_main	VMC�D'�	�H(�K(��
!$�3	
VMC�E$�	�H(�_fresh
� 
(��
!�C�DVMC�F"�	�H(��
�EVMC�G���#��(�FVMC��)�	����J�N	#���������������	�Gexprreplacetacticexact!doc��Remove identity functions from a term. These are normally
automatically generated with terms like `show t, from p` or
`(p : t)` which translate to some variant on `@id t p` in
order to retain the type.decl~source_fieldsmissingie
g�
�Vi�W
�k)�j}to_expr''e(�o��t(	struct_nh�dconst_name'�get_app_fn'"g�h�j}expanded_field_listfields�~	exp_fields�~listfilter�}x�}���csndhh��a�}��������mmap �}�i_x�}_a�}�	hh�h�}�ifsth�kh�����ifunctioncomp(
�i�h
�s}mk_mappnameupdate_prefix,���������������$�PInfo�U�	VMR�U_lambda_1VMR�U_lambda_2VMR�U_lambda_3VMR�U_lambda_4VMR�UVMC�o�	�e�}�_fresh
�+}i
��MVMC�p�	�VMC�q ��e�g�}�_fresh
�+�(nameupdate_prefix_maintacticmk_mapp	����VMC�r�	��_fresh
�+�h�x(�ui�Wexpanded_field_list	�o��filter_main�`�~�q��plistmmap_mainVMC�U&�	��W
�Vitacticto_expr	 ��	
��get_app_fn_main��const_name�[h�rdecl~collect_struct'_main��
state_tg��structure_instance_info
��
������state_tmonad�� 5��
���������������pexprget_structure_instance_info_p��_a��:������������exprtraverse����

��RecFn�����������(
#��has_monad_lift_t_trans����has_monad_lift�� has_monad_lift_t_refl(�Zv(��punit
modify������state_tmonad_state�� �������,_x���
�s,�PInfo���	VMR��_lambda_1VMR��_lambda_2VMR��_lambda_3VMR��_lambda_4VMR��_lambda_5VMR��_lambda_6VMR��_lambda_7VMR��_lambda_8VMR��_lambda_9VMR��VMC���	αVMC���	�s��xfβ��α��		VMC���	�������xβ��α��		VMC���	ss��aα��VMC��&�	�����xfβ��α��	 		


VMC��8�	�����ba��	functionconst		2		 +

0
VMC���	aVMC��5�	�����ba��	��		/		(

-
VMC��&�	������_fresh
�9U����	
	 ����VMC���	�������
pexprget_structure_instance_info	����������������exprtraverse��decl~collect_struct'�����PInfo���	VMR��VMC���	��decl~collect_structe
�p����
�6���5�5prodmap

����id
�����run��
~collect_struct'����PInfo���	VMR��_lambda_1VMR��VMC���	��
VMC���	s��
��	����prodmap_maindecl~refine_onestr���������R)���
tgt(	struct_nh�|�����exp_fields�~	missing_f�~��f�}���structure_instance_infofield_names���e�}notdecidable�[���Z"��g
����g�j�g���j�j�glistunziph
listjoin�i��
�j~source_fields��map�}h����sources��_p�g_a�g�	i�f���g�R�ii�k�f�T	provided�~��f�}���Y���e�}������	missing_f'�~��x�}���\�e�}�_����\���U��}mk_mvar_list��length�}vs�T"�o�fg������g�5���p
���x�5~collect_struct��field_values� _p��_a���	�f�������R�i�f�k���T�U�ppexprmk_structure_instancestructure_instance_infomk��h
��i��h���Y�~�������f��
��,�{(
�s����
''e'(������$_x"g�T��}with_enable_tags��mzip_with���}(�Tn�}v(��T�Y����_x�����}_x�}_a�}����}h�ih�khh��� �ns�����h����_x���5~apply_auto_param�5~apply_opt_param}set_main_tag��
Str_field����\��cfsthh\�_x�����'gs�����Y�t(_x�����t�����PInfo���	VMR��_lambda_1VMR��_lambda_2VMR��_lambda_3VMR��_lambda_4VMR��_lambda_5VMR��_lambda_6VMR��_lambda_7VMR��_lambda_8VMR��_lambda_9VMR��_lambda_10VMR��_lambda_11VMR��_lambda_12VMR��_lambda_13VMR��_lambda_14VMR��_lambda_15VMR��_lambda_16VMR��_lambda_17VMR��VMC��	�e�}�_fresh
�\���

��M	
VMC��	�VMC��	c�}
VMC��	�e�}�"��

��MVMC��	�e�}�_fresh
�\�i
��M		VMC��	��tf�!���"��	VMC��	���'����		VMC��	��a�"��VMC��	�xf��			VMC�*�	�ba��	��	$	"	VMC��	��VMC�'�	�ba��		�	!		VMC���5��}�{VMC�r���(��}�_fresh
�\��~�Z	l����map_main��	&e�d�l�e�i�f�_���������

Fset_main_tag�apply_opt_param���apply_auto_param��	Z^	�c	
jVMC���	��_fresh
�\��~�:�~�_fresh
�\��f�&i�_fresh
�\�h�"����length_main�Wmk_mvar_list_main	�
������		��unzip_main
	
	 �	
��<
���������<����pexprmk_structure_instance��	E�
�T	J{��������mzip_with_mainFwith_enable_tags	`t��join_main�Z	fm�Ury��
�	
	VMC�C�	��_fresh
�\��~�_fresh
�\��~�Hh�"��
��<�U����	�U�N 	!=���
���~������~
�VMC��	��Hh�"����	������~�VMC���	������N	������h�decl~refine_recursively_main�����T�����
�������	^a_fst(a_snd���	^���Y��,��_x"���T~refine_one,rs���U�T��gs�T���T�����T
�	_RecFn�],gs'�����T���	3,�PInfo�]�	VMR�]_lambda_1VMR�]VMC�e�	�VMC�]@�	�e�����Z	9��	2�	+	�]��e��	$
�U��)
0	
7>decl~refine_recursively�	_�]�PInfo�f�	VMR�fVMC�f�	�]decl~refine_struct���J���J"�5��_p�5_a�5�	
���i�5�i
�k�����,_x��gs�T���	r~refine_recursively��xs'���Y�	y�PInfo�g�#	VMR�g_lambda_1VMR�gVMC�n�#	�VMC�g>�#	����J��	8�s	1�	*	�f��n��	#
�U���Z(
/	
6doc�g`refine_struct { .. }` acts like `refine` but works only with structure instance
literals. It creates a goal for each missing field and tags it with the name of the
field so that `have_field` can be used to generically refer to the field currently
being refined.

As an example, we can use `refine_struct` to automate the construction semigroup
instances:
```lean
refine_struct ( { .. } : semigroup α ),
-- case semigroup, mul
-- α : Type u,
-- ⊢ α → α → α

-- case semigroup, mul_assoc
-- α : Type u,
-- ⊢ ∀ (a b c : α), a * b * c = a * (b * c)
```decl~guard_hyp'n	hop�$�p�	��q�	��)(�	��,��}instantiate_mvarsh(~guard_expr_eq,�PInfo�o�/	VMR�oVMC�o&�/	��q�	��p�	��		��	tacticinstantiate_mvars	 �guard_expr_eqdoc�o`guard_hyp h := t` fails if the hypothesis `h` does not have type `t`.
We use this tactic for writing tests.
Fixes `guard_hyp` by instantiating meta variablesdecl~guard_expr_strictt(�	��y(p�	���se(���������PInfo�x�7	VMR�xVMC�x�7	��z�	��y(��	��	
�Ddoc�x`guard_expr_strict t := e` fails if the expr `t` is not equal to `e`. By contrast
to `guard_expr`, this tests strict (syntactic) equality.
We use this tactic for writing tests.decl~guard_target_strictp�J�}�J�t(~guard_expr_strict,�PInfo�|�>	VMR�|VMC�|�>	��}�J�N		�xdoc�|`guard_target_strict t` fails if the target of the main goal is not syntactically `t`.
We use this tactic for writing tests.decl~guard_hyp_strict�	�n�	�p�	��	�h(�	��PInfo���G	VMR��VMC��&�G	����	����	��		��	�v	 �xdoc��`guard_hyp_strict h := t` fails if the hypothesis `h` does not have type syntactically equal
to `t`.
We use this tactic for writing tests.decl~guard_hyp_numsn#��#��k�T�5���,��(��,�	��>�mformathas_to_format���mformathas_append�	�to_fmtFJ
Str�	�#nathas_to_format�	��	�
Str hypotheses found�PInfo���J	VMR��_lambda_1VMR��VMC���J	�e�_fresh����T�_fresh���#�J�3	�DVMC����J	���#��	z �_c_1h�_c_2o�_c_3e�_c_4s�_c_5d�n�u�f�t�p�y��������������������to_fmt�J��������formatcompose����������decl~guard_tagstagsj�ip
Quoteh����
"Ftag}get_main_tag_p�
_a�
���i����decidable_eqh�����PInfo���N	VMR��VMC���N	����
Fget_main_tag	���	�Ddecl~success_if_fail_with_msgtacmsgF���
tacticsuccess_if_fail_with_msg
�PInfo���T	VMR��VMC���T	���Wsuccess_if_fail_with_msgdoc��`success_if_fail_with_msg { tac } msg` succeeds if the interactive tactic `tac` fails with
   error message `msg` (for test writing purposes).decl~get_current_fieldh�
%�
h�

_p�
_a�
��h���
�
%�
&
��h��Annot��hdhtli�
)��i�
%�
1tl_hdhtl_tli�
)��i�
%�
1tl_tl_hdhtl_tl_tli�
)��i�
%�
&����h�w
}resolve_name��\,tl_tl_tl_hdhtl_tl_tl_tli�
1�PInfo���W	VMR��_lambda_1VMR��_rec_4VMR��_rec_3VMR��_rec_2VMR��_rec_1VMR��VMC���W	�VMC���W	�eni�_fresh
�֍h�_fresh
�օh���{tacticresolve_name	��������VMC���W	�e��i�_fresh
�ցh��
��������VMC���W	�e��i��
��������VMC���W	�e��i��
��������VMC���W	���	��decl~fieldn�	����	�tac��gs�T"g�
��(�
}get_tagts�
["�og���
�
e���
glistpartition�
dx�
d������h��(�
�������e�
doptiondecidable_eqh���
s�
ulistzip(�
,_p�
g_a�
g�	�
e�
e���
g�i�
e�k�
e���
d�i�
e,��fst_hd�
dfst_tl�
e�
����
e��Y���	(�
,��_x���_x�~done_x�Y�{�
d(�
���fst_tl_hd�
dfst_tl_tl�
e���PInfo���[	VMR��_lambda_1VMR��_lambda_2VMR��_lambda_3VMR��VMC���[	�VMC���[	�e�
d�_fresh���	�
�����_mainVMC���[	�#�
d
VMC��k�[	������	��	etacticget_tag�����	^��zip����partition_main��%������\
��'S	
�Z	.M	2F�done	6?���<�ZDK
R
[������cdecl~have_field~propagate_tags@(!�	��(~get_current_field}mk_const}note�
Strfield����	�PInfo���s	VMR��_lambda_1VMR��VMC��B�s	���	Fmk_const
	1�d�l�e�i�f��������Fnote6	7<VMC���s	���propagate_tagsdoc��`have_field`, used after `refine_struct _` poses `field` as a local constant
with the type of the field of the current goal:

```lean
refine_struct ({ .. } : semigroup α),
{ have_field, ... },
{ have_field, ... },
```
behaves like
```lean
refine_struct ({ .. } : semigroup α),
{ have field := @semigroup.mul, ... },
{ have field := @semigroup.mul_assoc, ... },
```decl~apply_field�
��
�
�ch��,�PInfo���{	VMR��_lambda_1VMR��VMC���{	���	��VMC���{	����doc��`apply_field` functions as `have_field, apply field, clear field`decl~apply_ruleshs	�f��fk

Quote
�pexpr_list_or_texprn�y�}���}�����
����
�tacticapply_rules,�PInfo����	VMR��VMC����	���y
CNatM50���
��Wapply_rulesdoc��`apply_rules hs n`: apply the list of rules `hs` (given as pexpr) and `assumption` on the
first goal and the resulting subgoals, iteratively, at most `n` times.
`n` is 50 by default. `hs` can contain user attributes: in this case all theorems with this
attribute are added to the list of rules.

example, with or without user attribute:
```lean
@[user_attribute]
meta def mono_rules : user_attribute :=
{ name := `mono_rules,
  descr := "lemmas usable to prove monotonicity" }

attribute [mono_rules] add_le_add mul_le_mul_of_nonneg_right

lemma my_test {a b c d e : real} (h1 : a ≤ b) (h2 : c ≤ d) (h3 : 0 ≤ e) :
a + c * e + a + c + 0 ≤ b + d * e + b + d + e :=
by apply_rules mono_rules
-- any of the following lines would also work:
-- add_le_add (add_le_add (add_le_add (add_le_add h1 (mul_le_mul_of_nonneg_right h2 h3)) h1 ) h2) h3
-- by apply_rules [add_le_add, mul_le_mul_of_nonneg_right]
-- by apply_rules [mono_rules]
```decl~return_castf��t��esg����e(x(x'(eq_h(�o���
���������
��(�(�(�(�
��4�
���
����exprhas_var\�,�'_x�}unify\���$
_x"���
�}mk_meta_univu��)�
��4(�\��(�_����b����Vopt_to_tac(���������\(���_(���B(exprsort'���$f(����t'(���
����	_p��_a�������
�����
�����
�����\����
������	������ ��������
�val_fst(val_snd(�������s(}is_def_eq,�$
_x��
����$
_x�A�C���K���H�I�������A�C�����PInfo����	VMR��_lambda_1VMR��_lambda_2VMR��VMC����	��_fresh�2�(�_fresh�2�(�_fresh�2�(�_fresh�2�(�_fresh�2��
��_fresh�2����_fresh�2���exprhas_var�B				
�D	�	tacticunify	�tacticmk_meta_univ	!�
exprsort�d�i������}�Vreturnopt��	>���	B�	DS���	Yatacticis_def_eqf	g��5	n~�����
�
	
VMC���	���+�
��.��VMC����	�(�(�(�(��
�����������decl~list_cast_of_auxx(t��es�
���(�
��>(�?���@�
���(����(�
���#��A�C\��������a_aha_a_1����A�C��\a_aha_a_1ha_a_2(���a_aha_a_1ha_a_2��a_a_3(��A�C����a_a(a_a_1(���J(�
�,�J#���J����a_a_aha_a_a_1����a_a_aha_a_a_1ha_a_a_2(��A�C���a_a_aha_a_a_1ha_a_a_2��a_a_a_3(��A�C���a_a_a(a_a_a_1(���U(�
�,�U#���U����a_a_a_aha_a_a_a_1����a_a_a_aha_a_a_a_1ha_a_a_a_2(��A�C����a_a_a_aha_a_a_a_1ha_a_a_a_2��a_a_a_a_3(��A�C�	��a_a_a_a(a_a_a_a_1(���`(�
�,�`#���`����a_a_a_a_aha_a_a_a_a_1����a_a_a_a_aha_a_a_a_a_1ha_a_a_a_a_2(��A�C� �	a_a_a_a_aha_a_a_a_a_1ha_a_a_a_a_2��a_a_a_a_a_3(��A�C�k� a_a_a_a_a(a_a_a_a_a_1(���k(�
�,�k#���k����a_a_a_a_a_aha_a_a_a_a_a_1�������
Strcast�����
��~return_cast���k� exprapp'�!�!�!exprconst'��������������������
Strmp�����6�
����!�!�!�!�#�6�������������������
Strmpr�����N�
���}mk_eq_symm����!�!�!�!�#�N�������������a_a_a_a_a_aha_a_a_a_a_a_1ha_a_a_a_a_a_2(��A�C���ka_a_a_a_a_aha_a_a_a_a_a_1ha_a_a_a_a_a_2��a_a_a_a_a_a_3(��A�C��a_a_a_a_a_a(a_a_a_a_a_a_1(���|(�
�,�|#�p�|���pa_a_a_a_a_a_aha_a_a_a_a_a_a_1���ya_a_a_a_a_a_aha_a_a_a_a_a_a_1ha_a_a_a_a_a_a_2(��A�C���ua_a_a_a_a_a_aha_a_a_a_a_a_a_1ha_a_a_a_a_a_a_2��a_a_a_a_a_a_a_3(��A�C�o��a_a_a_a_a_a_a(a_a_a_a_a_a_a_1(����(�
�,��#��������a_a_a_a_a_a_a_aha_a_a_a_a_a_a_a_1�������
Strsubst�������
����.���o���!�!�!�!�!�!�#�����������	�k�k�	�����
Strsubstr�������
����T�	���!�!�!�!�!�!�#�����������	�k���k�����
Strrec�������
����.���o���!�!�!�!�!�!�#�����������	�k�����k�����
Strrec_on�����
�
�����!�!�!�!�!�!�#�
���������	�k���k�	��a_a_a_a_a_a_a_aha_a_a_a_a_a_a_a_1ha_a_a_a_a_a_a_a_2(��A�C���oa_a_a_a_a_a_a_aha_a_a_a_a_a_a_a_1ha_a_a_a_a_a_a_a_2��a_a_a_a_a_a_a_a_3(��A�C��a_a_a_a_a_a_a_a(a_a_a_a_a_a_a_a_1(��a_a_a_a_a_a_a_aha_a_a_a_a_a_a_a_1��a_a_a_a_a_a_a_a_2(�
0�
:a_a_a_a_a_a_a_aha_a_a_a_a_a_a_a_1(�
8a_a_a_a_a_a_a_a��a_a_a_a_a_a_a_a_1�T��a_a_a_a_a_a_aha_a_a_a_a_a_a_1��a_a_a_a_a_a_a_2(���
Ha_a_a_a_a_a_aha_a_a_a_a_a_a_1(�
Fa_a_a_a_a_a_a��a_a_a_a_a_a_a_1�T�ya_a_a_a_a_aha_a_a_a_a_a_1��a_a_a_a_a_a_2(�z�
Va_a_a_a_a_aha_a_a_a_a_a_1(�
Ta_a_a_a_a_a��a_a_a_a_a_a_1�T�a_a_a_a_aha_a_a_a_a_1��a_a_a_a_a_2(��
da_a_a_a_aha_a_a_a_a_1(�
ba_a_a_a_a��a_a_a_a_a_1�T��a_a_a_aha_a_a_a_1��a_a_a_a_2(���
ra_a_a_aha_a_a_a_1(�
pa_a_a_a��a_a_a_a_1�T��a_a_aha_a_a_1��a_a_a_2(���
�a_a_aha_a_a_1(�
~a_a_a��a_a_a_1�T��a_aha_a_1��a_a_2(���
�a_aha_a_1(�
�a_a��a_a_1�T���PInfo�=��	VMR�=VMC�=����	�e��(�@�
��?���>(��
	%����������
'.5<CJ�t�{����������������
LSZaho�W�^�e�l�r�r�r�r�r	��
qx����:�A�H�O�U�U�U�U�U��
�����������$�+�2�8�8�t�s�a�c�������
�	��u�q�e�����p�m�����
�	��C�q�e�����r�p�m������
�	���Btacticmk_eq_symm	��=
�q�e�����r�p�m������exprconstexprapp���������B�t
�q�e�����p�m�������������������
�t�s�a�c��������������������8�8�8
��
�����������������������
�������������������������q�e�����t�s�b�u�s���������	����q�e�����r�t�s�b�u�s����������	�D�*�q�e�����c�e�r�������	�e���q�e�����n�o�_�c�e�r����������	������e�_c_1
�q�����n�o�_�c�r��������������������������)e�_c_2

�q�����c�r��������������������������	�.�}s�_c_3
�q�e�����r�t�b�u�����������������������������s�_c_4
�q�e�����t�b�u�������������������������������������������8�8�8�8�U�U�U�U�r�r�r�r��������decl~list_cast_ofx(tgt(�
���(��(�
����
��
����
��
��
���
������
�exprmfold�
� �C����
�e(i#es�
�~list_cast_of_aux���	���
��
����PInfo����	VMR��_lambda_1VMR��_lambda_2VMR��VMC����	�VMC����4���
���#��(�_fresh�M(

�=VMC����	����(��(�������mfold	
��prvh_generalize_arg_p_aux�`��,�Ch_generalize_arg_p_auxdecl���s��
��a_a��a_a_1����a_a_a��a_a_a_1����a_a_a_a��a_a_a_a_1����a_a_a_a_1_hd��a_a_a_a_1_tl����a_a_a_a_1_hd_aha_a_a_a_1_hd_a_1�������
Strheq����
��r�%���-�2�5�9�9�=�@�M�M�Q�T�[�[�_�b�PInfo����VMR��VMC���_���ey��
��
C����G�[�����r�_c_1e�_c_2o� �s�a�p������������������r�_c_3e�_c_4o� �s�a�p������������������r�_c_5e�_c_6o� �s�a�p������������������r�_c_7e�_c_8o� �s�a�p������������������r�_c_9e�_c_10o� �s�a�p��������������������
�I������M���
V�
��
��r�_c_11e�_c_12o� �s�a�p�������������������Yr�_c_13e�_c_14o� �s�a�p�������������������Yr�_c_15e�_c_16o� �s�a�p�������������������Yr�_c_17e�_c_18o� �s�a�p�������������������Yr�_c_19e�	_c_20o�	 �	s�a�p�������������������Y��
������S������W����r�_c_21e�_c_22o� �s�a�p�������������������
Tr�_c_23e�_c_24o� �s�a�p�������������������
Tr�_c_25e�	_c_26o�	 �	s�a�p�������������������
Tr�	_c_27e�
_c_28	o�		
 �
s�	a�p�������������������
Tr�
_c_29e�_c_30
o�

 �s�
a�p�������������������
Tr�_c_31e�	_c_32o�	 �	s�a�p�������������������
Tr�
_c_33e�_c_34
o�

 �s�
a�p�������������������
Tr�
�e��
o�

 �s�
a�p�������������������
Tr�
_c_35e�_c_36
o�

 �s�
a�p�������������������
T�����r�_c_37e�	_c_38o�	 �	s�a�p�������������������
S��
��_�������	�	O�	��	��
r�_c_39e�_c_40o� �s�a�p�������������������
Rr�_c_41e�_c_42o� �s�a�p�������������������
R�q�e�h������
�	����r�_c_43e�
_c_44o�
 �
s�a�p��������������������	�����J��
���;�|������F�����	r�
_c_45e�_c_46
o�

 �s�
a�p�������������������Ir�
_c_47e�_c_48
o�

 �s�
a�p�������������������Ir�_c_49e�_c_50o� �s�a�p�������������������Ir�_c_51e�_c_52o� �s�a�p�������������������I�Ir�_c_53e�_c_54o� �s�a�p�������������������Ir�_c_55e�_c_56o� �s�a�p�������������������Ir��!e��"o� �s�a�p�������������������Ir�_c_57e�_c_58o� �s�a�p�������������������Ir�_c_59e�_c_60o� �s�a�p��������������������r�_c_61e�_c_62o� �s�a�p�������������������
Rr�
_c_63e�_c_64
o�

 �s�
a�p�������������������
Rr�_c_65e�_c_66o� �s�a�p�������������������
Rr�_c_67e�
_c_68o�
 �
s�a�p�������������������
Rr�_c_69e�_c_70o� �s�a�p�������������������
Rr��/e��0o� �s�a�p�������������������
Rr�_c_71e�_c_72o� �s�a�p�������������������
Rr�_c_73e�
_c_74o�
 �
s�a�p�������������������Yr�_c_75e�	_c_76o�	 �	s�a�p�������������������Yr��5e�	�6o�	 �	s�a�p�������������������Yr�_c_77e�	_c_78o�	 �	s�a�p�������������������Yr�_c_79e�_c_80o� �s�a�p������������������r�_c_81e�_c_82o� �s�a�p������������������r��;e��<o� �s�a�p������������������r�_c_83e�_c_84o� �s�a�p������������������r�_c_85e�_c_86o� �s�a�p������������������prvh_generalize_arg_p�`����h_generalize_arg_pdecl�C�r�y�e�h
Strexpr == id�s���PInfo�C��VMR�C_lambda_1VMR�CVMC�D���y�5		��VMC�C8���Dd�i� �=�=� �r�p�x�e�������������7��decl~h_generalizerev�8��7�:
Quote�D�
Str!h�������
Quoteh���ident__x��arg����q��
Quote

Quoteh�Ceqs_hj�ip
Quoteh�/w�1w|iAiw�k�
Strwith��w��w�hi��g�g��glistmonadh��i��F�
��G��I���J�
�K�3_a�
,�N�
�	�h�9�i
�kh	h'����������8��@��C�
Str_��
{���H���	���
�4h�\���
%�_���
%�b���
%� h���]�xh�
Str_x��`�b�c�bstring_to_name��Fstringhas_append��nameto_string,��h'h��p\''e(�tgt("�
�~list_cast_of,_p�
�_a�
����
��Z�
��@
Strno cast found���
����
��
�����
�,hd_fst(hd_snd����\��hd_snd_fst(hd_snd_snd(����8���E����
Quoteh���@���C�	�i��s\�k_x��� asm(���uv(�V���
�(_x�
�_a�
����c�
���i(�k���}mk_app���	e�������$�hs�T���_x�_a���(�g��ih�k(�
���'h,�G�%h��,�G�
%��h,��hhfunctormap_const��(�i�
������
�h(�����_x��(h(�}assert��h'(������$_x��}rewrite_target,tacticrewrite_cfgmk�#�'�'''''
occurrencesall_x����,_x�when ��\h�'�'�
��	���p�f�f
Quote_x_1��`_x_2��aheq_of_eq_rec_left,�s���s��''�p�f�f
Quote_x_1��e_x_2��fheq_of_eq_mp,�(�+''�
��o�����i_x�����_x���]�'�N'}interactiverevert��,�PInfo�E��	VMR�E_lambda_1VMR�E_lambda_2VMR�E_lambda_3VMR�E_lambda_4VMR�E_lambda_5VMR�E_rec_1VMR�E_lambda_6VMR�EVMC����	�VMC�����e�b�
��_fresh��(�q�e�����tacticmk_appVMC��?���e�f��_fresh��(�_�����	
		!�h�����p$	%8��	,16	=VMC��<��
��l(�_fresh��(�h����Fassert	6�T	/�qrewrite_target�	#(��-	4VMC��>��	���(��(�_fresh��h���������7���������������%��������	%-��2	38VMC�����	�e���
��_fresh�Rh�_fresh�Jh�_fresh�G�3�_fresh�D��_fresh�C�
���On�_c_1o�_c_2 �	_c_3d�u�f�	t�s�a�c�	�����������������
	�����y	`��	d��	h��������	t�	��������	��������	�������B���when	����	���revert���B�������������
VMC��I��	��_fresh�����_fresh��h�_fresh��
�_fresh���3�_fresh����_fresh���
��nameto_stringh���stringappend��p�:��	C��	<
�N	5	��	$.
��3
:
A	
	VMC�E ��	�e�K�3�J�
�I���G��F�
��_�������		�O��	��doc�E`h_generalize Hx : e == x` matches on `cast _ e` in the goal and replaces it with
`x`. It also adds `Hx : e == x` as an assumption. If `cast _ e` appears multiple
times (not necessarily with the same proof), they are all replaced by `x`. `cast`
`eq.mp`, `eq.mpr`, `eq.subst`, `eq.substr`, `eq.rec` and `eq.rec_on` are all treated
as casts.

`h_generalize Hx : e == x with h` adds hypothesis `α = β` with `e : α, x : β`.

`h_generalize Hx : e == x with _` chooses automatically chooses the name of
assumption `α = β`.

`h_generalize! Hx : e == x` reverts `Hx`.

when `Hx` is omitted, assumption `Hx : e == x` is not added.decl~choosefirst�	�namesj�ip
Quoteh�tgt����
Quote
�	��R����	����������_a���M���������/�
��+tgt(�tacticchoose���_x��}interactivesimp��'��simp_arg_type}simp_arg_typeexpr
Quoteexists_prop�����	��g��g�(h����\�simp_config_extmk�'
''''''
'
''��_x��	�PInfo����	VMR��_lambda_1VMR��VMC����	�hVMC��l��	������������	�	�s�i�h�t��������!�	"f�Wchoose_main	)_��4���<���*simp�	PX	���]	
ddoc�� `choose a b h using hyp` takes an hypothesis `hyp` of the form
`∀ (x : X) (y : Y), ∃ (a : A) (b : B), P x y a b` for some `P : X → Y → A → B → Prop` and outputs
into context a function `a : X → Y → A`, `b : X → Y → B` and a proposition `h` stating
`∀ (x : X) (y : Y), P x y (a x y) (b x y)`. It presumably also works with dependent versions.

Example:

```lean
example (h : ∀n m : ℕ, ∃i j, m = n + i ∨ m + j = n) : true :=
begin
  choose i j h using h,
  guard_hyp i := ℕ → ℕ → ℕ,
  guard_hyp j := ℕ → ℕ → ℕ,
  guard_hyp h := ∀ (n m : ℕ), m = n + i n m ∨ m + j n m = n,
  trivial
end
```decl~field_simpno_dflt	���boolhas_reflect�only_flaghs	g�����k�������has_reflect
Quote��}simp_arg_listattr_namesj�ip
Quoteh�with_ident_listlocat�cfg�x}simp_config_ext�������������������	attr_namesi��
Strfield_simps���	hs����}simp_arg_typeexcept�
Strone_div_eq_inv����
�~simp_core��to_simp_config����discharger����,\�PInfo���3	VMR��_lambda_1VMR��VMC���3	�e�_fresh���
VMC����3	������������������s�p�m�i�s�_�d�l�e�i�f����������������i�v�n�i�_�q�e�_�v�i�d�_�e�n�o�����������������������
�*simp_core��doc��The goal of `field_simp` is to reduce an expression in a field to an expression of the form `n / d`
where neither `n` nor `d` contains any division symbol, just using the simplifier (with a carefully
crafted simpset named `field_simps`) to reduce the number of division symbols whenever possible by
iterating the following steps:

- write an inverse as a division
- in any product, move the division to the right
- if there are several divisions in a product, group them together at the end and write them as a
  single division
- reduce a sum to a common denominator

If the goal is an equality, this simpset will also clear the denominators, so that the proof
can normally be concluded by an application of `ring` or `ring_exp`.

`field_simp [hx, hy]` is a short form for `simp [-one_div_eq_inv, hx, hy] with field_simps`

Note that this naive algorithm will not try to detect common factors in denominators to reduce the
complexity of the resulting expression. Instead, it relies on the ability of `ring` to handle
complicated expressions in the next step.

As always with the simplifier, reduction steps will only be applied if the preconditions of the
lemmas can be checked. This means that proofs that denominators are nonzero should be included. The
fact that a product is nonzero when all factors are, and that a power of a nonzero number is
nonzero, are included in the simpset, but more complicated assertions (especially dealing with sums)
should be given explicitly. If your expression is not completely reduced by the simplifier
invocation, check the denominators of the resulting expression and provide proofs that they are
nonzero to enable further progress.

The invocation of `field_simp` removes the lemma `one_div_eq_inv` (which is marked as a simp lemma
in core) from the simpset, as this lemma works against the algorithm explained above.

For example,
```lean
example (a b c d x y : ℂ) (hx : x ≠ 0) (hy : y ≠ 0) :
  a + b / x + c / x^2 + d / x^3 = a + x⁻¹ * (y * b / y + (d / x + c) / x) :=
begin
  field_simp [hx, hy],
  ring
end
```decl~guard_expr_eq'�	�t(p�	��	�e(�Y���$
�PInfo���9	VMR��VMC���9	����	���(��	�<decl~guard_target'�	�p�J�t(~guard_expr_eq',�PInfo���@	VMR��VMC���@	����J�N		��doc��`guard_target t` fails if the target of the main goal is not `t`.
We use this tactic for writing tests.decl~triv�5tactictriv'�5��5tacticcontradiction�@
Strtriv tactic failed
�PInfo���F	VMR��VMC��m�F	d�e�l�i�a�f� �c�i�t�c�a�t� �v�i�r�t�����������������������tacticcontradiction������Wtriv'��doc��a weaker version of `trivial` that tries to solve the goal by reflexivity or by reducing it to true,
unfolding only `reducible` constants.decl~usel�
���f�
�
Quote
�
���J�v
Fandthen_seqtacticuse��5~triv�_p(_a(���(��#����������ha_1������ha_1ha_2(����ha_1ha_2��a_3(����(a_1(����(,�Z�\a_aha_a_1����a_aha_a_1ha_a_2(��a_aha_a_1ha_a_2��a_a_3(��a_a(a_a_1(���(,�#�������a_a_aha_a_a_1�������
StrExists�����@�!)��p
Quote
��fieldNmpr''e(�����a_a_aha_a_a_1ha_a_a_2(��a_a_aha_a_a_1ha_a_a_2��a_a_a_3(��a_a_a(a_a_a_1(��a_a_aha_a_a_1��a_a_a_2(����a_a_aha_a_a_1(��a_a_a��a_a_a_1�T��a_aha_a_1��a_a_2(�v��a_aha_a_1(��a_a��a_a_1�T����ha_1��a_2(�e����ha_1(������a_1�T���PInfo��o	VMR�_lambda_1VMR�_rec_3VMR�_rec_2VMR�_rec_1VMR�_lambda_2VMR�VMC�@�o	�VMC�A��o	�e�H(��
enw�������@�����@���s�t�s�i�x�E����������	8@���@��c����	FS�|X	Y^��c���@�����@�����@�����@�����@�����@�����@��VMC�BX�o	�e�H(��
&/4=FO���@�����@�����@�����@�����@���A���@�����@�����@�����@��VMC�CX�o	�e�H(��
&/4=FO���@�����@�����@�����@�����@���B���@�����@�����@�����@��VMC�D�o	��N	�CVMC�
�o	��J�D������WuseFseq�1doc�Similar to `existsi`. `use x` will instantiate the first term of an `∃` or `Σ` goal with `x`.
It will then try to close the new goal using `triv`, or try to simplify it by applying `exists_prop`.
Unlike `existsi`, `x` is elaborated with respect to the expected type.
`use` will alternatively take a list of terms `[x0, ..., xn]`.

`use` will work with constructors of arbitrary inductive types.

Examples:

example (α : Type) : ∃ S : set α, S = S :=
by use ∅

example : ∃ x : ℤ, x = x :=
by use 42

example : ∃ n > 0, n = n :=
begin
  use 1,
  -- goal is now 1 > 0 ∧ 1 = 1, whereas it would be ∃ (H : 1 > 0), 1 = 1 after existsi 1.
  exact ⟨zero_lt_one, rfl⟩,
end

example : ∃ a b c : ℤ, a + b + c = 6 :=
by use [1, 2, 3]

example : ∃ p : ℤ × ℤ, p.1 = 1 :=
by use ⟨1, 42⟩

example : Σ x y : ℤ, (ℤ × ℤ) × ℤ :=
by use [1, 2, 3, 4, 5]

inductive foo
| mk : ℕ → bool × ℕ → ℕ → foo

example : foo :=
by use [100, tt, 4, 3]decl~clear_aux_decltacticclear_aux_decl�PInfo�G�~	VMR�GVMC�G�~	�Wclear_aux_decldoc�G`clear_aux_decl` clears every `aux_decl` in the local context for the current goal.
This includes the induction hypothesis when using the equation compiler and
`_let_match` and `_fun_match`.

It is useful when using a tactic such as `finish`, `simp *` or `subst` that may use these
auxiliary declarations, and produce an error saying the recursion is not well founded.decl~locget_local_pp_names���i����cases_on����������Ti��h������g������ilistreduce_optionh�PInfo�L��	nspace�KVMR�LVMC�L��	�e���	��	���<listreduce_optiondecl~locget_local_uniq_namesl����T�������exprlocal_uniq_name���PInfo�S��	VMR�SVMC�S��	���T��v	
��local_uniq_name�<decl~change'q�J������
Quote
�	�������Y�J������
Quote
�����M���,������@
Strchange-at does not support multiple locations�������������a_hd��a_tl��:h�Z��,��[���}i_to_expr��e(}change_core��a_tl_hd��a_tl_tl����Zh�%,��'��eq(��	�eh(�*,���2a_1
"i~locget_local_pp_names,l'i��eh�}change_with_at����_x����\�'�Y'~change���\
��E��
Quote
�	��
alternativeto_applicativew|
���_
�q�B
���	�PInfo�X��	VMR�X_lambda_1VMR�X_lambda_2VMR�XVMC�m��	�VMC�n���gh�_fresh�9�
�_fresh�9��J�Wchange_with_at�VMC�X�
��	�e�������Y�J	��	�c�_c_1a�_c_2n�_c_3e�_c_4t�_c_5 �	_c_6o�
_c_7s�_c_8u�_c_9p�
_c_10l�_c_11i�_c_12

	
m�	r�


	
	
d�	-�g�h�������������������������������������������������������c�_c_13a�_c_14n�_c_15e�_c_16t�	_c_17 �
_c_18o�_c_19s�_c_20u�
_c_21p�_c_22l�_c_23i�_c_24	
	
m�
	r�

	
d�
	-�g�h����������������������������������������������������	�����������i_to_expr	�����Wchange_core��	��c�	_c_25a�
_c_26n�_c_27e�_c_28t�
_c_29 �_c_30o�_c_31s�_c_32u�_c_33p�_c_34l�_c_35i�_c_36

	
m�
r�
d�

-�g�
h�	�����������������������������������������������������������	����	�	����
����
��	
��c�
��a���n���e�
��t��� ���o���s���u���p���l���i���

m�r�
d�-�
g�h�
��������������������������������������������������L	����n��m�	�����change�r�B��m���	�doc�XThe logic of `change x with y at l` fails when there are dependencies.
`change'` mimics the behavior of `change`, except in the case of `change x with y at l`.
In this case, it will correctly replace occurences of `x` with `y` at all possible hypotheses in `l`.
As long as `x` and `y` are defeq, it should never fail.decl~convert_to_corer
��
�tgt(��p�f�f
Quote_x_1��_x_2��

��Annotfrozen_name,�O�TyE�t�p
�x,''h(����_x�R�PInfo����	VMR��VMC��=��	���
�N	7����������������	0��	$)�i.5decl~convert_tor�Jn�J��I�P
Quote#�U���J����_a�������q��D~convert_to_core���������}�}���}�}���}���������}�����������#����\D�����\#���_#���B#�PInfo����	VMR��_lambda_1VMR��_lambda_2VMR��VMC����	�VMC����	��� �!���"��	VMC��7��	�e�������J	��	���&��'�'�����)�3	"2��	&,��15��doc��`convert_to g using n` attempts to change the current goal to `g`,
using `congr' n` to resolve discrepancies.

`convert_to g` defaults to using `congr' 1`.decl~ac_changer�Jn�J��I�P
Quote#�U���J�����Q~convert_to,�~ac_refl�PInfo����	VMR��VMC����	�������J�*ac_refl����Fdoc��`ac_change g using n` is `convert_to g using n; try {ac_refl}`prvopt_dir_with�`���̅opt_dir_withdecl��w5�o�h������l���_x�l�7���Garrow�7�lh��hh��wz���\�����_�����B����h�],�����
�PInfo����VMR��_lambda_1VMR��_lambda_2VMR��_lambda_3VMR��VMC������y-�<����leanparsertk	VMC������yVMC��?���yh�t�i�w��������	9�����parser_orelse	2leanparserident	!+��07VMC����������decl~seth_simp�8��7�:
Quote�
�a�	�tp����
Quote
�	A
w�k��_x���"pv�Jrev_name	������K����������ho
Quote�
Quoteh
Quote�������'���	����3���4���J���H	vt
_a�3�M���3

pexprmk_placeholder�
�R\	pv���f�f
Quote_x_1��._x_2��/�����z�	�v(��utp(�}definev��,_x(����@is_none�	�'�m'~change'\��
�"
������wildcard_x_a�H:�����H������	�h���val_fst�val_sndh��nv(��	��pcond
���f�f
Quote_x_1��U_x_2��V���p���x���t�f�f
Quote_x_1��Y_x_2��Z���t��''��,pf(�|���PInfo����	VMR��_lambda_1VMR��_lambda_2VMR��VMC����	�VMC�����	��_fresh�l����_fresh�l��H�_fresh�l��	��_fresh�l��'��	���	
�Fdefinev	z
���X�
is_none_main�B�����	%s	'+��q
�	1k	6D��������������Q����������������	SY��^	_d�+ipx
	
�	VMC����	���H���J���4���3���	����'	pexprmk_placeholder��
���������^����������doc��`set a := t with h` is a variant of `let a := t`.
It adds the hypothesis `h : a = t` to the local context and replaces `t` with `a` everywhere it can.
`set a := t with ←h` will add `h : t = a` instead.
`set! a := t with h` does not do any replacing.decl~clear_exceptxsj�ip
Quoteh�����	ns�name_setof_list�����T�T��h(���name_setcontains,���,��'��T��PInfo����	VMR��_lambda_1VMR��_lambda_2VMR��_lambda_3VMR��VMC�	��	�VMC�	���	(�_fresh�t�������name_setcontains�B		��	��VMC�	��	��	���	���	��	�VMC����	�����Eof_list�	��	doc��`clear_except h₀ h₁` deletes all the assumptions it can except for `h₀` and `h₁`.decl~format_namesnsi�m�	i�mformatjoinlistintersperse�m�h
Str �{h�m�	�hnamehas_to_format�PInfo�	��	VMR�	VMC�	��	�	i�	���< ����7��intersperse_mainformatjoinprvformat_binders�`�����format_bindersdecl�	�����m��������������a_fstia_snd���
)�	i��,�	��(�	����a_snd_fst��a_snd_snd(�rcases_on�	 ����,�Wpformat����Whas_append��Wto_pfmtFK
Str(��mH�m�	�~format_names����
Str : �(exprhas_to_tactic_format�
Str)�
���
Str{��(�
Str}�
���
Str⦃��(�
Str⦄�
���
Str[��(�
Str]�-a_fst_hdha_fst_tli�
)�	*i�����a_snd_fst��a_snd_snd(��
������+�
��1�Z�6�
��<�Z�A������is_prefix_of�E�n\�'�n'����G�&�K��G�Z�L�^a_fst_tl_hdha_fst_tl_tli���a_snd_fst��a_snd_snd(��
����������+�
��1���6�
��<���A�
��G���L���PInfo�	��VMR�	VMC�	�0���e��������
����W�(������Wto_pfmt	��!	":�	����	2	,3	8	
?	@F��K	L� �:� ��������	2	dj��	o	
	p�	�	(�	2	w~
�
�	
	����	�	
	��	)������	2	��
�
�	
	��	�	
���{������	2	�����	����	����	2	��	�	
�	�����	��� �:� ��������	2	�)�/��	�4	
	�5�J	�	(�	2	�<�C
�H
�O	
	�P�V��	�[	
	�\�x	}������	2	�j�q
�v
�}	
	�~��	��	
�����)�������	2	��������	�����	����	2	����	��	
��	��������	���Q �:� ��������	2	������	��	
	���	�	(�	2	��
�

�	
	����	� 	
	�!�=	�)�������	2	�/�6
�;
�B	
	�C�J	�O	
�V��[������	2	�e�k���p	�q���	����	2	�{��	��	
��	��������	��� �:� ��������	2	������	��	
	����	�	(�	2	����
��
��	
	������	��	
	���	]������	2	����
�
�	
	��	�	
���(������	2	�*�0���5	�6�N�	����	2	�@�G	�L	
�S	�T�Z���_	�`�� �:� ��������	2	�x�~��	��	
	����	�	(�	2	����
��
��	
	������	��	
	����	)������	2	����
��
��	
	����	��	
���.�����<
�����v�=�t(������	2	������	�	
	��	�	����	2	��
�
�!	
	�"�(��	�-	
	�.��	 �:� ��������	2	�F�L
���Q
	�R�g�	(�	2	�Y�`

�e
�l
	�m�s
���x
	�y��)������	2	����

��
��
	����
��
��	
�:{������	2	������	��	
	����	�	����	2	����
��
��	
	������	��	
	���p	 �:� ��������	2	�
�
���
	��.�	(�	2	� �'

�,
�3
	�4�:
���?
	�@�\}������	2	�N�U

�Z
�a
	�b�i
�n
�u	
�:�)�������	2	������	��	
	����	�	����	2	����
��
��	
	������	��	
	���7	 �:� ��������	2	����
����
	�����	(�	2	����

��
��
	���
���
	��#�)�������	2	��

�!
�(
	�)�0
�5
�<	
�:��_���stringis_prefix_of�B	�J�[������	2	�X�^��	�c	
	�d�~	�	����	2	�p�w
�|
��	
	������	��	
	���	 �:� ��������	2	����
����
	�����	(�	2	����

��
��
	����
����
	����]������	2	����

��
��
	���
�	
�	
�s[������	2	��%��	�*	
	�+�@	�	(�	2	�2�9
�>
�E	
	�F�L��	�Q	
	�R�n	]������	2	�`�g
�l
�s	
�:(������	2	������	��	
	����	�	����	2	����
��
��	
	������	��	
	���5	 �:� ��������	2	����
����
	�����	(�	2	����

��
��
	����
���
	��!)������	2	��

�
�&
	�'�.
�3
�:	
�-
�@�		�	��
��d(������	2	�N�T
���Y
	�Z�v�	����	2	�h�o

�t
�{
	�|��
����
	���	 �:� ��������	2	������
��
	����
	�	(�	2	��������
	������
��
	����
)������	2	��������
	����

�	
�	
�,{������	2	�	�	
���	"
	�	#�	?�	����	2	�	1�	8

�	=
�	D
	�	E�	K
���	P
	�	Q�	� �:� ��������	2	�	i�	o��
�	t
	�	u�	�
	�	(�	2	�	|�	��	��	�
	�	��	���
�	�
	�	��	�
}������	2	�	��	��	��	�
	�	��	�

�	�
�	�
�,�)�������	2	�	��	�
���	�
	�	��
�	����	2	�	��


�

�


	�
�

���

	�
�
� �:� ��������	2	�
2�
8��
�
=
	�
>�
S
	�	(�	2	�
E�
L�
Q�
X
	�
Y�
_��
�
d
	�
e�
�
�)�������	2	�
s�
z�
�
�
	�
��
�

�
�
�
�
�,[������	2	�
��
�
���
�
	�
��
��	����	2	�
��
�

�
�
�
�
	�
��
�
���
�
	�
��^ �:� ��������	2	�
����
�
	��
	�	(�	2	����!
	�"�(��
�-
	�.�J
]������	2	�<�C�H�O
	�P�W

�\
�c
�,(������	2	�r�x
���}
	�~���	����	2	����

��
��
	����
����
	���' �:� ��������	2	������
��
	����
	�	(�	2	��������
	������
��
	���
)������	2	����
	�� 

�%
�,
decl~mk_paragraph_aux_mainright_margin#���m���m��#��g�m�m�	7#���m���m��#�������m�����m���	��	�\formatline��a_hd�ma_tl����	len'#stringlengthformatto_string,optionsmk��has_lele#�{has_lehas_addadd#�|����{decidable_le����m
��RecFn�	6����	��	�������������,���	��	��������	��	��h
Str  ����,�PInfo�	6��	VMR�	6VMC�	6H��	������#���m���m�	7#��formatline����optionsmkformatto_stringstringlength�	<#nataddnatdecidable_le	2 �_c_1��	_c_2	�7	��7�����	J�����	6F�	R�	R ����7�����	6decl~mk_paragraph_aux���	7#�	6	�PInfo�	W��	VMR�	WVMC�	W��	�	7#�	6decl~mk_paragraphright_margin#���	Y#��~mk_paragraph_aux�h�	���
�PInfo�	X��	VMR�	XVMC�	X
��	�	Y#��7_c_1�	6doc�	X `mk_paragraph right_margin ls` packs `ls` into a paragraph where the lines have
length at most `right_margin`decl~extract_goaln�������
Quoteh��vsj�ip
Quoteh��	]��	^�"�o�T(}solve_aux�T�\reflectedtrue(�_�(�b�(exprhas_coe��
Quote�A�T!����Nemptyh�,�3'~clear_except��_p�_a��	�T(�	g��i�T�k(�tgt(��}is_propis_prop�	title�m_a�_a�� �	l��m,���	�
Strexample�hboolcases_on�	m��m,���	��	��	�
Strdef ���	����	��	��	�
Strlemma �W�	���~compact_decl��cxt��"�������m�	listinit��cxt'��"5�moptiontraverse�����mx������	�����Wtactichas_to_tactic_format�m��s�
Str :�	rlast'��,cxt''�z"�m����%���
Str :=stmt�m	fmt�m~mk_paragraph�}�}�}���������m��m�������*�m,�h�����m�~trace�m�_x�����
Strbegin�Wpformatmk����������
StrendE�m��PInfo�	\�	VMR�	\_lambda_1VMR�	\_lambda_2VMR�	\_lambda_3VMR�	\_lambda_4VMR�	\_lambda_5VMR�	\_lambda_6VMR�	\_lambda_7VMR�	\_lambda_8VMR�	\_lambda_9VMR�	\_lambda_10VMR�	\_lambda_11VMR�	\_lambda_12VMR�	\VMC�	��	�VMC�	�!�	��_fresh��������empty_main�B			
��	���	��VMC�	��	���'�(�!���"��	VMC�	��	���'���)���*��		VMC�	��	���+�"��VMC�	��	��,�-�.���/��			VMC�	�*�	��0�1�2���3��	��	$	"	VMC�	��	��VMC�	�'�	��4�5�6���7��		�	�	!		VMC�	�h�) ��	w������	2		��	/�	����	y�	2	!(-4	5;��@	Ab:� �������	2	T[`VMC�	���	��_fresh����m����trace		�n�i�g�e�b����������	2	+1��6	7I�	J�Wpformatmk	;BGN	OU��Z	[� � �������	2	nt��y	z��	J�	�	~�	�	
�	�����	��d�n�e��������	2	��	�	
�	����	�������VMC�	���	��_fresh����m�_fresh���(�_fresh����T��	���init_main�	��	���	��Plast'_main�	��	��	��	��	��	��	��	�optiontraverse_main	$�	����	2	-3
��8
	9N�	(�	2	@G

L
S
	TZ
��_
	`�=�:� ��������	2	x

�
�
	��:����7�Z
��P�	X
�	}�m
�	��
�	
�VMC�	\��	��	^��	]��	��Fsolve_aux	��N	�Fis_prop	�
	=e�_c_1l�p�m�a�x�������������		?b�����	�� �f�e�d��������������m�
_c_2�����	�� �a�

e�l����������������	k�m�	��	
�	doc�	\Format the current goal as a stand-alone example. Useful for testing tactic.

  * `extract_goal`: formats the statement as an `example` declaration
  * `extract_goal my_decl`: formats the statement as a `lemma` or `def` declaration
    called `my_decl`
  * `extract_goal with i j k:` only use local constants `i`, `j`, `k` in the declaration

Examples:

```lean
example (i j k : ℕ) (h₀ : i ≤ j) (h₁ : j ≤ k) : i ≤ k :=
begin
  extract_goal,
     -- prints:
     -- example {i j k : ℕ} (h₀ : i ≤ j) (h₁ : j ≤ k) : i ≤ k :=
     -- begin

     -- end
  extract_goal my_lemma
     -- lemma my_lemma {i j k : ℕ} (h₀ : i ≤ j) (h₁ : j ≤ k) : i ≤ k :=
     -- begin

     -- end
end

example {i j k x y z w p q r m n : ℕ} (h₀ : i ≤ j) (h₁ : j ≤ k) (h₁ : k ≤ p) (h₁ : p ≤ q) : i ≤ k :=
begin
  extract_goal my_lemma,
    -- prints:
    -- lemma my_lemma {i j k x y z w p q r m n : ℕ} (h₀ : i ≤ j) (h₁ : j ≤ k)
    --   (h₁ : k ≤ p) (h₁ : p ≤ q) : i ≤ k :=
    -- begin

    -- end

  extract_goal my_lemma with i j k
    -- prints:
    -- lemma my_lemma {i j k : ℕ} : i ≤ k :=
    -- begin

    -- end
end
```EndFile