Documentation

Auto.Embedding.LamConv

def Auto.Embedding.Lam.LamWF.app_bvarLift_bvar0 {ltv : LamTyVal} {lctx : NatLamSort} {t : LamTerm} {argTy resTy : LamSort} (wft : LamWF ltv { lctx := lctx, rterm := t, rty := argTy.func resTy }) :
LamWF ltv { lctx := pushLCtx argTy lctx, rterm := LamTerm.app_bvarLift_bvar0 argTy t, rty := resTy }
Equations
Instances For
    theorem Auto.Embedding.Lam.LamWF.interp_app_bvarLift_bvar0 {lctx : NatLamSort} {t : LamTerm} {argTy resTy : LamSort} {lval : LamValuation} {x : LamSort.interp lval.tyVal argTy} {lctxTerm : (n : Nat) → LamSort.interp lval.tyVal (lctx n)} (wft : LamWF lval.toLamTyVal { lctx := lctx, rterm := t, rty := argTy.func resTy }) :
    interp lval (pushLCtx argTy lctx) (pushLCtxDep x lctxTerm) wft.app_bvarLift_bvar0 = interp lval lctx lctxTerm wft x
    def Auto.Embedding.Lam.LamWF.etaExpand1 {ltv : LamTyVal} {lctx : NatLamSort} {t : LamTerm} {argTy resTy : LamSort} (wft : LamWF ltv { lctx := lctx, rterm := t, rty := argTy.func resTy }) :
    LamWF ltv { lctx := lctx, rterm := LamTerm.etaExpand1 argTy t, rty := argTy.func resTy }
    Equations
    Instances For
      theorem Auto.Embedding.Lam.LamEquiv.etaExpand1 {lctx : NatLamSort} {t : LamTerm} {argTy resTy : LamSort} {lval : LamValuation} (wft : LamWF lval.toLamTyVal { lctx := lctx, rterm := t, rty := argTy.func resTy }) :
      LamEquiv lval lctx (argTy.func resTy) t (LamTerm.etaExpand1 argTy t)

      This is meant to eta-expand a term t which has type argTys₀ → ⋯ → argTysᵢ₋₁ → resTy

      Equations
      Instances For
        theorem Auto.Embedding.Lam.LamTerm.etaExpandAux_cons {argTy : LamSort} {argTys : List LamSort} {t : LamTerm} :
        etaExpandAux (argTy :: argTys) t = etaExpandAux argTys (app argTy t.bvarLift (bvar 0))
        theorem Auto.Embedding.Lam.LamTerm.etaExpandAux_append {argTys₁ argTys₂ : List LamSort} {t : LamTerm} :
        etaExpandAux (argTys₁ ++ argTys₂) t = etaExpandAux argTys₂ (etaExpandAux argTys₁ t)
        theorem Auto.Embedding.Lam.LamTerm.etaExpandAux_append_singleton {argTys₁ : List LamSort} {argTy : LamSort} {t : LamTerm} :
        etaExpandAux (argTys₁ ++ [argTy]) t = app argTy (etaExpandAux argTys₁ t).bvarLift (bvar 0)
        def Auto.Embedding.Lam.LamWF.etaExpandAux {ltv : LamTyVal} {lctx : NatLamSort} {t : LamTerm} {resTy : LamSort} {argTys : List LamSort} (wft : LamWF ltv { lctx := lctx, rterm := t, rty := resTy.mkFuncs argTys }) :
        LamWF ltv { lctx := pushLCtxs argTys.reverse lctx, rterm := LamTerm.etaExpandAux argTys t, rty := resTy }
        Equations
        Instances For
          def Auto.Embedding.Lam.LamWF.fromEtaExpandAux {ltv : LamTyVal} {lctx : NatLamSort} {resTy : LamSort} {t : LamTerm} {argTys : List LamSort} (wft : LamWF ltv { lctx := pushLCtxs argTys.reverse lctx, rterm := LamTerm.etaExpandAux argTys t, rty := resTy }) :
          LamWF ltv { lctx := lctx, rterm := t, rty := resTy.mkFuncs argTys }
          Equations
          Instances For
            def Auto.Embedding.Lam.LamWF.etaExpandWith {ltv : LamTyVal} {lctx : NatLamSort} {t : LamTerm} {s : LamSort} {l : List LamSort} (wft : LamWF ltv { lctx := lctx, rterm := t, rty := s.mkFuncs l }) :
            LamWF ltv { lctx := lctx, rterm := LamTerm.etaExpandWith l t, rty := s.mkFuncs l }
            Equations
            Instances For
              def Auto.Embedding.Lam.LamWF.fromEtaExpandWith {ltv : LamTyVal} {lctx : NatLamSort} {s : LamSort} {t : LamTerm} {l : List LamSort} (wft : LamWF ltv { lctx := lctx, rterm := LamTerm.etaExpandWith l t, rty := s }) :
              LamWF ltv { lctx := lctx, rterm := t, rty := s }
              Equations
              • One or more equations did not get rendered due to their size.
              Instances For
                theorem Auto.Embedding.Lam.LamEquiv.etaExpandWith {lctx : NatLamSort} {t : LamTerm} {s : LamSort} {lval : LamValuation} {l : List LamSort} (wft : LamWF lval.toLamTyVal { lctx := lctx, rterm := t, rty := s.mkFuncs l }) :
                LamEquiv lval lctx (s.mkFuncs l) t (LamTerm.etaExpandWith l t)
                def Auto.Embedding.Lam.LamWF.etaExpand {ltv : LamTyVal} {lctx : NatLamSort} {t : LamTerm} {s : LamSort} (wft : LamWF ltv { lctx := lctx, rterm := t, rty := s }) :
                LamWF ltv { lctx := lctx, rterm := LamTerm.etaExpand s t, rty := s }
                Equations
                Instances For
                  def Auto.Embedding.Lam.LamWF.fromEtaExpand {ltv : LamTyVal} {lctx : NatLamSort} {s : LamSort} {t : LamTerm} (wfEx : LamWF ltv { lctx := lctx, rterm := LamTerm.etaExpand s t, rty := s }) :
                  LamWF ltv { lctx := lctx, rterm := t, rty := s }
                  Equations
                  Instances For
                    theorem Auto.Embedding.Lam.LamEquiv.etaExpand {lctx : NatLamSort} {t : LamTerm} {s : LamSort} {lval : LamValuation} (wft : LamWF lval.toLamTyVal { lctx := lctx, rterm := t, rty := s }) :
                    LamEquiv lval lctx s t (LamTerm.etaExpand s t)
                    @[irreducible]
                    def Auto.Embedding.Lam.LamWF.etaExpandN? {n : Nat} {s : LamSort} {t t' : LamTerm} {ltv : LamTyVal} {lctx : NatLamSort} (heq : LamTerm.etaExpandN? n s t = some t') (wft : LamWF ltv { lctx := lctx, rterm := t, rty := s }) :
                    LamWF ltv { lctx := lctx, rterm := t', rty := s }
                    Equations
                    • One or more equations did not get rendered due to their size.
                    Instances For
                      @[irreducible]
                      def Auto.Embedding.Lam.LamWF.fromEtaExpandN? {n : Nat} {s : LamSort} {t t' : LamTerm} {ltv : LamTyVal} {lctx : NatLamSort} (heq : LamTerm.etaExpandN? n s t = some t') (wfEx : LamWF ltv { lctx := lctx, rterm := t', rty := s }) :
                      LamWF ltv { lctx := lctx, rterm := t, rty := s }
                      Equations
                      • One or more equations did not get rendered due to their size.
                      Instances For
                        theorem Auto.Embedding.Lam.LamEquiv.etaExpandN? {lctx : NatLamSort} {t : LamTerm} {s : LamSort} {n : Nat} {t' : LamTerm} {lval : LamValuation} (wft : LamWF lval.toLamTyVal { lctx := lctx, rterm := t, rty := s }) (heq : LamTerm.etaExpandN? n s t = some t') :
                        LamEquiv lval lctx s t t'
                        Equations
                        • One or more equations did not get rendered due to their size.
                        • t.etaReduce1? = none
                        Instances For
                          theorem Auto.Embedding.Lam.LamEquiv.etaReduce1? {lctx : NatLamSort} {t : LamTerm} {rty : LamSort} {t' : LamTerm} {lval : LamValuation} (wft : LamWF lval.toLamTyVal { lctx := lctx, rterm := t, rty := rty }) (heq : t.etaReduce1? = some t') :
                          LamEquiv lval lctx rty t t'
                          Equations
                          • One or more equations did not get rendered due to their size.
                          Instances For
                            Equations
                            • One or more equations did not get rendered due to their size.
                            Instances For
                              theorem Auto.Embedding.Lam.LamEquiv.etaReduceN? {lctx : NatLamSort} {t : LamTerm} {rty : LamSort} {n : Nat} {t' : LamTerm} {lval : LamValuation} (wft : LamWF lval.toLamTyVal { lctx := lctx, rterm := t, rty := rty }) (heq : LamTerm.etaReduceN? n t = some t') :
                              LamEquiv lval lctx rty t t'
                              Equations
                              • One or more equations did not get rendered due to their size.
                              Instances For
                                def Auto.Embedding.Lam.LamWF.extensionalizeEqFWith {ltv : LamTyVal} {lctx : NatLamSort} {lhs : LamTerm} {s : LamSort} {l : List LamSort} {rhs : LamTerm} (wfl : LamWF ltv { lctx := lctx, rterm := lhs, rty := s.mkFuncs l }) (wfr : LamWF ltv { lctx := lctx, rterm := rhs, rty := s.mkFuncs l }) :
                                LamWF ltv { lctx := lctx, rterm := LamTerm.extensionalizeEqFWith l s lhs rhs, rty := LamSort.base LamBaseSort.prop }
                                Equations
                                Instances For
                                  theorem Auto.Embedding.Lam.LamEquiv.ofExtensionalizeEqFWith {lctx : NatLamSort} {lhs : LamTerm} {s : LamSort} {rhs : LamTerm} {lval : LamValuation} {l : List LamSort} (wfl : LamWF lval.toLamTyVal { lctx := lctx, rterm := lhs, rty := s.mkFuncs l }) (wfr : LamWF lval.toLamTyVal { lctx := lctx, rterm := rhs, rty := s.mkFuncs l }) :
                                  def Auto.Embedding.Lam.LamWF.extensionalizeEqF {ltv : LamTyVal} {lctx : NatLamSort} {s : LamSort} {lhs rhs : LamTerm} {s' : LamSort} (wf : LamWF ltv { lctx := lctx, rterm := LamTerm.mkEq s lhs rhs, rty := s' }) :
                                  LamWF ltv { lctx := lctx, rterm := LamTerm.extensionalizeEqF s lhs rhs, rty := LamSort.base LamBaseSort.prop }
                                  Equations
                                  • One or more equations did not get rendered due to their size.
                                  Instances For
                                    theorem Auto.Embedding.Lam.LamEquiv.ofExtensionalizeEqF {lctx : NatLamSort} {s : LamSort} {lhs rhs : LamTerm} {s' : LamSort} {lval : LamValuation} (wf : LamWF lval.toLamTyVal { lctx := lctx, rterm := LamTerm.mkEq s lhs rhs, rty := s' }) :
                                    Equations
                                    Instances For
                                      def Auto.Embedding.Lam.LamWF.extensionalizeEq?F? {ltv : LamTyVal} {lctx : NatLamSort} {t : LamTerm} {s : LamSort} {t' : LamTerm} (wft : LamWF ltv { lctx := lctx, rterm := t, rty := s }) (heq : t.extensionalizeEq?F? = some t') :
                                      LamWF ltv { lctx := lctx, rterm := t', rty := LamSort.base LamBaseSort.prop }
                                      Equations
                                      • One or more equations did not get rendered due to their size.
                                      Instances For
                                        theorem Auto.Embedding.Lam.LamEquiv.ofExtensionalizeEq?F? {lctx : NatLamSort} {t : LamTerm} {s : LamSort} {t' : LamTerm} {lval : LamValuation} (wft : LamWF lval.toLamTyVal { lctx := lctx, rterm := t, rty := s }) (heq : t.extensionalizeEq?F? = some t') :
                                        Equations
                                        • One or more equations did not get rendered due to their size.
                                        Instances For
                                          def Auto.Embedding.Lam.LamWF.extensionalizeEqFN? {ltv : LamTyVal} {lctx : NatLamSort} {s : LamSort} {lhs rhs : LamTerm} {s' : LamSort} {n : Nat} {t' : LamTerm} (wf : LamWF ltv { lctx := lctx, rterm := LamTerm.mkEq s lhs rhs, rty := s' }) (heq : LamTerm.extensionalizeEqFN? n s lhs rhs = some t') :
                                          LamWF ltv { lctx := lctx, rterm := t', rty := LamSort.base LamBaseSort.prop }
                                          Equations
                                          • One or more equations did not get rendered due to their size.
                                          Instances For
                                            theorem Auto.Embedding.Lam.LamEquiv.ofExtensionalizeEqFN? {lctx : NatLamSort} {s : LamSort} {lhs rhs : LamTerm} {s' : LamSort} {n : Nat} {t' : LamTerm} {lval : LamValuation} (wft : LamWF lval.toLamTyVal { lctx := lctx, rterm := LamTerm.mkEq s lhs rhs, rty := s' }) (heq : LamTerm.extensionalizeEqFN? n s lhs rhs = some t') :
                                            Equations
                                            Instances For
                                              def Auto.Embedding.Lam.LamWF.extensionalizeEq?FN? {ltv : LamTyVal} {lctx : NatLamSort} {t : LamTerm} {s : LamSort} {n : Nat} {t' : LamTerm} (wft : LamWF ltv { lctx := lctx, rterm := t, rty := s }) (heq : LamTerm.extensionalizeEq?FN? n t = some t') :
                                              LamWF ltv { lctx := lctx, rterm := t', rty := LamSort.base LamBaseSort.prop }
                                              Equations
                                              • One or more equations did not get rendered due to their size.
                                              Instances For
                                                theorem Auto.Embedding.Lam.LamWF.s_eq_prop_of_extensionalizeEq?FN?_eq_some {ltv : LamTyVal} {lctx : NatLamSort} {t : LamTerm} {s : LamSort} {n : Nat} {t' : LamTerm} (wft : LamWF ltv { lctx := lctx, rterm := t, rty := s }) (heq : LamTerm.extensionalizeEq?FN? n t = some t') :
                                                theorem Auto.Embedding.Lam.LamEquiv.ofExtensionalizeEq?FN? {lctx : NatLamSort} {t : LamTerm} {s : LamSort} {n : Nat} {t' : LamTerm} {lval : LamValuation} (wft : LamWF lval.toLamTyVal { lctx := lctx, rterm := t, rty := s }) (heq : LamTerm.extensionalizeEq?FN? n t = some t') :
                                                Equations
                                                Instances For
                                                  def Auto.Embedding.Lam.LamWF.extensionalizeEq {ltv : LamTyVal} {lctx : NatLamSort} {t : LamTerm} {s : LamSort} (wf : LamWF ltv { lctx := lctx, rterm := t, rty := s }) :
                                                  LamWF ltv { lctx := lctx, rterm := t.extensionalizeEq, rty := s }
                                                  Equations
                                                  • One or more equations did not get rendered due to their size.
                                                  Instances For
                                                    theorem Auto.Embedding.Lam.LamEquiv.ofExtensionalizeEq {lctx : NatLamSort} {t : LamTerm} {s : LamSort} {lval : LamValuation} (wf : LamWF lval.toLamTyVal { lctx := lctx, rterm := t, rty := s }) :
                                                    LamEquiv lval lctx s t t.extensionalizeEq
                                                    theorem Auto.Embedding.Lam.LamEquiv.ofExtensionalize {lctx : NatLamSort} {t : LamTerm} {s : LamSort} {isAppFn : Bool} {lval : LamValuation} (wf : LamWF lval.toLamTyVal { lctx := lctx, rterm := t, rty := s }) :
                                                    LamEquiv lval lctx s t (LamTerm.extensionalizeAux isAppFn t)
                                                    theorem Auto.Embedding.Lam.LamThmEquiv.ofExtensionalize {lval : LamValuation} {lctx : List LamSort} {s : LamSort} {t : LamTerm} {isAppFn : Bool} (wf : LamThmWF lval lctx s t) :
                                                    LamThmEquiv lval lctx s t (LamTerm.extensionalizeAux isAppFn t)
                                                    def Auto.Embedding.Lam.LamWF.intensionalizeEq1 {ltv : LamTyVal} {argTy : LamSort} {lctx : NatLamSort} {s : LamSort} {lhs rhs : LamTerm} {s' : LamSort} (wfEq : LamWF ltv { lctx := pushLCtx argTy lctx, rterm := LamTerm.mkEq s lhs rhs, rty := s' }) :
                                                    LamWF ltv { lctx := lctx, rterm := LamTerm.mkEq (argTy.func s) (LamTerm.lam argTy lhs) (LamTerm.lam argTy rhs), rty := LamSort.base LamBaseSort.prop }
                                                    Equations
                                                    Instances For
                                                      def Auto.Embedding.Lam.LamWF.fromIntensionalizeEq1 {ltv : LamTyVal} {lctx : NatLamSort} {argTy s : LamSort} {lhs rhs : LamTerm} {s' : LamSort} (wfEq : LamWF ltv { lctx := lctx, rterm := LamTerm.mkEq (argTy.func s) (LamTerm.lam argTy lhs) (LamTerm.lam argTy rhs), rty := s' }) :
                                                      LamWF ltv { lctx := pushLCtx argTy lctx, rterm := LamTerm.mkEq s lhs rhs, rty := LamSort.base LamBaseSort.prop }
                                                      Equations
                                                      Instances For
                                                        theorem Auto.Embedding.Lam.LamEquiv.ofIntensionalizeEq1 {argTy : LamSort} {lctx : NatLamSort} {s : LamSort} {lhs rhs : LamTerm} {s' : LamSort} {lval : LamValuation} (wfEq : LamWF lval.toLamTyVal { lctx := pushLCtx argTy lctx, rterm := LamTerm.mkEq s lhs rhs, rty := s' }) :
                                                        LamEquiv lval lctx (LamSort.base LamBaseSort.prop) (LamTerm.mkForallEF argTy (LamTerm.mkEq s lhs rhs)) (LamTerm.mkEq (argTy.func s) (LamTerm.lam argTy lhs) (LamTerm.lam argTy rhs))
                                                        Equations
                                                        • One or more equations did not get rendered due to their size.
                                                        Instances For
                                                          def Auto.Embedding.Lam.LamWF.intensionalizeEqWith {ltv : LamTyVal} {lctx : NatLamSort} {s : LamSort} {lhs rhs : LamTerm} {l : List LamSort} {s' : LamSort} (wfEq : LamWF ltv { lctx := lctx, rterm := (LamTerm.mkEq s lhs rhs).mkForallEFN l, rty := s' }) :
                                                          LamWF ltv { lctx := lctx, rterm := LamTerm.intensionalizeEqWith l s lhs rhs, rty := LamSort.base LamBaseSort.prop }
                                                          Equations
                                                          • One or more equations did not get rendered due to their size.
                                                          Instances For
                                                            def Auto.Embedding.Lam.LamWF.fromIntensionalizeEqWith {ltv : LamTyVal} {lctx : NatLamSort} {l : List LamSort} {s : LamSort} {lhs rhs : LamTerm} {s' : LamSort} (wfInt : LamWF ltv { lctx := lctx, rterm := LamTerm.intensionalizeEqWith l s lhs rhs, rty := s' }) :
                                                            LamWF ltv { lctx := lctx, rterm := (LamTerm.mkEq s lhs rhs).mkForallEFN l, rty := LamSort.base LamBaseSort.prop }
                                                            Equations
                                                            • One or more equations did not get rendered due to their size.
                                                            Instances For
                                                              theorem Auto.Embedding.Lam.LamEquiv.ofIntensionalizeEqWith {lctx : NatLamSort} {s : LamSort} {lhs rhs : LamTerm} {l : List LamSort} {s' : LamSort} {lval : LamValuation} (wfEq : LamWF lval.toLamTyVal { lctx := lctx, rterm := (LamTerm.mkEq s lhs rhs).mkForallEFN l, rty := s' }) :
                                                              Equations
                                                              • One or more equations did not get rendered due to their size.
                                                              Instances For
                                                                theorem Auto.Embedding.Lam.LamWF.s_eq_prop_of_intensionalizeEq?_eq_some {ltv : LamTyVal} {lctx : NatLamSort} {t : LamTerm} {s' : LamSort} {t' : LamTerm} (wft : LamWF ltv { lctx := lctx, rterm := t, rty := s' }) (heq : t.intensionalizeEq? = some t') :
                                                                theorem Auto.Embedding.Lam.LamEquiv.ofIntensionalizeEq? {lctx : NatLamSort} {t : LamTerm} {s' : LamSort} {t' : LamTerm} {lval : LamValuation} (wft : LamWF lval.toLamTyVal { lctx := lctx, rterm := t, rty := s' }) (heq : t.intensionalizeEq? = some t') :

                                                                Suppose we have (λ x. func[body]) arg and body is a subterm of func under idx levels of binders in func. We want to compute what body will become when we reduce the top-level redex Suppose lctx ⊢ body : ty. It's easy to see that the lctx which arg resides in is fun n => lctx (n + idx + 1) and the type of arg is lctx idx

                                                                Equations
                                                                Instances For
                                                                  theorem Auto.Embedding.Lam.LamTerm.instantiateAt_bVarIrrelevance {idx : Nat} {t arg₁ arg₂ : LamTerm} (h : hasLooseBVarEq idx t = false) :
                                                                  instantiateAt idx arg₁ t = instantiateAt idx arg₂ t
                                                                  def Auto.Embedding.Lam.LamWF.instantiateAt (ltv : LamTyVal) (idx : Nat) {arg : LamTerm} {argTy : LamSort} {body : LamTerm} {bodyTy : LamSort} (lctx : NatLamSort) (wfArg : LamWF ltv { lctx := lctx, rterm := LamTerm.bvarLifts idx arg, rty := argTy }) (wfBody : LamWF ltv { lctx := pushLCtxAt argTy idx lctx, rterm := body, rty := bodyTy }) :
                                                                  LamWF ltv { lctx := lctx, rterm := LamTerm.instantiateAt idx arg body, rty := bodyTy }
                                                                  Equations
                                                                  Instances For
                                                                    theorem Auto.Embedding.Lam.LamWF.interp_instantiateAt (lval : LamValuation) (idx : Nat) {arg : LamTerm} {argTy : LamSort} {body : LamTerm} {bodyTy : LamSort} (lctxTy : NatLamSort) (lctxTerm : (n : Nat) → LamSort.interp lval.tyVal (lctxTy n)) (wfArg : LamWF lval.toLamTyVal { lctx := lctxTy, rterm := LamTerm.bvarLifts idx arg, rty := argTy }) (wfBody : LamWF lval.toLamTyVal { lctx := pushLCtxAt argTy idx lctxTy, rterm := body, rty := bodyTy }) :
                                                                    let wfInstantiateAt' := instantiateAt lval.toLamTyVal idx lctxTy wfArg wfBody; interp lval (pushLCtxAt argTy idx lctxTy) (pushLCtxAtDep (interp lval lctxTy lctxTerm wfArg) idx lctxTerm) wfBody = interp lval lctxTy lctxTerm wfInstantiateAt'
                                                                    def Auto.Embedding.Lam.LamWF.instantiate1 (ltv : LamTyVal) {arg : LamTerm} {argTy : LamSort} {body : LamTerm} {bodyTy : LamSort} (lctx : NatLamSort) (wfArg : LamWF ltv { lctx := lctx, rterm := arg, rty := argTy }) (wfBody : LamWF ltv { lctx := pushLCtx argTy lctx, rterm := body, rty := bodyTy }) :
                                                                    LamWF ltv { lctx := lctx, rterm := arg.instantiate1 body, rty := bodyTy }
                                                                    Equations
                                                                    Instances For
                                                                      def Auto.Embedding.Lam.LamThmWF.instantiate1 {lval : LamValuation} {lctx : List LamSort} {argTy : LamSort} {arg : LamTerm} {bodyTy : LamSort} {body : LamTerm} (wfArg : LamThmWF lval lctx argTy arg) (wfBody : LamThmWF lval (argTy :: lctx) bodyTy body) :
                                                                      LamThmWF lval lctx bodyTy (arg.instantiate1 body)
                                                                      Equations
                                                                      Instances For
                                                                        theorem Auto.Embedding.Lam.LamWF.interp_instantiate1 (lval : LamValuation) {arg : LamTerm} {argTy : LamSort} {body : LamTerm} {bodyTy : LamSort} (lctxTy : NatLamSort) (lctxTerm : (n : Nat) → LamSort.interp lval.tyVal (lctxTy n)) (wfArg : LamWF lval.toLamTyVal { lctx := lctxTy, rterm := arg, rty := argTy }) (wfBody : LamWF lval.toLamTyVal { lctx := pushLCtx argTy lctxTy, rterm := body, rty := bodyTy }) :
                                                                        let wfInstantiate1' := instantiate1 lval.toLamTyVal lctxTy wfArg wfBody; interp lval (pushLCtx argTy lctxTy) (pushLCtxDep (interp lval lctxTy lctxTerm wfArg) lctxTerm) wfBody = interp lval lctxTy lctxTerm wfInstantiate1'
                                                                        theorem Auto.Embedding.Lam.LamThmValid.instantiate1 {lval : LamValuation} {lctx : List LamSort} {argTy : LamSort} {arg body : LamTerm} (hw : LamThmWF lval lctx argTy arg) (hv : LamThmValid lval (argTy :: lctx) body) :
                                                                        LamThmValid lval lctx (arg.instantiate1 body)
                                                                        Equations
                                                                        • One or more equations did not get rendered due to their size.
                                                                        Instances For
                                                                          theorem Auto.Embedding.Lam.LamBaseTerm.LamWF.interp_resolveImport (lval : LamValuation) {b : LamBaseTerm} {ty : LamSort} (wfB : LamWF lval.toLamTyVal b ty) :
                                                                          let wfRB := wfB.resolveImport; interp lval wfB = interp lval wfRB
                                                                          def Auto.Embedding.Lam.LamThmWF.resolveImport {lval : LamValuation} {lctx : List LamSort} {rty : LamSort} {t : LamTerm} (wf : LamThmWF lval lctx rty t) :
                                                                          Equations
                                                                          Instances For
                                                                            theorem Auto.Embedding.Lam.LamWF.interp_resolveImport {lval : LamValuation} {t : LamTerm} {ty : LamSort} (lctxTy : NatLamSort) (lctxTerm : (n : Nat) → LamSort.interp lval.tyVal (lctxTy n)) (wfT : LamWF lval.toLamTyVal { lctx := lctxTy, rterm := t, rty := ty }) :
                                                                            let wfRB := wfT.resolveImport; interp lval lctxTy lctxTerm wfT = interp lval lctxTy lctxTerm wfRB
                                                                            def Auto.Embedding.Lam.LamWF.topBetaAux (ltv : LamTyVal) {arg : LamTerm} {argTy : LamSort} {fn : LamTerm} {resTy : LamSort} (lctx : NatLamSort) (wfArg : LamWF ltv { lctx := lctx, rterm := arg, rty := argTy }) (wfFn : LamWF ltv { lctx := lctx, rterm := fn, rty := argTy.func resTy }) :
                                                                            LamWF ltv { lctx := lctx, rterm := LamTerm.topBetaAux argTy arg fn, rty := resTy }
                                                                            Equations
                                                                            Instances For
                                                                              def Auto.Embedding.Lam.LamWF.interp_topBetaAux (lval : LamValuation) {arg : LamTerm} {argTy : LamSort} {fn : LamTerm} {resTy : LamSort} (lctxTy : NatLamSort) (lctxTerm : (n : Nat) → LamSort.interp lval.tyVal (lctxTy n)) (wfArg : LamWF lval.toLamTyVal { lctx := lctxTy, rterm := arg, rty := argTy }) (wfFn : LamWF lval.toLamTyVal { lctx := lctxTy, rterm := fn, rty := argTy.func resTy }) :
                                                                              let wfHB := topBetaAux lval.toLamTyVal lctxTy wfArg wfFn; interp lval lctxTy lctxTerm (ofApp argTy wfFn wfArg) = interp lval lctxTy lctxTerm wfHB
                                                                              Equations
                                                                              • =
                                                                              Instances For
                                                                                def Auto.Embedding.Lam.LamWF.topBeta (ltv : LamTyVal) {t : LamTerm} {ty : LamSort} (lctx : NatLamSort) (wf : LamWF ltv { lctx := lctx, rterm := t, rty := ty }) :
                                                                                LamWF ltv { lctx := lctx, rterm := t.topBeta, rty := ty }
                                                                                Equations
                                                                                Instances For
                                                                                  def Auto.Embedding.Lam.LamThmWF.topBeta {lval : LamValuation} {lctx : List LamSort} {rty : LamSort} {t : LamTerm} (wf : LamThmWF lval lctx rty t) :
                                                                                  LamThmWF lval lctx rty t.topBeta
                                                                                  Equations
                                                                                  Instances For
                                                                                    theorem Auto.Embedding.Lam.LamWF.interp_topBeta {lval : LamValuation} {t : LamTerm} {ty : LamSort} (lctxTy : NatLamSort) (lctxTerm : (n : Nat) → LamSort.interp lval.tyVal (lctxTy n)) (wfT : LamWF lval.toLamTyVal { lctx := lctxTy, rterm := t, rty := ty }) :
                                                                                    let wfHB := topBeta lval.toLamTyVal lctxTy wfT; interp lval lctxTy lctxTerm wfT = interp lval lctxTy lctxTerm wfHB
                                                                                    theorem Auto.Embedding.Lam.LamThmValid.topBeta {lval : LamValuation} {lctx : List LamSort} {t : LamTerm} (H : LamThmValid lval lctx t) :
                                                                                    LamThmValid lval lctx t.topBeta
                                                                                    theorem Auto.Embedding.Lam.LamEquiv.ofTopBeta {lctx : NatLamSort} {t : LamTerm} {s : LamSort} {lval : LamValuation} (wf : LamWF lval.toLamTyVal { lctx := lctx, rterm := t, rty := s }) :
                                                                                    LamEquiv lval lctx s t t.topBeta
                                                                                    theorem Auto.Embedding.Lam.LamThmEquiv.ofTopBeta {lval : LamValuation} {lctx : List LamSort} {s : LamSort} {t : LamTerm} (wf : LamThmWF lval lctx s t) :
                                                                                    LamThmEquiv lval lctx s t t.topBeta
                                                                                    Equations
                                                                                    Instances For
                                                                                      theorem Auto.Embedding.Lam.LamTerm.maxEVarSucc_beta {args : List (LamSort × LamTerm)} {n : Nat} {t : LamTerm} (hs : HList (fun (x : LamSort × LamTerm) => match x with | (fst, arg) => arg.maxEVarSucc n) args) (ht : t.maxEVarSucc n) :
                                                                                      (t.beta args).maxEVarSucc n
                                                                                      def Auto.Embedding.Lam.LamWF.ofBeta {ltv : LamTyVal} {lctx : NatLamSort} {resTy : LamSort} (fn : LamTerm) (args : List (LamSort × LamTerm)) (wf : LamWF ltv { lctx := lctx, rterm := fn.mkAppN args, rty := resTy }) :
                                                                                      LamWF ltv { lctx := lctx, rterm := fn.beta args, rty := resTy }
                                                                                      Equations
                                                                                      Instances For
                                                                                        theorem Auto.Embedding.Lam.LamEquiv.ofBeta {lctx : NatLamSort} {resTy : LamSort} {lval : LamValuation} (fn : LamTerm) (args : List (LamSort × LamTerm)) (wf : LamWF lval.toLamTyVal { lctx := lctx, rterm := fn.mkAppN args, rty := resTy }) :
                                                                                        LamEquiv lval lctx resTy (fn.mkAppN args) (fn.beta args)
                                                                                        theorem Auto.Embedding.Lam.LamTerm.maxEVarSucc_headBetaAux {args : List (LamSort × LamTerm)} {n : Nat} {t : LamTerm} (hs : HList (fun (x : LamSort × LamTerm) => match x with | (fst, arg) => arg.maxEVarSucc n) args) (ht : t.maxEVarSucc n) :
                                                                                        theorem Auto.Embedding.Lam.LamEquiv.ofHeadBetaAux {lctx : NatLamSort} {t : LamTerm} {args : List (LamSort × LamTerm)} {rty : LamSort} {lval : LamValuation} (wf : LamWF lval.toLamTyVal { lctx := lctx, rterm := t.mkAppN args, rty := rty }) :
                                                                                        LamEquiv lval lctx rty (t.mkAppN args) (LamTerm.headBetaAux args t)
                                                                                        def Auto.Embedding.Lam.LamWF.ofHeadBeta {ltv : LamTyVal} {lctx : NatLamSort} {t : LamTerm} {s : LamSort} (wf : LamWF ltv { lctx := lctx, rterm := t, rty := s }) :
                                                                                        LamWF ltv { lctx := lctx, rterm := t.headBeta, rty := s }
                                                                                        Equations
                                                                                        • One or more equations did not get rendered due to their size.
                                                                                        Instances For
                                                                                          theorem Auto.Embedding.Lam.LamEquiv.ofHeadBeta {lctx : NatLamSort} {t : LamTerm} {s : LamSort} {lval : LamValuation} (wf : LamWF lval.toLamTyVal { lctx := lctx, rterm := t, rty := s }) :
                                                                                          LamEquiv lval lctx s t t.headBeta
                                                                                          theorem Auto.Embedding.Lam.LamThmEquiv.ofHeadBeta {lval : LamValuation} {lctx : List LamSort} {s : LamSort} {t : LamTerm} (wf : LamThmWF lval lctx s t) :
                                                                                          LamThmEquiv lval lctx s t t.headBeta
                                                                                          def Auto.Embedding.Lam.LamWF.ofHeadBetaBounded {ltv : LamTyVal} {lctx : NatLamSort} {t : LamTerm} {s : LamSort} {n : Nat} (wf : LamWF ltv { lctx := lctx, rterm := t, rty := s }) :
                                                                                          LamWF ltv { lctx := lctx, rterm := LamTerm.headBetaBounded n t, rty := s }
                                                                                          Equations
                                                                                          Instances For
                                                                                            theorem Auto.Embedding.Lam.LamEquiv.ofHeadBetaBounded {lctx : NatLamSort} {t : LamTerm} {s : LamSort} {lval : LamValuation} {n : Nat} (wf : LamWF lval.toLamTyVal { lctx := lctx, rterm := t, rty := s }) :
                                                                                            LamEquiv lval lctx s t (LamTerm.headBetaBounded n t)
                                                                                            theorem Auto.Embedding.Lam.LamThmEquiv.ofHeadBetaBounded {lval : LamValuation} {lctx : List LamSort} {s : LamSort} {t : LamTerm} {n : Nat} (wf : LamThmWF lval lctx s t) :
                                                                                            theorem Auto.Embedding.Lam.LamEquiv.ofBetaBounded {lctx : NatLamSort} {t : LamTerm} {s : LamSort} {lval : LamValuation} {n : Nat} (wf : LamWF lval.toLamTyVal { lctx := lctx, rterm := t, rty := s }) :
                                                                                            LamEquiv lval lctx s t (LamTerm.betaBounded n t)
                                                                                            theorem Auto.Embedding.Lam.LamThmEquiv.ofBetaBounded {lval : LamValuation} {lctx : List LamSort} {rty : LamSort} {t : LamTerm} {n : Nat} (wf : LamThmWF lval lctx rty t) :
                                                                                            LamThmEquiv lval lctx rty t (LamTerm.betaBounded n t)
                                                                                            theorem Auto.Embedding.Lam.LamThmEquiv.ofResolveImport {lctx : List LamSort} {s : LamSort} {t : LamTerm} {lval : LamValuation} (wfT : LamThmWF lval lctx s t) :

                                                                                            (a = b) ↔ (b = a)

                                                                                            Equations
                                                                                            • One or more equations did not get rendered due to their size.
                                                                                            • t.eqSymm? = none
                                                                                            Instances For
                                                                                              def Auto.Embedding.Lam.LamWF.eqSymm? {ltv : LamTyVal} {lctx : NatLamSort} {t : LamTerm} {s : LamSort} {t' : LamTerm} (wft : LamWF ltv { lctx := lctx, rterm := t, rty := s }) (heq : t.eqSymm? = some t') :
                                                                                              LamWF ltv { lctx := lctx, rterm := t', rty := s }
                                                                                              Equations
                                                                                              • One or more equations did not get rendered due to their size.
                                                                                              Instances For
                                                                                                theorem Auto.Embedding.Lam.LamEquiv.eqSymm? {lctx : NatLamSort} {t : LamTerm} {s : LamSort} {t' : LamTerm} {lval : LamValuation} (wft : LamWF lval.toLamTyVal { lctx := lctx, rterm := t, rty := s }) (heq : t.eqSymm? = some t') :
                                                                                                theorem Auto.Embedding.Lam.LamThmEquiv.eqSymm? {lval : LamValuation} {lctx : List LamSort} {s : LamSort} {t t' : LamTerm} (wft : LamThmWF lval lctx s t) (heq : t.eqSymm? = some t') :

                                                                                                (a ≠ b) ↔ (b ≠ a)

                                                                                                Equations
                                                                                                • One or more equations did not get rendered due to their size.
                                                                                                • t.neSymm? = none
                                                                                                Instances For
                                                                                                  def Auto.Embedding.Lam.LamWF.neSymm? {ltv : LamTyVal} {lctx : NatLamSort} {t : LamTerm} {s : LamSort} {t' : LamTerm} (wft : LamWF ltv { lctx := lctx, rterm := t, rty := s }) (heq : t.neSymm? = some t') :
                                                                                                  LamWF ltv { lctx := lctx, rterm := t', rty := s }
                                                                                                  Equations
                                                                                                  • One or more equations did not get rendered due to their size.
                                                                                                  Instances For
                                                                                                    theorem Auto.Embedding.Lam.LamEquiv.neSymm? {lctx : NatLamSort} {t : LamTerm} {s : LamSort} {t' : LamTerm} {lval : LamValuation} (wft : LamWF lval.toLamTyVal { lctx := lctx, rterm := t, rty := s }) (heq : t.neSymm? = some t') :
                                                                                                    theorem Auto.Embedding.Lam.LamThmEquiv.neSymm? {lval : LamValuation} {lctx : List LamSort} {s : LamSort} {t t' : LamTerm} (wft : LamThmWF lval lctx s t) (heq : t.neSymm? = some t') :
                                                                                                    Equations
                                                                                                    Instances For
                                                                                                      theorem Auto.Embedding.Lam.LamGenConv.mpEq? {lval : LamValuation} {rty : LamSort} {lhs rhs : LamTerm} (hequiv : LamThmEquiv lval [] rty lhs rhs) :
                                                                                                      LamGenConv lval (lhs.mpEq? rhs)
                                                                                                      Equations
                                                                                                      • One or more equations did not get rendered due to their size.
                                                                                                      • rw.mp? t = none
                                                                                                      Instances For
                                                                                                        theorem Auto.Embedding.Lam.LamEquiv.mp? {lctx : NatLamSort} {t : LamTerm} {rty : LamSort} {lval : LamValuation} {rw t' : LamTerm} (wft : LamWF lval.toLamTyVal { lctx := lctx, rterm := t, rty := rty }) (Hrw : LamValid lval lctx rw) (heq : rw.mp? t = some t') :
                                                                                                        LamEquiv lval lctx rty t t'
                                                                                                        theorem Auto.Embedding.Lam.LamThmEquiv.mp? {lval : LamValuation} {lctx : List LamSort} {rty : LamSort} {t rw t' : LamTerm} (wft : LamThmWF lval lctx rty t) (Hrw : LamThmValid lval lctx rw) (heq : rw.mp? t = some t') :
                                                                                                        LamThmEquiv lval lctx rty t t'
                                                                                                        theorem Auto.Embedding.Lam.LamGenConv.mpAll {lval : LamValuation} {s : LamSort} {lhs rhs : LamTerm} (hequiv : LamThmEquiv lval [] s lhs rhs) :
                                                                                                        LamGenConv lval (lhs.mpAll rhs)
                                                                                                        Equations
                                                                                                        • One or more equations did not get rendered due to their size.
                                                                                                        • rw.mpAll? t = none
                                                                                                        Instances For
                                                                                                          Equations
                                                                                                          Instances For
                                                                                                            theorem Auto.Embedding.Lam.LamTerm.maxEVarSucc_congrArg? {n : Nat} {t rw t' : LamTerm} (ht : t.maxEVarSucc n) (hrw : rw.maxEVarSucc n) (heq : t.congrArg? rw = some t') :
                                                                                                            theorem Auto.Embedding.Lam.LamEquiv.congrArg? {lctx : NatLamSort} {t : LamTerm} {rty : LamSort} {lval : LamValuation} {rw t' : LamTerm} (wft : LamWF lval.toLamTyVal { lctx := lctx, rterm := t, rty := rty }) (Hrw : LamValid lval lctx rw) (heq : t.congrArg? rw = some t') :
                                                                                                            LamEquiv lval lctx rty t t'
                                                                                                            theorem Auto.Embedding.Lam.LamThmEquiv.congrArg? {lval : LamValuation} {lctx : List LamSort} {rty : LamSort} {t rw t' : LamTerm} (wft : LamThmWF lval lctx rty t) (Hrw : LamThmValid lval lctx rw) (heq : t.congrArg? rw = some t') :
                                                                                                            LamThmEquiv lval lctx rty t t'
                                                                                                            Equations
                                                                                                            Instances For
                                                                                                              theorem Auto.Embedding.Lam.LamTerm.maxEVarSucc_congrFun? {n : Nat} {t rw t' : LamTerm} (ht : t.maxEVarSucc n) (hrw : rw.maxEVarSucc n) (heq : t.congrFun? rw = some t') :
                                                                                                              theorem Auto.Embedding.Lam.LamEquiv.congrFun? {lctx : NatLamSort} {t : LamTerm} {rty : LamSort} {lval : LamValuation} {rw t' : LamTerm} (wft : LamWF lval.toLamTyVal { lctx := lctx, rterm := t, rty := rty }) (Hrw : LamValid lval lctx rw) (heq : t.congrFun? rw = some t') :
                                                                                                              LamEquiv lval lctx rty t t'
                                                                                                              theorem Auto.Embedding.Lam.LamThmEquiv.congrFun? {lval : LamValuation} {lctx : List LamSort} {rty : LamSort} {t rw t' : LamTerm} (wft : LamThmWF lval lctx rty t) (Hrw : LamThmValid lval lctx rw) (heq : t.congrFun? rw = some t') :
                                                                                                              LamThmEquiv lval lctx rty t t'
                                                                                                              Equations
                                                                                                              Instances For
                                                                                                                theorem Auto.Embedding.Lam.LamEquiv.congr? {lctx : NatLamSort} {t : LamTerm} {rty : LamSort} {lval : LamValuation} {rwFn rwArg t' : LamTerm} (wft : LamWF lval.toLamTyVal { lctx := lctx, rterm := t, rty := rty }) (HrwFn : LamValid lval lctx rwFn) (HrwArg : LamValid lval lctx rwArg) (heq : t.congr? rwFn rwArg = some t') :
                                                                                                                LamEquiv lval lctx rty t t'
                                                                                                                theorem Auto.Embedding.Lam.LamTerm.maxEVarSucc_congr? {n : Nat} {t rwFn rwArg t' : LamTerm} (ht : t.maxEVarSucc n) (hrwFn : rwFn.maxEVarSucc n) (hrwArg : rwArg.maxEVarSucc n) (heq : t.congr? rwFn rwArg = some t') :
                                                                                                                theorem Auto.Embedding.Lam.LamThmEquiv.congr? {lval : LamValuation} {lctx : List LamSort} {rty : LamSort} {t rwFn rwArg t' : LamTerm} (wft : LamThmWF lval lctx rty t) (HrwFn : LamThmValid lval lctx rwFn) (HrwArg : LamThmValid lval lctx rwArg) (heq : t.congr? rwFn rwArg = some t') :
                                                                                                                LamThmEquiv lval lctx rty t t'
                                                                                                                Equations
                                                                                                                Instances For
                                                                                                                  theorem Auto.Embedding.Lam.LamTerm.maxEVarSucc_congrArgs? {n : Nat} {rwArgs : List LamTerm} {t t' : LamTerm} (ht : t.maxEVarSucc n) (hrwArgs : HList (fun (rw : LamTerm) => rw.maxEVarSucc n) rwArgs) (heq : t.congrArgs? rwArgs = some t') :
                                                                                                                  theorem Auto.Embedding.Lam.LamEquiv.congrArgs? {lctx : NatLamSort} {t : LamTerm} {rty : LamSort} {lval : LamValuation} {rwArgs : List LamTerm} {t' : LamTerm} (wft : LamWF lval.toLamTyVal { lctx := lctx, rterm := t, rty := rty }) (HrwArgs : HList (LamValid lval lctx) rwArgs) (heq : t.congrArgs? rwArgs = some t') :
                                                                                                                  LamEquiv lval lctx rty t t'
                                                                                                                  theorem Auto.Embedding.Lam.LamThmEquiv.congrArgs? {lval : LamValuation} {lctx : List LamSort} {rty : LamSort} {t : LamTerm} {rwArgs : List LamTerm} {t' : LamTerm} (wft : LamThmWF lval lctx rty t) (HrwArgs : HList (LamThmValid lval lctx) rwArgs) (heq : t.congrArgs? rwArgs = some t') :
                                                                                                                  LamThmEquiv lval lctx rty t t'
                                                                                                                  theorem Auto.Embedding.Lam.LamTerm.maxEVarSucc_congrFunN? {n : Nat} {t rwFn : LamTerm} {idx : Nat} {t' : LamTerm} (ht : t.maxEVarSucc n) (hrwFn : rwFn.maxEVarSucc n) (heq : t.congrFunN? rwFn idx = some t') :
                                                                                                                  theorem Auto.Embedding.Lam.LamEquiv.congrFunN? {lctx : NatLamSort} {t : LamTerm} {rty : LamSort} {lval : LamValuation} {rwFn : LamTerm} {n : Nat} {t' : LamTerm} (wft : LamWF lval.toLamTyVal { lctx := lctx, rterm := t, rty := rty }) (HrwFn : LamValid lval lctx rwFn) (heq : t.congrFunN? rwFn n = some t') :
                                                                                                                  LamEquiv lval lctx rty t t'
                                                                                                                  theorem Auto.Embedding.Lam.LamThmEquiv.congrFunN? {lval : LamValuation} {lctx : List LamSort} {rty : LamSort} {t rwFn : LamTerm} {n : Nat} {t' : LamTerm} (wft : LamThmWF lval lctx rty t) (HrwFn : LamThmValid lval lctx rwFn) (heq : t.congrFunN? rwFn n = some t') :
                                                                                                                  LamThmEquiv lval lctx rty t t'
                                                                                                                  Equations
                                                                                                                  Instances For
                                                                                                                    theorem Auto.Embedding.Lam.LamTerm.maxEVarSucc_congrs? {n : Nat} {rwArgs : List LamTerm} {t rwFn t' : LamTerm} (ht : t.maxEVarSucc n) (hrwFn : rwFn.maxEVarSucc n) (hrwArgs : HList (fun (rw : LamTerm) => rw.maxEVarSucc n) rwArgs) (heq : t.congrs? rwFn rwArgs = some t') :
                                                                                                                    theorem Auto.Embedding.Lam.LamEquiv.congrs? {lctx : NatLamSort} {t : LamTerm} {rty : LamSort} {lval : LamValuation} {rwFn : LamTerm} {rwArgs : List LamTerm} {t' : LamTerm} (wft : LamWF lval.toLamTyVal { lctx := lctx, rterm := t, rty := rty }) (HrwFn : LamValid lval lctx rwFn) (HrwArgs : HList (LamValid lval lctx) rwArgs) (heq : t.congrs? rwFn rwArgs = some t') :
                                                                                                                    LamEquiv lval lctx rty t t'
                                                                                                                    theorem Auto.Embedding.Lam.LamThmEquiv.congrs? {lval : LamValuation} {lctx : List LamSort} {rty : LamSort} {t rwFn : LamTerm} {rwArgs : List LamTerm} {t' : LamTerm} (wft : LamThmWF lval lctx rty t) (HrwFn : LamThmValid lval lctx rwFn) (HrwArgs : HList (LamThmValid lval lctx) rwArgs) (heq : t.congrs? rwFn rwArgs = some t') :
                                                                                                                    LamThmEquiv lval lctx rty t t'
                                                                                                                    Equations
                                                                                                                    Instances For

                                                                                                                      Turn ts[i] into .bvar i

                                                                                                                      Equations
                                                                                                                      • One or more equations did not get rendered due to their size.
                                                                                                                      Instances For
                                                                                                                        Equations
                                                                                                                        Instances For

                                                                                                                          Determine whether a λ term t (within LamThmValid lval lctx t) is of the form LamTerm.mkAppN ((.atom i) <|> (.etom i)) [.bvar iₖ₋₁, ⋯, .bvar i₁, .bvar i₀] where i₀, i₁, ⋯, iₖ₋₁ is a permutation of 0, 1, 2, ⋯, k - 1 and k is the length of lctx. If t is of the above form, return a list l of length k where ∀ 0 ≤ j < k, l[iⱼ] = j · This is an auxiliary function for definition unfolding. If we identify equalities in the input formulas with lhs or rhs being general, for example lhs = LamTerm.mkAppN (.atom i) [.bvar iₖ₋₁, ⋯, .bvar i₁, .bvar i₀], then we can · First, reorder local context and intensionalize the above equation to make it look like a definition of .atom i · Then, exhaustively unfold .atom i in all input formulas using this definition · Finally, remove the original equation (i.e. lhs = rhs) from the set of input formulas It's easy to see that the above procedure is sound and complete if rhs does not contains lhs. · Note that the above procedure will not be complete if we relax the iteition `i₀, i₁, ⋯, iₖ₋₁` is a permutation of `0, 1, 2, ⋯, k - 1` to `i₀, i₁, ⋯, iₖ₋₁` is a permutation of a subsequence of `0, 1, 2, ⋯, k - 1` even if we require that rhs does not contain lhs. To see this, consider the following example with two input formulas: (Note: #i is type atom, !i is term atom, ⟨i⟩ is .bvar i)

                                                                                                                          1. LamThmValid [#0, #0, #0] (!0 ⟨0⟩ ⟨1⟩ = !1 ⟨0⟩ ⟨1⟩ ⟨0⟩ ⟨2⟩) (lhs is (relaxed) general)
                                                                                                                          2. LamThmValid [] (!1 !2 !2 !2 !2 = !1 !2 !2 !2 !3)
                                                                                                                          Equations
                                                                                                                          • One or more equations did not get rendered due to their size.
                                                                                                                          Instances For