Documentation

MathematicalLogic.Computability.Primrec

@[simp]
theorem ite_pos_iff {p : Prop} [Decidable p] :
(0 < if p then 1 else 0) p
@[simp]
theorem ite_zero_iff {p : Prop} [Decidable p] :
(0 = if p then 1 else 0) ¬p
@[simp]
theorem Nat.mul_pos_iff {a b : } :
0 < a * b 0 < a 0 < b
inductive Primrec :
Type
Instances For
    @[reducible, inline]
    abbrev Primrec.comp₀ {n : } (f : Primrec 0) :
    Equations
    Instances For
      @[reducible, inline]
      abbrev Primrec.comp₁ {n : } (f : Primrec 1) (g : Primrec n) :
      Equations
      Instances For
        @[reducible, inline]
        abbrev Primrec.comp₂ {n : } (f : Primrec 2) (g₁ g₂ : Primrec n) :
        Equations
        Instances For
          @[reducible, inline]
          abbrev Primrec.comp₃ {n : } (f : Primrec 3) (g₁ g₂ g₃ : Primrec n) :
          Equations
          Instances For
            @[reducible, inline]
            abbrev Primrec.comp₄ {n : } (f : Primrec 4) (g₁ g₂ g₃ g₄ : Primrec n) :
            Equations
            Instances For
              @[reducible, inline]
              abbrev Primrec.comp₅ {n : } (f : Primrec 5) (g₁ g₂ g₃ g₄ g₅ : Primrec n) :
              Equations
              Instances For
                @[reducible, inline]
                abbrev Primrec.comp₆ {n : } (f : Primrec 6) (g₁ g₂ g₃ g₄ g₅ g₆ : Primrec n) :
                Equations
                Instances For
                  @[reducible, inline]
                  abbrev Primrec.zero {n : } :
                  Equations
                  Instances For
                    def Primrec.eval {n : } :
                    Primrec nVec n
                    Equations
                    Instances For
                      @[simp]
                      theorem Primrec.const_eval {n n✝ : } {v : Vec n✝} :
                      (const n).eval v = n
                      @[simp]
                      theorem Primrec.succ_eval {v : Vec 1} :
                      @[simp]
                      theorem Primrec.proj_eval {n✝ : } {i : Fin n✝} {v : Vec n✝} :
                      (proj i).eval v = v i
                      @[simp]
                      theorem Primrec.comp_eval {a✝ : } {f : Primrec a✝} {a✝¹ : } {g : Fin a✝Primrec a✝¹} {v : Vec a✝¹} :
                      (f.comp g).eval v = f.eval fun (i : Fin a✝) => (g i).eval v
                      @[simp]
                      theorem Primrec.comp₀_eval {f : Primrec 0} {n✝ : } {v : Vec n✝} :
                      @[simp]
                      theorem Primrec.comp₁_eval {f : Primrec 1} {a✝ : } {g : Primrec a✝} {v : Vec a✝} :
                      (f.comp₁ g).eval v = f.eval [g.eval v]ᵥ
                      @[simp]
                      theorem Primrec.comp₂_eval {f : Primrec 2} {a✝ : } {g₁ g₂ : Primrec a✝} {v : Vec a✝} :
                      (f.comp₂ g₁ g₂).eval v = f.eval [g₁.eval v, g₂.eval v]ᵥ
                      @[simp]
                      theorem Primrec.comp₃_eval {f : Primrec 3} {a✝ : } {g₁ g₂ g₃ : Primrec a✝} {v : Vec a✝} :
                      (f.comp₃ g₁ g₂ g₃).eval v = f.eval [g₁.eval v, g₂.eval v, g₃.eval v]ᵥ
                      @[simp]
                      theorem Primrec.comp₄_eval {f : Primrec 4} {a✝ : } {g₁ g₂ g₃ g₄ : Primrec a✝} {v : Vec a✝} :
                      (f.comp₄ g₁ g₂ g₃ g₄).eval v = f.eval [g₁.eval v, g₂.eval v, g₃.eval v, g₄.eval v]ᵥ
                      theorem Primrec.prec_eval {a✝ : } {f : Primrec a✝} {g : Primrec (a✝ + 2)} {v : Vec (a✝ + 1)} :
                      (f.prec g).eval v = Nat.recOn v.head (f.eval v.tail) fun (n ih : ) => g.eval (n ∷ᵥ ih ∷ᵥ v.tail)
                      theorem Primrec.prec_eval_zero {a✝ : } {f : Primrec a✝} {g : Primrec (a✝ + 2)} {v : Vec a✝} :
                      (f.prec g).eval (0 ∷ᵥ v) = f.eval v
                      theorem Primrec.prec_eval_succ {a✝ : } {f : Primrec a✝} {g : Primrec (a✝ + 2)} {n : } {v : Vec a✝} :
                      (f.prec g).eval ((n + 1) ∷ᵥ v) = g.eval (n ∷ᵥ (f.prec g).eval (n ∷ᵥ v) ∷ᵥ v)
                      Equations
                      Instances For
                        @[simp]
                        theorem Primrec.id_eval {v : Vec 1} :
                        id.eval v = v 0
                        def Primrec.swap {n : } (f : Primrec (n + 2)) :
                        Primrec (n + 2)
                        Equations
                        Instances For
                          @[simp]
                          theorem Primrec.swap_eval {a✝ : } {f : Primrec (a✝ + 2)} {v : Vec (a✝ + 2)} :
                          f.swap.eval v = f.eval (v 1 ∷ᵥ v 0 ∷ᵥ v.tail.tail)
                          def Primrec.cases {n : } (f : Primrec n) (g : Primrec (n + 1)) :
                          Primrec (n + 1)
                          Equations
                          Instances For
                            theorem Primrec.cases_eval {a✝ : } {f : Primrec a✝} {g : Primrec (a✝ + 1)} {v : Vec (a✝ + 1)} :
                            (f.cases g).eval v = Nat.casesOn v.head (f.eval v.tail) fun (n : ) => g.eval (n ∷ᵥ v.tail)
                            theorem Primrec.cases_eval_zero {a✝ : } {f : Primrec a✝} {g : Primrec (a✝ + 1)} {v : Vec a✝} :
                            (f.cases g).eval (0 ∷ᵥ v) = f.eval v
                            theorem Primrec.cases_eval_succ {a✝ : } {f : Primrec a✝} {g : Primrec (a✝ + 1)} {n : } {v : Vec a✝} :
                            (f.cases g).eval ((n + 1) ∷ᵥ v) = g.eval (n ∷ᵥ v)
                            @[simp]
                            theorem Primrec.add_eval {v : Vec 2} :
                            add.eval v = v 0 + v 1
                            @[simp]
                            theorem Primrec.mul_eval {v : Vec 2} :
                            mul.eval v = v 0 * v 1
                            @[simp]
                            theorem Primrec.exp_eval {v : Vec 2} :
                            exp.eval v = v 0 ^ v 1
                            @[simp]
                            theorem Primrec.pred_eval {v : Vec 1} :
                            pred.eval v = (v 0).pred
                            @[simp]
                            theorem Primrec.sub_eval {v : Vec 2} :
                            sub.eval v = v 0 - v 1
                            @[simp]
                            theorem Primrec.sign_eval {v : Vec 1} :
                            sign.eval v = if 0 < v 0 then 1 else 0
                            @[simp]
                            theorem Primrec.nsign_eval {v : Vec 1} :
                            nsign.eval v = if v 0 = 0 then 1 else 0
                            def Primrec.not {n : } (f : Primrec n) :
                            Equations
                            Instances For
                              @[simp]
                              theorem Primrec.not_eval_pos_iff {a✝ : } {f : Primrec a✝} {v : Vec a✝} :
                              0 < f.not.eval v f.eval v = 0
                              @[simp]
                              theorem Primrec.not_eval_zero_iff {a✝ : } {f : Primrec a✝} {v : Vec a✝} :
                              f.not.eval v = 0 0 < f.eval v
                              def Primrec.and {n : } (f g : Primrec n) :
                              Equations
                              Instances For
                                @[simp]
                                theorem Primrec.and_eval_pos_iff {a✝ : } {f g : Primrec a✝} {v : Vec a✝} :
                                0 < (f.and g).eval v 0 < f.eval v 0 < g.eval v
                                @[simp]
                                theorem Primrec.and_eval_zero_iff {a✝ : } {f g : Primrec a✝} {v : Vec a✝} :
                                (f.and g).eval v = 0 f.eval v = 0 g.eval v = 0
                                def Primrec.andv {n m : } (f : Vec (Primrec n) m) :
                                Equations
                                Instances For
                                  @[simp]
                                  theorem Primrec.andv_eval_pos_iff {n m : } {v : Vec n} {f : Vec (Primrec n) m} :
                                  0 < (andv f).eval v ∀ (i : Fin m), 0 < (f i).eval v
                                  @[simp]
                                  theorem Primrec.andv_eval_zero_iff {n m : } {v : Vec n} {f : Vec (Primrec n) m} :
                                  (andv f).eval v = 0 ∃ (i : Fin m), (f i).eval v = 0
                                  def Primrec.or {n : } (f g : Primrec n) :
                                  Equations
                                  Instances For
                                    @[simp]
                                    theorem Primrec.or_eval_pos_iff {a✝ : } {f g : Primrec a✝} {v : Vec a✝} :
                                    0 < (f.or g).eval v 0 < f.eval v 0 < g.eval v
                                    @[simp]
                                    theorem Primrec.or_eval_zero_iff {a✝ : } {f g : Primrec a✝} {v : Vec a✝} :
                                    (f.or g).eval v = 0 f.eval v = 0 g.eval v = 0
                                    def Primrec.orv {n m : } (f : Vec (Primrec n) m) :
                                    Equations
                                    Instances For
                                      @[simp]
                                      theorem Primrec.orv_eval_pos_iff {n m : } {v : Vec n} {f : Vec (Primrec n) m} :
                                      0 < (orv f).eval v ∃ (i : Fin m), 0 < (f i).eval v
                                      @[simp]
                                      theorem Primrec.orv_eval_zero_iff {n m : } {v : Vec n} {f : Vec (Primrec n) m} :
                                      (orv f).eval v = 0 ∀ (i : Fin m), (f i).eval v = 0
                                      def Primrec.lt {n : } (f g : Primrec n) :
                                      Equations
                                      Instances For
                                        @[simp]
                                        theorem Primrec.lt_eval_pos_iff {a✝ : } {f g : Primrec a✝} {v : Vec a✝} :
                                        0 < (f.lt g).eval v f.eval v < g.eval v
                                        @[simp]
                                        theorem Primrec.lt_eval_zero_iff {a✝ : } {f g : Primrec a✝} {v : Vec a✝} :
                                        (f.lt g).eval v = 0 g.eval v f.eval v
                                        @[reducible, inline]
                                        abbrev Primrec.gt {n : } (f g : Primrec n) :
                                        Equations
                                        Instances For
                                          def Primrec.le {n : } (f g : Primrec n) :
                                          Equations
                                          Instances For
                                            @[simp]
                                            theorem Primrec.le_eval_pos_iff {a✝ : } {f g : Primrec a✝} {v : Vec a✝} :
                                            0 < (f.le g).eval v f.eval v g.eval v
                                            @[simp]
                                            theorem Primrec.le_eval_zero_iff {a✝ : } {f g : Primrec a✝} {v : Vec a✝} :
                                            (f.le g).eval v = 0 g.eval v < f.eval v
                                            @[reducible, inline]
                                            abbrev Primrec.ge {n : } (f g : Primrec n) :
                                            Equations
                                            Instances For
                                              def Primrec.eq {n : } (f g : Primrec n) :
                                              Equations
                                              Instances For
                                                @[simp]
                                                theorem Primrec.eq_eval_pos_iff {a✝ : } {f g : Primrec a✝} {v : Vec a✝} :
                                                0 < (f.eq g).eval v f.eval v = g.eval v
                                                @[simp]
                                                theorem Primrec.eq_eval_zero_iff {a✝ : } {f g : Primrec a✝} {v : Vec a✝} :
                                                (f.eq g).eval v = 0 f.eval v g.eval v
                                                @[reducible, inline]
                                                abbrev Primrec.ne {n : } (f g : Primrec n) :
                                                Equations
                                                Instances For
                                                  @[simp]
                                                  theorem Primrec.cond_eval {v : Vec 3} :
                                                  cond.eval v = if 0 < v 0 then v 1 else v 2
                                                  def Primrec.ite {n : } (f g h : Primrec n) :
                                                  Equations
                                                  Instances For
                                                    @[simp]
                                                    theorem Primrec.ite_eval {a✝ : } {f g h : Primrec a✝} {v : Vec a✝} :
                                                    (f.ite g h).eval v = if 0 < f.eval v then g.eval v else h.eval v
                                                    @[simp]
                                                    theorem Primrec.odd_eval {v : Vec 1} :
                                                    odd.eval v = if (v 0).bodd = true then 1 else 0
                                                    @[simp]
                                                    theorem Primrec.div2_eval {v : Vec 1} :
                                                    div2.eval v = (v 0).div2
                                                    Equations
                                                    • One or more equations did not get rendered due to their size.
                                                    Instances For
                                                      @[simp]
                                                      theorem Primrec.mod_eval {v : Vec 2} :
                                                      mod.eval v = v 0 % v 1
                                                      @[simp]
                                                      theorem Primrec.max_eval {v : Vec 2} :
                                                      max.eval v = (v 0).max (v 1)
                                                      Equations
                                                      • One or more equations did not get rendered due to their size.
                                                      Instances For
                                                        @[simp]
                                                        theorem Primrec.pair_eval {v : Vec 2} :
                                                        pair.eval v = Nat.pair (v 0) (v 1)
                                                        Equations
                                                        • One or more equations did not get rendered due to their size.
                                                        Instances For
                                                          @[simp]
                                                          theorem Primrec.sqrt_eval {v : Vec 1} :
                                                          sqrt.eval v = (v 0).sqrt
                                                          Equations
                                                          • One or more equations did not get rendered due to their size.
                                                          Instances For
                                                            @[simp]
                                                            theorem Primrec.fst_eval {v : Vec 1} :
                                                            fst.eval v = (Nat.unpair (v 0)).1
                                                            Equations
                                                            • One or more equations did not get rendered due to their size.
                                                            Instances For
                                                              @[simp]
                                                              theorem Primrec.snd_eval {v : Vec 1} :
                                                              snd.eval v = (Nat.unpair (v 0)).2
                                                              def Primrec.paired {n : } (f : Primrec (n + 1)) :
                                                              Primrec (n + 2)
                                                              Equations
                                                              Instances For
                                                                @[simp]
                                                                theorem Primrec.paired_eval {a✝ : } {f : Primrec (a✝ + 1)} {v : Vec (a✝ + 2)} :
                                                                f.paired.eval v = f.eval (Nat.pair (v 0) (v 1) ∷ᵥ v.tail.tail)
                                                                def Primrec.unpaired {n : } (f : Primrec (n + 2)) :
                                                                Primrec (n + 1)
                                                                Equations
                                                                Instances For
                                                                  @[simp]
                                                                  theorem Primrec.unpaired_eval {a✝ : } {f : Primrec (a✝ + 2)} {v : Vec (a✝ + 1)} :
                                                                  f.unpaired.eval v = f.eval ((Nat.unpair (v 0)).1 ∷ᵥ (Nat.unpair (v 0)).2 ∷ᵥ v.tail)
                                                                  def Primrec.iterate {n : } (f : Primrec (n + 1)) :
                                                                  Primrec (n + 2)
                                                                  Equations
                                                                  Instances For
                                                                    theorem Primrec.iterate_eval {a✝ : } {f : Primrec (a✝ + 1)} {n x : } {v : Vec a✝} :
                                                                    f.iterate.eval (n ∷ᵥ x ∷ᵥ v) = (fun (x : ) => f.eval (x ∷ᵥ v))^[n] x
                                                                    theorem Primrec.vget_eval {n : } {v : Vec n} {i : Fin n} :
                                                                    vget.eval [v.paired, i]ᵥ = v i
                                                                    theorem Primrec.vget_eval' {n i : } {v : Vec n} (h : i < n) :
                                                                    theorem Primrec.isvec_eval_pos_iff {n k : } :
                                                                    0 < isvec.eval [n, k]ᵥ ∃ (v : Vec n), k = v.paired
                                                                    def Primrec.vmk {n : } (f : Primrec (n + 1)) :
                                                                    Primrec (n + 1)
                                                                    Equations
                                                                    • One or more equations did not get rendered due to their size.
                                                                    Instances For
                                                                      theorem Primrec.vmk_eval {a✝ : } {f : Primrec (a✝ + 1)} {n : } {v : Vec a✝} :
                                                                      f.vmk.eval (n ∷ᵥ v) = Vec.paired fun (i : Fin n) => f.eval (i ∷ᵥ v)
                                                                      def Primrec.vmap {n : } (f : Primrec (n + 1)) :
                                                                      Primrec (n + 2)
                                                                      Equations
                                                                      Instances For
                                                                        theorem Primrec.vmap_eval {n a✝ : } {f : Primrec (a✝ + 1)} {w : Vec a✝} {v : Vec n} :
                                                                        f.vmap.eval (n ∷ᵥ v.paired ∷ᵥ w) = Vec.paired fun (i : Fin n) => f.eval (v i ∷ᵥ w)
                                                                        Equations
                                                                        • One or more equations did not get rendered due to their size.
                                                                        Instances For
                                                                          theorem Primrec.rcons_eval {n x : } {v : Vec n} :
                                                                          def Primrec.cov {n : } (f : Primrec (n + 2)) :
                                                                          Primrec (n + 1)
                                                                          Equations
                                                                          Instances For
                                                                            theorem Primrec.cov_eval {n m : } {v : Vec n} {f : Primrec (n + 2)} :
                                                                            f.cov.eval (m ∷ᵥ v) = Vec.paired fun (i : Fin m) => f.eval (i ∷ᵥ f.cov.eval (i ∷ᵥ v) ∷ᵥ v)
                                                                            def Primrec.covrec {n : } (f : Primrec (n + 2)) :
                                                                            Primrec (n + 1)
                                                                            Equations
                                                                            Instances For
                                                                              theorem Primrec.covrec_eval {n m : } {v : Vec n} {f : Primrec (n + 2)} :
                                                                              f.covrec.eval (m ∷ᵥ v) = f.eval (m ∷ᵥ (Vec.paired fun (i : Fin m) => f.covrec.eval (i ∷ᵥ v)) ∷ᵥ v)
                                                                              Equations
                                                                              • One or more equations did not get rendered due to their size.
                                                                              Instances For
                                                                                @[simp]
                                                                                theorem Primrec.div_eval {v : Vec 2} :
                                                                                div.eval v = v 0 / v 1
                                                                                Equations
                                                                                • One or more equations did not get rendered due to their size.
                                                                                Instances For
                                                                                  theorem Primrec.vmap'_eval {n m : } {v : Vec n} {f : Vec m} (h : ∀ (i : Fin n), v i < m) :
                                                                                  vmap'.eval [n, v.paired, f.paired]ᵥ = Vec.paired fun (i : Fin n) => f v i,
                                                                                  Equations
                                                                                  • One or more equations did not get rendered due to their size.
                                                                                  Instances For
                                                                                    theorem Primrec.vand_eval_pos_iff {n : } {v : Vec n} :
                                                                                    0 < vand.eval [n, v.paired]ᵥ ∀ (i : Fin n), v i > 0
                                                                                    def Primrec.bdMu {n : } (f : Primrec (n + 1)) :
                                                                                    Primrec (n + 1)
                                                                                    Equations
                                                                                    • One or more equations did not get rendered due to their size.
                                                                                    Instances For
                                                                                      theorem Primrec.bdMu_eval_le_self {a✝ : } {f : Primrec (a✝ + 1)} {m : } {v : Vec a✝} :
                                                                                      f.bdMu.eval (m ∷ᵥ v) m
                                                                                      theorem Primrec.bdMu_eval_gt {k a✝ : } {f : Primrec (a✝ + 1)} {m : } {v : Vec a✝} :
                                                                                      k < f.bdMu.eval (m ∷ᵥ v)f.eval (k ∷ᵥ v) = 0
                                                                                      theorem Primrec.bdMu_eval_lt_self {a✝ : } {f : Primrec (a✝ + 1)} {m : } {v : Vec a✝} :
                                                                                      f.bdMu.eval (m ∷ᵥ v) < mf.eval (f.bdMu.eval (m ∷ᵥ v) ∷ᵥ v) > 0
                                                                                      theorem Primrec.bdMu_eval_lt_self_iff {a✝ : } {f : Primrec (a✝ + 1)} {m : } {v : Vec a✝} :
                                                                                      f.bdMu.eval (m ∷ᵥ v) < m k < m, f.eval (k ∷ᵥ v) > 0
                                                                                      theorem Primrec.bdMu_eval_eq {n m n✝ : } {v : Vec n✝} {f : Primrec (n✝ + 1)} :
                                                                                      n m(∀ k < n, f.eval (k ∷ᵥ v) = 0)f.eval (n ∷ᵥ v) > 0f.bdMu.eval (m ∷ᵥ v) = n
                                                                                      def Primrec.bdExists {n : } (f : Primrec n) (g : Primrec (n + 1)) :
                                                                                      Equations
                                                                                      Instances For
                                                                                        @[simp]
                                                                                        theorem Primrec.bdExists_eval_pos_iff {a✝ : } {f : Primrec a✝} {g : Primrec (a✝ + 1)} {v : Vec a✝} :
                                                                                        0 < (f.bdExists g).eval v k < f.eval v, 0 < g.eval (k ∷ᵥ v)
                                                                                        @[simp]
                                                                                        theorem Primrec.bdExists_eval_zero_iff {a✝ : } {f : Primrec a✝} {g : Primrec (a✝ + 1)} {v : Vec a✝} :
                                                                                        (f.bdExists g).eval v = 0 k < f.eval v, g.eval (k ∷ᵥ v) = 0
                                                                                        def Primrec.bdForall {n : } (f : Primrec n) (g : Primrec (n + 1)) :
                                                                                        Equations
                                                                                        Instances For
                                                                                          @[simp]
                                                                                          theorem Primrec.bdForall_eval_pos_iff {a✝ : } {f : Primrec a✝} {g : Primrec (a✝ + 1)} {v : Vec a✝} :
                                                                                          0 < (f.bdForall g).eval v k < f.eval v, 0 < g.eval (k ∷ᵥ v)
                                                                                          @[simp]
                                                                                          theorem Primrec.bdForall_eval_zero_iff {a✝ : } {f : Primrec a✝} {g : Primrec (a✝ + 1)} {v : Vec a✝} :
                                                                                          (f.bdForall g).eval v = 0 k < f.eval v, g.eval (k ∷ᵥ v) = 0
                                                                                          def Primrec.repr {n : } :
                                                                                          Equations
                                                                                          Instances For
                                                                                            instance Primrec.instRepr {n : } :
                                                                                            Equations