Documentation

Init.WF

inductive Acc {α : Sort u} (r : ααProp) :
αProp

Acc is the accessibility predicate. Given some relation r (e.g. <) and a value x, Acc r x means that x is accessible through r:

x is accessible if there exists no infinite sequence ... < y₂ < y₁ < y₀ < x.

  • intro {α : Sort u} {r : ααProp} (x : α) (h : ∀ (y : α), r y xAcc r y) : Acc r x

    A value is accessible if for all y such that r y x, y is also accessible. Note that if there exists no y such that r y x, then x is accessible. Such an x is called a base case.

Instances For
    @[reducible, inline]
    noncomputable abbrev Acc.ndrec {α : Sort u2} {r : ααProp} {C : αSort u1} (m : (x : α) → (∀ (y : α), r y xAcc r y)((y : α) → r y xC y)C x) {a : α} (n : Acc r a) :
    C a
    Instances For
      @[reducible, inline]
      noncomputable abbrev Acc.ndrecOn {α : Sort u2} {r : ααProp} {C : αSort u1} {a : α} (n : Acc r a) (m : (x : α) → (∀ (y : α), r y xAcc r y)((y : α) → r y xC y)C x) :
      C a
      Instances For
        theorem Acc.inv {α : Sort u} {r : ααProp} {x y : α} (h₁ : Acc r x) (h₂ : r y x) :
        Acc r y
        inductive WellFounded {α : Sort u} (r : ααProp) :

        A relation r is WellFounded if all elements of α are accessible within r. If a relation is WellFounded, it does not allow for an infinite descent along the relation.

        If the arguments of the recursive calls in a function definition decrease according to a well founded relation, then the function terminates. Well-founded relations are sometimes called Artinian or said to satisfy the “descending chain condition”.

        • intro {α : Sort u} {r : ααProp} (h : ∀ (a : α), Acc r a) : WellFounded r

          If all elements are accessible via r, then r is well-founded.

        Instances For
          class WellFoundedRelation (α : Sort u) :
          Sort (max 1 u)

          A type that has a standard well-founded relation.

          Instances are used to prove that functions terminate using well-founded recursion by showing that recursive calls reduce some measure according to a well-founded relation. This relation can combine well-founded relations on the recursive function's parameters.

          • rel : ααProp

            A well-founded relation on α.

          • A proof that rel is, in fact, well-founded.

          Instances
            theorem WellFounded.apply {α : Sort u} {r : ααProp} (wf : WellFounded r) (a : α) :
            Acc r a
            noncomputable def WellFounded.recursion {α : Sort u} {r : ααProp} (hwf : WellFounded r) {C : αSort v} (a : α) (h : (x : α) → ((y : α) → r y xC y)C x) :
            C a
            Instances For
              theorem WellFounded.induction {α : Sort u} {r : ααProp} (hwf : WellFounded r) {C : αProp} (a : α) (h : ∀ (x : α), (∀ (y : α), r y xC y)C x) :
              C a
              noncomputable def WellFounded.fixF {α : Sort u} {r : ααProp} {C : αSort v} (F : (x : α) → ((y : α) → r y xC y)C x) (x : α) (a : Acc r x) :
              C x
              Instances For
                theorem WellFounded.fixF_eq {α : Sort u} {r : ααProp} {C : αSort v} (F : (x : α) → ((y : α) → r y xC y)C x) (x : α) (acx : Acc r x) :
                fixF F x acx = F x fun (y : α) (p : r y x) => fixF F y
                def WellFounded.wrap {α : Sort u} {r : ααProp} (h : WellFounded r) (x : α) :
                { x : α // Acc r x }

                Attaches to x the proof that x is accessible in the given well-founded relation. This can be used in recursive function definitions to explicitly use a different relation than the one inferred by default:

                def otherWF : WellFounded Nat := …
                def foo (n : Nat) := …
                termination_by otherWF.wrap n
                
                Instances For
                  @[simp]
                  theorem WellFounded.val_wrap {α : Sort u} {r : ααProp} (h : WellFounded r) (x : α) :
                  (h.wrap x).val = x
                  noncomputable def WellFounded.fix {α : Sort u} {C : αSort v} {r : ααProp} (hwf : WellFounded r) (F : (x : α) → ((y : α) → r y xC y)C x) (x : α) :
                  C x

                  A well-founded fixpoint. If satisfying the motive C for all values that are smaller according to a well-founded relation allows it to be satisfied for the current value, then it is satisfied for all values.

                  This function is used as part of the elaboration of well-founded recursion.

                  Instances For
                    theorem WellFounded.fix_eq {α : Sort u} {C : αSort v} {r : ααProp} (hwf : WellFounded r) (F : (x : α) → ((y : α) → r y xC y)C x) (x : α) :
                    hwf.fix F x = F x fun (y : α) (x : r y x) => hwf.fix F y
                    @[implicit_reducible]
                    Instances For
                      theorem Subrelation.accessible {α : Sort u} {r q : ααProp} {a : α} (h₁ : Subrelation q r) (ac : Acc r a) :
                      Acc q a
                      theorem Subrelation.wf {α : Sort u} {r q : ααProp} (h₁ : Subrelation q r) (h₂ : WellFounded r) :
                      theorem InvImage.accAux {α : Sort u} {β : Sort v} {r : ββProp} (f : αβ) {b : β} (ac : Acc r b) (x : α) :
                      f x = bAcc (InvImage r f) x
                      theorem InvImage.accessible {α : Sort u} {β : Sort v} {r : ββProp} {a : α} (f : αβ) (ac : Acc r (f a)) :
                      Acc (InvImage r f) a
                      theorem InvImage.wf {α : Sort u} {β : Sort v} {r : ββProp} (f : αβ) (h : WellFounded r) :
                      @[reducible]
                      def invImage {α : Sort u_1} {β : Sort u_2} (f : αβ) (h : WellFoundedRelation β) :

                      The inverse image of a well-founded relation is well-founded.

                      Instances For
                        theorem Acc.transGen {α✝ : Sort u_1} {r : α✝α✝Prop} {a : α✝} (h : Acc r a) :
                        theorem acc_transGen_iff {α✝ : Sort u_1} {r : α✝α✝Prop} {a : α✝} :
                        theorem Acc.inv_of_transGen {α : Sort u_1} {r : ααProp} {x y : α} (h₁ : Acc r x) (h₂ : Relation.TransGen r y x) :
                        Acc r y

                        If Acc r x holds and y is transitively related to x, then Acc r y holds, too.

                        theorem WellFounded.transGen {α✝ : Sort u_1} {r : α✝α✝Prop} (h : WellFounded r) :
                        @[implicit_reducible]
                        Instances For
                          noncomputable def Nat.strongRecOn {motive : NatSort u} (n : Nat) (ind : (n : Nat) → ((m : Nat) → m < nmotive m)motive n) :
                          motive n

                          Strong induction on the natural numbers.

                          The induction hypothesis is that all numbers less than a given number satisfy the motive, which should be demonstrated for the given number.

                          Instances For
                            noncomputable def Nat.caseStrongRecOn {motive : NatSort u} (a : Nat) (zero : motive 0) (ind : (n : Nat) → ((m : Nat) → m nmotive m)motive n.succ) :
                            motive a

                            Case analysis based on strong induction for the natural numbers.

                            Instances For
                              @[reducible, inline]
                              abbrev measure {α : Sort u} (f : αNat) :
                              Instances For
                                @[reducible, inline, instance 100]
                                instance sizeOfWFRel {α : Sort u} [SizeOf α] :
                                inductive Prod.Lex {α : Type u} {β : Type v} (ra : ααProp) (rb : ββProp) :
                                α × βα × βProp

                                A lexicographical order based on the orders ra and rb for the elements of pairs.

                                • left {α : Type u} {β : Type v} {ra : ααProp} {rb : ββProp} {a₁ : α} (b₁ : β) {a₂ : α} (b₂ : β) (h : ra a₁ a₂) : Prod.Lex ra rb (a₁, b₁) (a₂, b₂)

                                  If the first projections of two pairs are ordered, then they are lexicographically ordered.

                                • right {α : Type u} {β : Type v} {ra : ααProp} {rb : ββProp} (a : α) {b₁ b₂ : β} (h : rb b₁ b₂) : Prod.Lex ra rb (a, b₁) (a, b₂)

                                  If the first projections of two pairs are equal, then they are lexicographically ordered if the second projections are ordered.

                                Instances For
                                  theorem Prod.lex_def {α : Type u} {β : Type v} {r : ααProp} {s : ββProp} {p q : α × β} :
                                  Prod.Lex r s p q r p.fst q.fst p.fst = q.fst s p.snd q.snd
                                  @[implicit_reducible]
                                  instance Prod.Lex.instDecidableRelOfDecidableEq {α : Type u} {β : Type v} [αeqDec : DecidableEq α] {r : ααProp} [rDec : DecidableRel r] {s : ββProp} [sDec : DecidableRel s] :
                                  theorem Prod.Lex.right' {β : Type v} (rb : ββProp) {a₂ : Nat} {b₂ : β} {a₁ : Nat} {b₁ : β} (h₁ : a₁ a₂) (h₂ : rb b₁ b₂) :
                                  Prod.Lex Nat.lt rb (a₁, b₁) (a₂, b₂)
                                  inductive Prod.RProd {α : Type u} {β : Type v} (ra : ααProp) (rb : ββProp) :
                                  α × βα × βProp
                                  • intro {α : Type u} {β : Type v} {ra : ααProp} {rb : ββProp} {a₁ : α} {b₁ : β} {a₂ : α} {b₂ : β} (h₁ : ra a₁ a₂) (h₂ : rb b₁ b₂) : RProd ra rb (a₁, b₁) (a₂, b₂)
                                  Instances For
                                    theorem Prod.lexAccessible {α : Type u} {β : Type v} {ra : ααProp} {rb : ββProp} {a : α} (aca : Acc ra a) (acb : ∀ (b : β), Acc rb b) (b : β) :
                                    Acc (Prod.Lex ra rb) (a, b)
                                    @[reducible]
                                    def Prod.lex {α : Type u} {β : Type v} (ha : WellFoundedRelation α) (hb : WellFoundedRelation β) :
                                    Instances For
                                      @[implicit_reducible]
                                      theorem Prod.RProdSubLex {α : Type u} {β : Type v} {ra : ααProp} {rb : ββProp} (a b : α × β) (h : RProd ra rb a b) :
                                      Prod.Lex ra rb a b
                                      @[implicit_reducible]
                                      def Prod.rprod {α : Type u} {β : Type v} (ha : WellFoundedRelation α) (hb : WellFoundedRelation β) :
                                      Instances For
                                        inductive PSigma.Lex {α : Sort u} {β : αSort v} (r : ααProp) (s : (a : α) → β aβ aProp) :
                                        PSigma βPSigma βProp
                                        • left {α : Sort u} {β : αSort v} {r : ααProp} {s : (a : α) → β aβ aProp} {a₁ : α} (b₁ : β a₁) {a₂ : α} (b₂ : β a₂) : r a₁ a₂Lex r s a₁, b₁ a₂, b₂
                                        • right {α : Sort u} {β : αSort v} {r : ααProp} {s : (a : α) → β aβ aProp} (a : α) {b₁ b₂ : β a} : s a b₁ b₂Lex r s a, b₁ a, b₂
                                        Instances For
                                          theorem PSigma.lexAccessible {α : Sort u} {β : αSort v} {r : ααProp} {s : (a : α) → β aβ aProp} {a : α} (aca : Acc r a) (acb : ∀ (a : α), WellFounded (s a)) (b : β a) :
                                          Acc (Lex r s) a, b
                                          @[reducible]
                                          def PSigma.lex {α : Sort u} {β : αSort v} (ha : WellFoundedRelation α) (hb : (a : α) → WellFoundedRelation (β a)) :
                                          Instances For
                                            @[implicit_reducible]
                                            instance PSigma.instWellFoundedRelation {α : Sort u} {β : αSort v} [ha : WellFoundedRelation α] [hb : (a : α) → WellFoundedRelation (β a)] :
                                            def PSigma.lexNdep {α : Sort u} {β : Sort v} (r : ααProp) (s : ββProp) :
                                            (_ : α) ×' β(_ : α) ×' βProp
                                            Instances For
                                              theorem PSigma.lexNdepWf {α : Sort u} {β : Sort v} {r : ααProp} {s : ββProp} (ha : WellFounded r) (hb : WellFounded s) :
                                              inductive PSigma.RevLex {α : Sort u} {β : Sort v} (r : ααProp) (s : ββProp) :
                                              (_ : α) ×' β(_ : α) ×' βProp
                                              • left {α : Sort u} {β : Sort v} {r : ααProp} {s : ββProp} {a₁ a₂ : α} (b : β) : r a₁ a₂RevLex r s a₁, b a₂, b
                                              • right {α : Sort u} {β : Sort v} {r : ααProp} {s : ββProp} (a₁ : α) {b₁ : β} (a₂ : α) {b₂ : β} : s b₁ b₂RevLex r s a₁, b₁ a₂, b₂
                                              Instances For
                                                theorem PSigma.revLexAccessible {α : Sort u} {β : Sort v} {r : ααProp} {s : ββProp} {b : β} (acb : Acc s b) (aca : ∀ (a : α), Acc r a) (a : α) :
                                                Acc (RevLex r s) a, b
                                                theorem PSigma.revLex {α : Sort u} {β : Sort v} {r : ααProp} {s : ββProp} (ha : WellFounded r) (hb : WellFounded s) :
                                                def PSigma.SkipLeft (α : Type u) {β : Type v} (s : ββProp) :
                                                (_ : α) ×' β(_ : α) ×' βProp
                                                Instances For
                                                  @[implicit_reducible]
                                                  def PSigma.skipLeft (α : Type u) {β : Type v} (hb : WellFoundedRelation β) :
                                                  WellFoundedRelation ((_ : α) ×' β)
                                                  Instances For
                                                    theorem PSigma.mkSkipLeft {α : Type u} {β : Type v} {b₁ b₂ : β} {s : ββProp} (a₁ a₂ : α) (h : s b₁ b₂) :
                                                    SkipLeft α s a₁, b₁ a₂, b₂

                                                    Helper gadget that prevents reduction of Nat.eager n unless n evaluates to a ground term.

                                                    Instances For
                                                      def WellFounded.Nat.fix {α : Sort u} {motive : αSort v} (h : αNat) (F : (x : α) → ((y : α) → InvImage (fun (x1 x2 : Nat) => x1 < x2) h y xmotive y)motive x) (x : α) :
                                                      motive x

                                                      A well-founded fixpoint operator specialized for Nat-valued measures. Given a measure h, it expects its higher order function argument F to invoke its argument only on values y that are smaller than x with regard to h.

                                                      In contrast to WellFounded.fix, this fixpoint operator reduces on closed terms. (More precisely: when h x evaluates to a ground value)

                                                      Instances For
                                                        def WellFounded.Nat.fix.go {α : Sort u} {motive : αSort v} (h : αNat) (F : (x : α) → ((y : α) → InvImage (fun (x1 x2 : Nat) => x1 < x2) h y xmotive y)motive x) (fuel : Nat) (x : α) :
                                                        h x < fuelmotive x
                                                        Instances For
                                                          theorem WellFounded.Nat.fix.go_congr {α : Sort u} {motive : αSort v} (h : αNat) (F : (x : α) → ((y : α) → InvImage (fun (x1 x2 : Nat) => x1 < x2) h y xmotive y)motive x) (x : α) (fuel₁ fuel₂ : Nat) (h₁ : h x < fuel₁) (h₂ : h x < fuel₂) :
                                                          go h F fuel₁ x h₁ = go h F fuel₂ x h₂
                                                          theorem WellFounded.Nat.fix_eq {α : Sort u} {motive : αSort v} (h : αNat) (F : (x : α) → ((y : α) → InvImage (fun (x1 x2 : Nat) => x1 < x2) h y xmotive y)motive x) (x : α) :
                                                          fix h F x = F x fun (y : α) (x : InvImage (fun (x1 x2 : Nat) => x1 < x2) h y x) => fix h F y
                                                          def wfParam {α : Sort u} (a : α) :
                                                          α

                                                          The wfParam gadget is used internally during the construction of recursive functions by wellfounded recursion, to keep track of the parameter for which the automatic introduction of List.attach (or similar) is plausible.

                                                          Instances For
                                                            theorem ite_eq_dite {P : Prop} {α✝ : Sort u_1} {a b : α✝} [Decidable P] :
                                                            (if P then a else b) = if h : P then binderNameHint h () a else binderNameHint h () b

                                                            Reverse direction of dite_eq_ite. Used by the well-founded definition preprocessor to extend the context of a termination proof inside if-then-else with the condition.