Implication →
is transitive. If P → Q
and Q → R
then P → R
.
not
false
eq
ne
and
or
xor
iff
iff P Q
, with notation P ↔ Q
, is the proposition asserting that P
and Q
are equivalent,
that is, have the same truth value.
Instances for iff
and simp rules
or simp rules
or resolution rulse
iff simp rules
implies simp rule
The existential quantifier.
To prove a goal of the form ⊢ ∃ x, p x
, you can provide a witness y
with the tactic existsi y
.
If you are working in a project that depends on mathlib, then we recommend the use
tactic
instead.
You'll then be left with the goal ⊢ p y
.
To extract a witness x
and proof hx : p x
from a hypothesis h : ∃ x, p x
,
use the tactic cases h with x hx
. See also the mathlib tactics obtain
and rcases
.
Instances for Exists
- exists_prop_decidable
- list.decidable_bex
- option.decidable_exists_mem
- bool.decidable_exists_bool
- nat.decidable_exists_lt
- nat.decidable_exists_le
- multiset.decidable_dexists_multiset
- finset.decidable_dexists_finset
- fintype.decidable_exists_fintype
- finset.decidable_exists_of_decidable_subsets
- finset.decidable_exists_of_decidable_ssubsets
exists unique
exists, forall, exists unique congruences
decidable
Equations
- decidable.to_bool p = h.cases_on (λ (h₁ : ¬p), bool.ff) (λ (h₂ : p), bool.tt)
Equations
Equations
Equations
- decidable.rec_on_true h₃ h₄ = h.rec_on (λ (h : ¬p), false.rec ((decidable.is_false h).rec_on h₂ h₁) _) (λ (h : p), h₄)
Equations
- decidable.rec_on_false h₃ h₄ = h.rec_on (λ (h : ¬p), h₄) (λ (h : p), false.rec ((decidable.is_true h).rec_on h₂ h₁) _)
Equations
- decidable_of_decidable_of_iff hp h = dite p (λ (hp : p), decidable.is_true _) (λ (hp : ¬p), decidable.is_false _)
Equations
Equations
- and.decidable = dite p (λ (hp : p), dite q (λ (hq : q), decidable.is_true _) (λ (hq : ¬q), decidable.is_false _)) (λ (hp : ¬p), decidable.is_false _)
Equations
- or.decidable = dite p (λ (hp : p), decidable.is_true _) (λ (hp : ¬p), dite q (λ (hq : q), decidable.is_true _) (λ (hq : ¬q), decidable.is_false _))
Equations
- not.decidable = dite p (λ (hp : p), decidable.is_false _) (λ (hp : ¬p), decidable.is_true hp)
Equations
- implies.decidable = dite p (λ (hp : p), dite q (λ (hq : q), decidable.is_true _) (λ (hq : ¬q), decidable.is_false _)) (λ (hp : ¬p), decidable.is_true _)
Equations
- iff.decidable = dite p (λ (hp : p), dite q (λ (hq : q), decidable.is_true _) (λ (hq : ¬q), decidable.is_false _)) (λ (hp : ¬p), dite q (λ (hq : q), decidable.is_false _) (λ (hq : ¬q), decidable.is_true _))
Equations
- xor.decidable = dite p (λ (hp : p), dite q (λ (hq : q), decidable.is_false _) (λ (hq : ¬q), decidable.is_true _)) (λ (hp : ¬p), dite q (λ (hq : q), decidable.is_true _) (λ (hq : ¬q), decidable.is_false _))
Equations
- exists_prop_decidable P = dite p (λ (h : p), decidable_of_decidable_of_iff (DP h) _) (λ (h : ¬p), decidable.is_false _)
Equations
- forall_prop_decidable P = dite p (λ (h : p), decidable_of_decidable_of_iff (DP h) _) (λ (h : ¬p), decidable.is_true _)
Equations
Equations
- decidable_eq_of_bool_pred h₁ h₂ = λ (x y : α), dite (p x y = bool.tt) (λ (hp : p x y = bool.tt), decidable.is_true _) (λ (hp : ¬p x y = bool.tt), decidable.is_false _)
inhabited
- default : α
Instances of this typeclass
- unique.inhabited
- prop.inhabited
- pi.inhabited
- bool.inhabited
- true.inhabited
- prod.inhabited
- nat.inhabited
- list.inhabited
- char.inhabited
- string.inhabited
- sum.inhabited_left
- sum.inhabited_right
- name.inhabited
- option.inhabited
- options.inhabited
- format.inhabited
- level.inhabited
- expr.inhabited
- environment.implicit_infer_kind.inhabited
- environment.inhabited
- local_context.inhabited
- occurrences.inhabited
- punit.inhabited
- json.inhabited
- sort.inhabited
- sort.inhabited'
- psum.inhabited_left
- psum.inhabited_right
- vm_decl_kind.inhabited
- vm_obj_kind.inhabited
- tactic.new_goals.inhabited
- tactic.transparency.inhabited
- tactic.apply_cfg.inhabited
- smt_pre_config.inhabited
- ematch_config.inhabited
- cc_config.inhabited
- smt_config.inhabited
- rsimp.config.inhabited
- tactic.dunfold_config.inhabited
- tactic.dsimp_config.inhabited
- tactic.unfold_proj_config.inhabited
- tactic.simp_intros_config.inhabited
- tactic.delta_config.inhabited
- tactic.simp_config.inhabited
- tactic.rewrite_cfg.inhabited
- interactive.loc.inhabited
- tactic.unfold_config.inhabited
- param_info.inhabited
- subsingleton_info.inhabited
- fun_info.inhabited
- format.color.inhabited
- pos.inhabited
- environment.projection_info.inhabited
- reducibility_hints.inhabited
- congr_arg_kind.inhabited
- ulift.inhabited
- plift.inhabited
- string_imp.inhabited
- string.iterator_imp.inhabited
- rbnode.color.inhabited
- ordering.inhabited
- unification_constraint.inhabited
- pprod.inhabited
- unification_hint.inhabited
- doc_category.inhabited
- tactic_doc_entry.inhabited
- bin_tree.inhabited
- unsigned.inhabited
- string.iterator.inhabited
- rbnode.inhabited
- rbtree.inhabited
- rbmap.inhabited
- binder_info.inhabited
- binder.inhabited
- tactic.goal.inhabited
- tactic.proof_state.inhabited
- to_additive.value_type.inhabited
- native.rb_set.inhabited
- native.rb_map.inhabited
- native.rb_lmap.inhabited
- name_set.inhabited
- name_map.inhabited
- lint_verbosity.inhabited
- tactic.rcases_patt.inhabited
- tactic.explode.status.inhabited
- tactic.explode.entries.inhabited
- auto.auto_config.inhabited
- auto.case_option.inhabited
- tactic.itauto.and_kind.inhabited
- tactic.itauto.prop.inhabited
- tactic.itauto.proof.inhabited
- norm_cast.label.inhabited
- norm_cast.norm_cast_cache.inhabited
- projection_data.inhabited
- simps_cfg.inhabited
- functor.const.inhabited
- functor.add_const.inhabited
- functor.comp.inhabited
- applicative_transformation.inhabited
- tactic.suggest.head_symbol_match.inhabited
- quot.inhabited
- quotient.inhabited
- trunc.inhabited
- fin.inhabited
- inhabited_fin_one_add
- units.inhabited
- add_units.inhabited
- monoid.End.inhabited
- add_monoid.End.inhabited
- one_hom.inhabited
- zero_hom.inhabited
- mul_hom.inhabited
- add_hom.inhabited
- monoid_hom.inhabited
- add_monoid_hom.inhabited
- monoid_with_zero_hom.inhabited
- equiv.inhabited'
- sigma.inhabited
- psigma.inhabited
- mul_equiv.inhabited
- add_equiv.inhabited
- mul_opposite.inhabited
- add_opposite.inhabited
- order_dual.inhabited
- as_linear_order.inhabited
- complementeds.inhabited
- with_bot.inhabited
- with_top.inhabited
- set.inhabited
- non_unital_ring_hom.inhabited
- ring_hom.inhabited
- ring_equiv.inhabited
- additive.inhabited
- multiplicative.inhabited
- function.End.inhabited
- rel_embedding.inhabited
- rel_iso.inhabited
- tactic.interactive.mono_cfg.inhabited
- tactic.interactive.mono_selection.inhabited
- order_hom.inhabited
- with_one.inhabited
- with_zero.inhabited
- int.inhabited
- mul_aut.inhabited
- add_aut.inhabited
- ring_aut.inhabited
- pnat.inhabited
- rat.inhabited
- expr_lens.dir.inhabited
- multiset.inhabited_multiset
- tactic.interactive.rep_arity.inhabited
- finset.inhabited_finset
- pi.lex.inhabited
- tactic.positivity.order_rel.inhabited
- top_hom.inhabited
- bot_hom.inhabited
- bounded_order_hom.inhabited
- sup_hom.inhabited
- inf_hom.inhabited
- sup_bot_hom.inhabited
- inf_top_hom.inhabited
- lattice_hom.inhabited
- bounded_lattice_hom.inhabited
- vector.inhabited
- sym.inhabited_sym
- sym.inhabited_sym'
- set.finite.inhabited
- tactic.abel.normalize_mode.inhabited
- distrib_mul_action_hom.inhabited
- linear_map.inhabited
- associates.inhabited
- conj_classes.inhabited
- subsemigroup.inhabited
- add_subsemigroup.inhabited
- submonoid.inhabited
- add_submonoid.inhabited
- ulower.inhabited
- antisymmetrization.inhabited
- subgroup.inhabited
- add_subgroup.inhabited
- sub_mul_action.inhabited
- free_monoid.inhabited
- free_add_monoid.inhabited
- submodule.inhabited
- submodule.inhabited'
- dfinsupp.inhabited
- finsupp.inhabited
- absolute_value.inhabited
- subsemiring.inhabited
- subring.inhabited
- non_unital_alg_hom.inhabited
- non_unital_star_alg_hom.inhabited
- star_alg_hom.inhabited
- star_alg_equiv.inhabited
- tactic.tfae.arrow.inhabited
- part.inhabited
- omega_complete_partial_order.chain.inhabited
- omega_complete_partial_order.continuous_hom.inhabited
- con.inhabited
- add_con.inhabited
- con.quotient.inhabited
- add_con.quotient.inhabited
- tensor_product.inhabited
- alg_equiv.inhabited
- conj_act.inhabited
- Sup_hom.inhabited
- Inf_hom.inhabited
- frame_hom.inhabited
- complete_lattice_hom.inhabited
- set_semiring.inhabited
- tactic.ring.normalize_mode.inhabited
- tactic.ring.ring_nf_cfg.inhabited
- linarith.ineq.inhabited
- linarith.comp.inhabited
- linarith.comp_source.inhabited
- prod.lex.inhabited
- pos_num.inhabited
- num.inhabited
- znum.inhabited
- tree.inhabited
- enat.inhabited
- part_enat.inhabited
- cardinal.inhabited
- linear_pmap.inhabited
- quotient_group.has_quotient.quotient.inhabited
- quotient_add_group.has_quotient.quotient.inhabited
- submodule.quotient.has_quotient.quotient.inhabited
- basis.inhabited
- subalgebra.inhabited
- algebra.subalgebra.inhabited
- self_adjoint.inhabited
- skew_adjoint.inhabited
- star_subalgebra.inhabited
- restrict_scalars.inhabited
- zmod.inhabited
- direct_sum.inhabited
- matrix.inhabited
- ring_con.inhabited
- ring_con.quotient.inhabited
- ideal.quotient.inhabited
- unique_factorization_monoid.normalization_monoid.inhabited
- initial_seg.inhabited
- Well_order.inhabited
- ordinal.inhabited
- affine_map.inhabited
- affine_subspace.inhabited
- module.dual.inhabited
- bilin_form.inhabited
- filter.inhabited_mem
- filter.inhabited
- filter_basis.inhabited
- filter.nat.inhabited_countable_filter_basis
- tactic.decl_reducibility.inhabited
- ultrafilter.inhabited
- inhabited_topological_space
- cofinite_topology.inhabited
- upper_set.inhabited
- lower_set.inhabited
- compact_exhaustion.inhabited
- connected_components.inhabited
- separation_quotient.inhabited
- inhabited_uniform_space
- inhabited_uniform_space_core
- uniform_space.separation_quotient.inhabited
- cycle.inhabited
- nat.primes.inhabited_primes
- continuous_map.inhabited
- group_topology.inhabited
- add_group_topology.inhabited
- ring_topology.inhabited
- subfield.inhabited
- nonneg.inhabited
- cau_seq.inhabited
- cau_seq.completion.Cauchy.inhabited
- real.inhabited
- nnreal.inhabited
- ennreal.inhabited
- Cauchy.inhabited
- uniform_space.completion.inhabited
- uniform_space.completion.abstract_completion.inhabited
- complex.inhabited
- group_seminorm.inhabited
- add_group_seminorm.inhabited
- nonarch_add_group_seminorm.inhabited
- add_group_norm.inhabited
- group_norm.inhabited
- nonarch_add_group_norm.inhabited
- locally_bounded_map.inhabited
- normed_add_group_hom.inhabited
- continuous_linear_map.inhabited
- linear_isometry.inhabited
- linear_isometry_equiv.inhabited
- unitary.inhabited
- closure_operator.inhabited
- lower_adjoint.inhabited
- derive_fintype.finset_above.inhabited
- sign_type.inhabited
- affine.simplex.inhabited
- affine_basis.inhabited
- zeroth_homotopy.inhabited
- affine_isometry.inhabited
- affine_isometry_equiv.inhabited
- local_equiv.inhabited
- local_equiv.inhabited_of_empty
- topological_space.opens.inhabited
- topological_space.open_nhds_of.inhabited
- seminorm.inhabited
- group_filter_basis.inhabited
- add_group_filter_basis.inhabited
- module_filter_basis.inhabited
- multilinear_map.inhabited
- continuous_multilinear_map.inhabited
- topological_space.closeds.inhabited
- topological_space.clopens.inhabited
- topological_space.compacts.inhabited
- topological_space.nonempty_compacts.inhabited
- topological_space.positive_compacts.inhabited
- topological_space.compact_opens.inhabited
- continuous_linear_map.nonlinear_right_inverse.inhabited
- composition_series.inhabited
- pequiv.inhabited
- composition_as_set.inhabited
- composition.inhabited
- nat.partition.inhabited
- alternating_map.inhabited
- monoid_algebra.inhabited
- add_monoid_algebra.inhabited
- mv_polynomial.inhabited
- polynomial.inhabited
- localization.inhabited
- add_localization.inhabited
- tactic.ring_exp.coeff.inhabited
- tactic.ring_exp.ex_type.inhabited
- add_circle.inhabited
- real.angle.inhabited
- pi_Lp.inhabited
- orthonormal_basis.inhabited
- formal_multilinear_series.inhabited
- convex_cone.inhabited
- weak_dual.inhabited
- normed_space.dual.inhabited
- local_ring.residue_field.inhabited
- dmatrix.inhabited
- matrix.special_linear_group.inhabited
- quadratic_form.inhabited
Instances of other typeclasses for inhabited
- inhabited.has_sizeof_inst
Equations
- prop.inhabited = {default := true}
Equations
- pi.inhabited α = {default := λ (a : α), inhabited.default}
Equations
Equations
Instances of this typeclass
- has_zero.nonempty
- has_one.nonempty
- has_Inf_to_nonempty
- has_Sup_to_nonempty
- irreducible_space.to_nonempty
- connected_space.to_nonempty
- has_top_nonempty
- has_bot_nonempty
- add_torsor.nonempty
- nontrivial.to_nonempty
- nonempty_of_inhabited
- prod.nonempty
- pi.nonempty
- order_dual.nonempty
- nonempty_lt
- nonempty_gt
- set.univ.nonempty
- set.has_insert.insert.nonempty
- set.image.nonempty
- set.range.nonempty
- set.nonempty_Ici_subtype
- set.nonempty_Iic_subtype
- set.nonempty_Ioi_subtype
- set.nonempty_Iio_subtype
- plift.nonempty
- ulift.nonempty
- finset.has_insert.insert.nonempty
- nonempty_equiv_of_countable
- module.free.choose_basis_index.nonempty
- is_well_order.subtype_nonempty
- cardinal.nonempty_out_aleph
- affine_map.nonempty
- ray_vector.nonempty
- module.ray.nonempty
- affine_span.nonempty
- filter_basis.nonempty_sets
- ultrafilter.nonempty
- separation_quotient.nonempty
- uniform_fun.nonempty
- uniform_on_fun.nonempty
- commutator_set.nonempty
- Cauchy.nonempty
- affine.simplex.nonempty
- unit_interval.nonempty
- topological_space.nonempty_compacts.to_nonempty
- topological_space.positive_compacts.nonempty'
- projectivization.nonempty
subsingleton
Instances of this typeclass
- is_empty.subsingleton
- unique.subsingleton
- char_p.subsingleton
- subsingleton_prop
- decidable.subsingleton
- pi.subsingleton
- punit.subsingleton
- empty.subsingleton
- subsingleton.prod
- subtype.subsingleton
- subsingleton_pempty
- quot.subsingleton
- quotient.subsingleton
- trunc.subsingleton
- unique.subsingleton_unique
- equiv.equiv_subsingleton_cod
- equiv.equiv_subsingleton_dom
- mul_opposite.subsingleton
- add_opposite.subsingleton
- order_dual.subsingleton
- set.subsingleton_coe_of_subsingleton
- invertible.subsingleton
- ring_hom.int.subsingleton_ring_hom
- rat.subsingleton_ring_hom
- fin.order_iso_subsingleton
- fin.order_iso_subsingleton'
- plift.subsingleton
- ulift.subsingleton
- fintype.subsingleton
- vector.zero_subsingleton
- sym.subsingleton
- subsingleton_rat_module
- subsingleton_gcd_monoid_of_unique_units
- subsingleton_normalized_gcd_monoid_of_unique_units
- subsingleton_fin_zero
- subsingleton_fin_one
- nat_algebra_subsingleton
- algebra_rat_subsingleton
- int_algebra_subsingleton
- locally_finite_order.subsingleton
- locally_finite_order_top.subsingleton
- locally_finite_order_bot.subsingleton
- order.succ_order.subsingleton
- order.pred_order.subsingleton
- subalgebra.subsingleton_of_subsingleton
- alg_hom.subsingleton
- alg_equiv.subsingleton_left
- alg_equiv.subsingleton_right
- matrix.subsingleton
- matrix.subsingleton_of_empty_left
- matrix.subsingleton_of_empty_right
- initial_seg.subsingleton_of_trichotomous_of_irrefl
- initial_seg.subsingleton
- principal_seg.subsingleton
- direct_sum.decomposition.subsingleton
- separation_quotient.subsingleton
- zmod.subsingleton_units
- zmod.subsingleton_ring_hom
- zmod.subsingleton_ring_equiv
- dmatrix.subsingleton
- dmatrix.subsingleton_of_empty_left
- dmatrix.subsingleton_of_empty_right
Equations
- ite.decidable = ite.decidable._match_1 d_c
- ite.decidable._match_1 (decidable.is_true hc) = d_t
- ite.decidable._match_1 (decidable.is_false hc) = d_e
Equations
- dite.decidable = dite.decidable._match_1 d_c
- dite.decidable._match_1 (decidable.is_true hc) = d_t hc
- dite.decidable._match_1 (decidable.is_false hc) = d_e hc
- down : α
Universe lifting operation
Instances for ulift
- ulift.has_sizeof_inst
- ulift.inhabited
- ulift.reflect'
- ulift.finite
- ulift.infinite
- rel_iso.is_well_order.ulift
- ulift.subsingleton
- ulift.nonempty
- ulift.unique
- ulift.is_empty
- ulift.fintype
- ulift.has_one
- ulift.has_zero
- ulift.has_mul
- ulift.has_add
- ulift.has_div
- ulift.has_sub
- ulift.has_inv
- ulift.has_neg
- ulift.has_smul
- ulift.has_vadd
- ulift.has_pow
- ulift.semigroup
- ulift.add_semigroup
- ulift.comm_semigroup
- ulift.add_comm_semigroup
- ulift.mul_one_class
- ulift.add_zero_class
- ulift.mul_zero_one_class
- ulift.monoid
- ulift.add_monoid
- ulift.comm_monoid
- ulift.add_comm_monoid
- ulift.has_nat_cast
- ulift.has_int_cast
- ulift.add_monoid_with_one
- ulift.add_comm_monoid_with_one
- ulift.monoid_with_zero
- ulift.comm_monoid_with_zero
- ulift.div_inv_monoid
- ulift.sub_neg_add_monoid
- ulift.group
- ulift.add_group
- ulift.comm_group
- ulift.add_comm_group
- ulift.add_group_with_one
- ulift.add_comm_group_with_one
- ulift.group_with_zero
- ulift.comm_group_with_zero
- ulift.left_cancel_semigroup
- ulift.add_left_cancel_semigroup
- ulift.right_cancel_semigroup
- ulift.add_right_cancel_semigroup
- ulift.left_cancel_monoid
- ulift.add_left_cancel_monoid
- ulift.right_cancel_monoid
- ulift.add_right_cancel_monoid
- ulift.cancel_monoid
- ulift.add_cancel_monoid
- ulift.cancel_comm_monoid
- ulift.add_cancel_comm_monoid
- ulift.nontrivial
- ulift.mul_zero_class
- ulift.distrib
- ulift.non_unital_non_assoc_semiring
- ulift.non_assoc_semiring
- ulift.non_unital_semiring
- ulift.semiring
- ulift.non_unital_comm_semiring
- ulift.comm_semiring
- ulift.non_unital_non_assoc_ring
- ulift.non_unital_ring
- ulift.non_assoc_ring
- ulift.ring
- ulift.non_unital_comm_ring
- ulift.comm_ring
- ulift.has_smul_left
- ulift.has_vadd_left
- ulift.is_scalar_tower
- ulift.is_scalar_tower'
- ulift.is_scalar_tower''
- ulift.is_central_scalar
- ulift.mul_action
- ulift.add_action
- ulift.mul_action'
- ulift.add_action'
- ulift.smul_zero_class
- ulift.smul_zero_class'
- ulift.distrib_smul
- ulift.distrib_smul'
- ulift.distrib_mul_action
- ulift.distrib_mul_action'
- ulift.mul_distrib_mul_action
- ulift.mul_distrib_mul_action'
- ulift.smul_with_zero
- ulift.smul_with_zero'
- ulift.mul_action_with_zero
- ulift.mul_action_with_zero'
- ulift.module
- ulift.module'
- ulift.countable
- ulift.encodable
- ulift.algebra
- denumerable.ulift
- small_ulift
- ulift.topological_space
- ulift.discrete_topology
- ulift.sigma_compact_space
- ulift.uniform_space
- ulift.complete_space
- ulift.pseudo_emetric_space
- ulift.emetric_space
- ulift.pseudo_metric_space
- ulift.metric_space
- ulift.char_p
- ulift.has_isometric_smul
- ulift.has_isometric_vadd
- ulift.has_isometric_smul'
- ulift.has_isometric_vadd'
- ulift.has_norm
- ulift.has_nnnorm
- ulift.seminormed_group
- ulift.seminormed_add_group
- ulift.seminormed_comm_group
- ulift.seminormed_add_comm_group
- ulift.normed_group
- ulift.normed_add_group
- ulift.normed_comm_group
- ulift.normed_add_comm_group
- ulift.norm_one_class
- ulift.non_unital_semi_normed_ring
- ulift.semi_normed_ring
- ulift.non_unital_normed_ring
- ulift.normed_ring
- ulift.normed_space
- ulift.normed_algebra
- down : α
Universe lifting operation from Sort to Type
Instances for plift
Equations
- transitive r = ∀ ⦃x y z : β⦄, r x y → r y z → r x z
Equations
- equivalence r = (reflexive r ∧ symmetric r ∧ transitive r)
Equations
- irreflexive r = ∀ (x : β), ¬r x x
Equations
- empty_relation = λ (a₁ a₂ : α), false
Instances for empty_relation
Equations
- subrelation q r = ∀ ⦃x y : β⦄, q x y → r x y
Equations
- commutative f = ∀ (a b : α), f a b = f b a
Equations
- associative f = ∀ (a b c : α), f (f a b) c = f a (f b c)
Equations
- left_identity f one = ∀ (a : α), f one a = a
Equations
- right_identity f one = ∀ (a : α), f a one = a
Equations
- right_inverse f inv one = ∀ (a : α), f a (inv a) = one
Equations
- left_distributive f g = ∀ (a b c : α), f a (g b c) = g (f a b) (f a c)
Equations
- right_distributive f g = ∀ (a b c : α), f (g a b) c = g (f a c) (f b c)
Equations
- right_commutative h = ∀ (b : β) (a₁ a₂ : α), h (h b a₁) a₂ = h (h b a₂) a₁
Equations
- left_commutative h = ∀ (a₁ a₂ : α) (b : β), h a₁ (h a₂ b) = h a₂ (h a₁ b)