Documentation

ArkLib.OracleReduction.LiftContext.Reduction

Lifting Reductions to Larger Contexts #

Sequential composition is usually not enough to represent oracle reductions in a modular way. We also need to formalize virtual oracle reductions, which lift reductions from one (virtual / inner) context into the another (real / outer) context.

This is what is meant when we informally say "apply so-and-so protocol to this quantity (derived from the input statement & witness)".

Put in other words, we define a mapping between the input-output interfaces of two (oracle) reductions, without changing anything about the underlying reductions.

Recall that the input-output interface of an oracle reduction consists of:

The liftContext is defined as the following mappings of projections / lifts:

Note that since completeness & soundness for oracle reductions are defined in terms of the same properties after converting to (non-oracle) reductions, we only need to focus our efforts on the non-oracle case.

Note that this exactly corresponds to lenses in programming languages / category theory. Namely, liftContext on the inputs correspond to a view/get operation (our "proj"), while liftContext on the output corresponds to a modify/set operation (our "lift").

More precisely, the proj/lift operations correspond to a Lens between two monomial polyonmial functors: OuterCtxIn y^ OuterCtxOut ⇆ InnerCtxIn y^ InnerCtxOut.

All the lens definitions are in Lens.lean. This file deals with the lens applied to reductions. See OracleReduction.lean for the application to oracle reduction.

def Prover.liftContext {n : } {pSpec : ProtocolSpec n} {ι : Type} {oSpec : OracleSpec ι} {OuterStmtIn OuterWitIn OuterStmtOut OuterWitOut InnerStmtIn InnerWitIn InnerStmtOut InnerWitOut : Type} (lens : Context.Lens OuterStmtIn OuterStmtOut InnerStmtIn InnerStmtOut OuterWitIn OuterWitOut InnerWitIn InnerWitOut) (P : Prover oSpec InnerStmtIn InnerWitIn InnerStmtOut InnerWitOut pSpec) :
Prover oSpec OuterStmtIn OuterWitIn OuterStmtOut OuterWitOut pSpec

The outer prover after lifting invokes the inner prover on the projected input, and lifts the output

Equations
    Instances For
      def Verifier.liftContext {n : } {pSpec : ProtocolSpec n} {ι : Type} {oSpec : OracleSpec ι} {OuterStmtIn OuterStmtOut InnerStmtIn InnerStmtOut : Type} (lens : Statement.Lens OuterStmtIn OuterStmtOut InnerStmtIn InnerStmtOut) (V : Verifier oSpec InnerStmtIn InnerStmtOut pSpec) :
      Verifier oSpec OuterStmtIn OuterStmtOut pSpec

      The outer verifier after lifting invokes the inner verifier on the projected input, and lifts the output

      Equations
        Instances For
          def Reduction.liftContext {n : } {pSpec : ProtocolSpec n} {ι : Type} {oSpec : OracleSpec ι} {OuterStmtIn OuterWitIn OuterStmtOut OuterWitOut InnerStmtIn InnerWitIn InnerStmtOut InnerWitOut : Type} (lens : Context.Lens OuterStmtIn OuterStmtOut InnerStmtIn InnerStmtOut OuterWitIn OuterWitOut InnerWitIn InnerWitOut) (R : Reduction oSpec InnerStmtIn InnerWitIn InnerStmtOut InnerWitOut pSpec) :
          Reduction oSpec OuterStmtIn OuterWitIn OuterStmtOut OuterWitOut pSpec

          The outer reduction after lifting is the combination of the lifting of the prover and verifier

          Equations
            Instances For
              def Extractor.Straightline.liftContext {n : } {pSpec : ProtocolSpec n} {ι : Type} {oSpec : OracleSpec ι} {OuterStmtIn OuterWitIn OuterStmtOut OuterWitOut InnerStmtIn InnerWitIn InnerStmtOut InnerWitOut : Type} (lens : Lens OuterStmtIn OuterStmtOut InnerStmtIn InnerStmtOut OuterWitIn OuterWitOut InnerWitIn InnerWitOut) (E : Straightline oSpec InnerStmtIn InnerWitIn InnerWitOut pSpec) :
              Straightline oSpec OuterStmtIn OuterWitIn OuterWitOut pSpec

              The outer extractor after lifting invokes the inner extractor on the projected input, and lifts the output

              Equations
                Instances For
                  def Extractor.RoundByRound.liftContext {n : } {pSpec : ProtocolSpec n} {ι : Type} {oSpec : OracleSpec ι} {OuterStmtIn OuterWitIn OuterStmtOut OuterWitOut InnerStmtIn InnerWitIn InnerStmtOut InnerWitOut : Type} {WitMid : Fin (n + 1)Type} (lens : Lens OuterStmtIn OuterStmtOut InnerStmtIn InnerStmtOut OuterWitIn OuterWitOut InnerWitIn InnerWitOut) (E : RoundByRound oSpec InnerStmtIn InnerWitIn InnerWitOut pSpec WitMid) :
                  RoundByRound oSpec OuterStmtIn OuterWitIn OuterWitOut pSpec WitMid

                  The outer round-by-round extractor after lifting invokes the inner extractor on the projected input, and lifts the output

                  Equations
                    Instances For
                      def Verifier.compatStatement {n : } {pSpec : ProtocolSpec n} {ι : Type} {oSpec : OracleSpec ι} {OuterStmtIn OuterStmtOut InnerStmtIn InnerStmtOut : Type} (lens : Statement.Lens OuterStmtIn OuterStmtOut InnerStmtIn InnerStmtOut) (V : Verifier oSpec InnerStmtIn InnerStmtOut pSpec) :
                      OuterStmtInInnerStmtOutProp

                      Compatibility relation between the outer input statement and the inner output statement, relative to a verifier.

                      We require that the inner output statement is a possible output of the verifier on the outer input statement, for any given transcript. Note that we have to existentially quantify over transcripts since we only reference the verifier, and there's no way to get the transcript without a prover.

                      Equations
                        Instances For
                          def Reduction.compatContext {n : } {pSpec : ProtocolSpec n} {ι : Type} {oSpec : OracleSpec ι} {OuterStmtIn OuterWitIn OuterStmtOut OuterWitOut InnerStmtIn InnerWitIn InnerStmtOut InnerWitOut : Type} (lens : Context.Lens OuterStmtIn OuterStmtOut InnerStmtIn InnerStmtOut OuterWitIn OuterWitOut InnerWitIn InnerWitOut) (R : Reduction oSpec InnerStmtIn InnerWitIn InnerStmtOut InnerWitOut pSpec) :
                          OuterStmtIn × OuterWitInInnerStmtOut × InnerWitOutProp

                          Compatibility relation between the outer input context and the inner output context, relative to a reduction.

                          We require that the inner output context (statement + witness) is a possible output of the reduction on the outer input context (statement + witness).

                          Equations
                            Instances For
                              def Extractor.Straightline.compatWit {n : } {pSpec : ProtocolSpec n} {ι : Type} {oSpec : OracleSpec ι} {OuterStmtIn OuterWitIn OuterStmtOut OuterWitOut InnerStmtIn InnerWitIn InnerStmtOut InnerWitOut : Type} (lens : Lens OuterStmtIn OuterStmtOut InnerStmtIn InnerStmtOut OuterWitIn OuterWitOut InnerWitIn InnerWitOut) (E : Straightline oSpec InnerStmtIn InnerWitIn InnerWitOut pSpec) :
                              OuterStmtIn × OuterWitOutInnerWitInProp

                              Compatibility relation between the outer input witness and the inner output witness, relative to a straightline extractor.

                              We require that the inner output witness is a possible output of the straightline extractor on the outer input witness, for a given input statement, transcript, and prover and verifier's query logs.

                              Equations
                                Instances For
                                  def Verifier.StateFunction.liftContext {n : } {pSpec : ProtocolSpec n} {ι : Type} {oSpec : OracleSpec ι} {OuterStmtIn OuterStmtOut InnerStmtIn InnerStmtOut σ : Type} {init : ProbComp σ} {impl : QueryImpl oSpec (StateT σ ProbComp)} (lens : Statement.Lens OuterStmtIn OuterStmtOut InnerStmtIn InnerStmtOut) (V : Verifier oSpec InnerStmtIn InnerStmtOut pSpec) (outerLangIn : Set OuterStmtIn) (outerLangOut : Set OuterStmtOut) (innerLangIn : Set InnerStmtIn) (innerLangOut : Set InnerStmtOut) [lensSound : Statement.Lens.IsSound outerLangIn outerLangOut innerLangIn innerLangOut (compatStatement lens V) lens] (stF : StateFunction init impl innerLangIn innerLangOut V) :
                                  StateFunction init impl outerLangIn outerLangOut (Verifier.liftContext lens V)

                                  The outer state function after lifting invokes the inner state function on the projected input, and lifts the output

                                  Equations
                                    Instances For
                                      theorem Prover.liftContext_processRound {n : } {pSpec : ProtocolSpec n} {ι : Type} {oSpec : OracleSpec ι} {OuterStmtIn OuterWitIn OuterStmtOut OuterWitOut InnerStmtIn InnerWitIn InnerStmtOut InnerWitOut : Type} {lens : Context.Lens OuterStmtIn OuterStmtOut InnerStmtIn InnerStmtOut OuterWitIn OuterWitOut InnerWitIn InnerWitOut} {i : Fin n} {P : Prover oSpec InnerStmtIn InnerWitIn InnerStmtOut InnerWitOut pSpec} {resultRound : OracleComp (oSpec ++ₒ [pSpec.Challenge]ₒ) (ProtocolSpec.Transcript i.castSucc pSpec × (liftContext lens P).PrvState i.castSucc)} :
                                      processRound i (liftContext lens P) resultRound = do let __discrresultRound match __discr with | (transcript, prvState, outerStmtIn, outerWitIn) => do let __discrprocessRound i P (pure (transcript, prvState)) match __discr with | (newTranscript, newPrvState) => pure (newTranscript, newPrvState, outerStmtIn, outerWitIn)

                                      Lifting the prover intertwines with the process round function

                                      theorem Prover.liftContext_runToRound {n : } {pSpec : ProtocolSpec n} {ι : Type} {oSpec : OracleSpec ι} {OuterStmtIn OuterWitIn OuterStmtOut OuterWitOut InnerStmtIn InnerWitIn InnerStmtOut InnerWitOut : Type} {lens : Context.Lens OuterStmtIn OuterStmtOut InnerStmtIn InnerStmtOut OuterWitIn OuterWitOut InnerWitIn InnerWitOut} {outerStmtIn : OuterStmtIn} {outerWitIn : OuterWitIn} {i : Fin (n + 1)} (P : Prover oSpec InnerStmtIn InnerWitIn InnerStmtOut InnerWitOut pSpec) :
                                      runToRound i outerStmtIn outerWitIn (liftContext lens P) = do let __discrFunction.uncurry (fun (stmt : InnerStmtIn) (wit : InnerWitIn) => runToRound i stmt wit P) (lens.proj (outerStmtIn, outerWitIn)) match __discr with | (transcript, prvState) => pure (transcript, prvState, outerStmtIn, outerWitIn)
                                      theorem Prover.liftContext_runWithLogToRound {n : } {pSpec : ProtocolSpec n} {ι : Type} {oSpec : OracleSpec ι} {OuterStmtIn OuterWitIn OuterStmtOut OuterWitOut InnerStmtIn InnerWitIn InnerStmtOut InnerWitOut : Type} {lens : Context.Lens OuterStmtIn OuterStmtOut InnerStmtIn InnerStmtOut OuterWitIn OuterWitOut InnerWitIn InnerWitOut} {outerStmtIn : OuterStmtIn} {outerWitIn : OuterWitIn} {i : Fin (n + 1)} (P : Prover oSpec InnerStmtIn InnerWitIn InnerStmtOut InnerWitOut pSpec) :
                                      runWithLogToRound i outerStmtIn outerWitIn (liftContext lens P) = do let __discrFunction.uncurry (fun (stmt : InnerStmtIn) (wit : InnerWitIn) => runWithLogToRound i stmt wit P) (lens.proj (outerStmtIn, outerWitIn)) match __discr with | ((transcript, prvState), queryLog) => pure ((transcript, prvState, outerStmtIn, outerWitIn), queryLog)
                                      theorem Prover.liftContext_run {n : } {pSpec : ProtocolSpec n} {ι : Type} {oSpec : OracleSpec ι} {OuterStmtIn OuterWitIn OuterStmtOut OuterWitOut InnerStmtIn InnerWitIn InnerStmtOut InnerWitOut : Type} {lens : Context.Lens OuterStmtIn OuterStmtOut InnerStmtIn InnerStmtOut OuterWitIn OuterWitOut InnerWitIn InnerWitOut} {outerStmtIn : OuterStmtIn} {outerWitIn : OuterWitIn} {P : Prover oSpec InnerStmtIn InnerWitIn InnerStmtOut InnerWitOut pSpec} :
                                      run outerStmtIn outerWitIn (liftContext lens P) = do let __discrFunction.uncurry (fun (stmt : InnerStmtIn) (wit : InnerWitIn) => run stmt wit P) (lens.proj (outerStmtIn, outerWitIn)) match __discr with | (fullTranscript, innerCtxOut) => pure (fullTranscript, lens.lift (outerStmtIn, outerWitIn) innerCtxOut)

                                      Running the lifted outer prover is equivalent to running the inner prover on the projected input, and then integrating the output

                                      theorem Prover.liftContext_runWithLog {n : } {pSpec : ProtocolSpec n} {ι : Type} {oSpec : OracleSpec ι} {OuterStmtIn OuterWitIn OuterStmtOut OuterWitOut InnerStmtIn InnerWitIn InnerStmtOut InnerWitOut : Type} {lens : Context.Lens OuterStmtIn OuterStmtOut InnerStmtIn InnerStmtOut OuterWitIn OuterWitOut InnerWitIn InnerWitOut} {outerStmtIn : OuterStmtIn} {outerWitIn : OuterWitIn} {P : Prover oSpec InnerStmtIn InnerWitIn InnerStmtOut InnerWitOut pSpec} :
                                      runWithLog outerStmtIn outerWitIn (liftContext lens P) = do let __discrFunction.uncurry (fun (stmt : InnerStmtIn) (wit : InnerWitIn) => runWithLog stmt wit P) (lens.proj (outerStmtIn, outerWitIn)) match __discr with | ((fullTranscript, innerCtxOut), queryLog) => pure ((fullTranscript, lens.lift (outerStmtIn, outerWitIn) innerCtxOut), queryLog)

                                      Lifting the prover intertwines with logging queries of the prover

                                      theorem Reduction.liftContext_run {n : } {pSpec : ProtocolSpec n} {ι : Type} {oSpec : OracleSpec ι} {OuterStmtIn OuterWitIn OuterStmtOut OuterWitOut InnerStmtIn InnerWitIn InnerStmtOut InnerWitOut : Type} {lens : Context.Lens OuterStmtIn OuterStmtOut InnerStmtIn InnerStmtOut OuterWitIn OuterWitOut InnerWitIn InnerWitOut} {outerStmtIn : OuterStmtIn} {outerWitIn : OuterWitIn} {R : Reduction oSpec InnerStmtIn InnerWitIn InnerStmtOut InnerWitOut pSpec} :
                                      run outerStmtIn outerWitIn (liftContext lens R) = do let __discrFunction.uncurry (fun (stmt : InnerStmtIn) (wit : InnerWitIn) => run stmt wit R) (lens.proj (outerStmtIn, outerWitIn)) match __discr with | ((fullTranscript, innerCtxOut), verInnerStmtOut) => pure ((fullTranscript, lens.lift (outerStmtIn, outerWitIn) innerCtxOut), lens.stmt.lift outerStmtIn verInnerStmtOut)
                                      theorem Reduction.liftContext_runWithLog {n : } {pSpec : ProtocolSpec n} {ι : Type} {oSpec : OracleSpec ι} {OuterStmtIn OuterWitIn OuterStmtOut OuterWitOut InnerStmtIn InnerWitIn InnerStmtOut InnerWitOut : Type} {lens : Context.Lens OuterStmtIn OuterStmtOut InnerStmtIn InnerStmtOut OuterWitIn OuterWitOut InnerWitIn InnerWitOut} {outerStmtIn : OuterStmtIn} {outerWitIn : OuterWitIn} {R : Reduction oSpec InnerStmtIn InnerWitIn InnerStmtOut InnerWitOut pSpec} :
                                      runWithLog outerStmtIn outerWitIn (liftContext lens R) = do let __discrFunction.uncurry (fun (stmt : InnerStmtIn) (wit : InnerWitIn) => runWithLog stmt wit R) (lens.proj (outerStmtIn, outerWitIn)) match __discr with | (((fullTranscript, innerCtxOut), verInnerStmtOut), queryLog) => pure (((fullTranscript, lens.lift (outerStmtIn, outerWitIn) innerCtxOut), lens.stmt.lift outerStmtIn verInnerStmtOut), queryLog)
                                      theorem Reduction.liftContext_completeness {n : } {pSpec : ProtocolSpec n} {ι : Type} {oSpec : OracleSpec ι} {OuterStmtIn OuterWitIn OuterStmtOut OuterWitOut InnerStmtIn InnerWitIn InnerStmtOut InnerWitOut : Type} [(i : pSpec.ChallengeIdx) → OracleComp.SelectableType (pSpec.Challenge i)] {σ : Type} {init : ProbComp σ} {impl : QueryImpl oSpec (StateT σ ProbComp)} {outerRelIn : Set (OuterStmtIn × OuterWitIn)} {outerRelOut : Set (OuterStmtOut × OuterWitOut)} {innerRelIn : Set (InnerStmtIn × InnerWitIn)} {innerRelOut : Set (InnerStmtOut × InnerWitOut)} {R : Reduction oSpec InnerStmtIn InnerWitIn InnerStmtOut InnerWitOut pSpec} {completenessError : NNReal} {lens : Context.Lens OuterStmtIn OuterStmtOut InnerStmtIn InnerStmtOut OuterWitIn OuterWitOut InnerWitIn InnerWitOut} [lensComplete : Context.Lens.IsComplete outerRelIn innerRelIn outerRelOut innerRelOut (compatContext lens R) lens] (h : completeness init impl innerRelIn innerRelOut R completenessError) :
                                      completeness init impl outerRelIn outerRelOut (liftContext lens R) completenessError

                                      Lifting the reduction preserves completeness, assuming the lens satisfies its completeness conditions

                                      theorem Reduction.liftContext_perfectCompleteness {n : } {pSpec : ProtocolSpec n} {ι : Type} {oSpec : OracleSpec ι} {OuterStmtIn OuterWitIn OuterStmtOut OuterWitOut InnerStmtIn InnerWitIn InnerStmtOut InnerWitOut : Type} [(i : pSpec.ChallengeIdx) → OracleComp.SelectableType (pSpec.Challenge i)] {σ : Type} {init : ProbComp σ} {impl : QueryImpl oSpec (StateT σ ProbComp)} {outerRelIn : Set (OuterStmtIn × OuterWitIn)} {outerRelOut : Set (OuterStmtOut × OuterWitOut)} {innerRelIn : Set (InnerStmtIn × InnerWitIn)} {innerRelOut : Set (InnerStmtOut × InnerWitOut)} {R : Reduction oSpec InnerStmtIn InnerWitIn InnerStmtOut InnerWitOut pSpec} {lens : Context.Lens OuterStmtIn OuterStmtOut InnerStmtIn InnerStmtOut OuterWitIn OuterWitOut InnerWitIn InnerWitOut} [lensComplete : Context.Lens.IsComplete outerRelIn innerRelIn outerRelOut innerRelOut (compatContext lens R) lens] (h : perfectCompleteness init impl innerRelIn innerRelOut R) :
                                      perfectCompleteness init impl outerRelIn outerRelOut (liftContext lens R)
                                      theorem Verifier.liftContext_soundness {n : } {pSpec : ProtocolSpec n} {ι : Type} {oSpec : OracleSpec ι} {OuterStmtIn OuterStmtOut InnerStmtIn InnerStmtOut : Type} [(i : pSpec.ChallengeIdx) → OracleComp.SelectableType (pSpec.Challenge i)] {σ : Type} {init : ProbComp σ} {impl : QueryImpl oSpec (StateT σ ProbComp)} [Inhabited InnerStmtOut] {outerLangIn : Set OuterStmtIn} {outerLangOut : Set OuterStmtOut} {innerLangIn : Set InnerStmtIn} {innerLangOut : Set InnerStmtOut} {soundnessError : NNReal} {lens : Statement.Lens OuterStmtIn OuterStmtOut InnerStmtIn InnerStmtOut} (V : Verifier oSpec InnerStmtIn InnerStmtOut pSpec) [lensSound : Statement.Lens.IsSound outerLangIn outerLangOut innerLangIn innerLangOut (compatStatement lens V) lens] (h : soundness init impl innerLangIn innerLangOut V soundnessError) :
                                      soundness init impl outerLangIn outerLangOut (liftContext lens V) soundnessError

                                      Lifting the reduction preserves soundness, assuming the lens satisfies its soundness conditions

                                      theorem Verifier.liftContext_knowledgeSoundness {n : } {pSpec : ProtocolSpec n} {ι : Type} {oSpec : OracleSpec ι} {OuterStmtIn OuterWitIn OuterStmtOut OuterWitOut InnerStmtIn InnerWitIn InnerStmtOut InnerWitOut : Type} [(i : pSpec.ChallengeIdx) → OracleComp.SelectableType (pSpec.Challenge i)] {σ : Type} {init : ProbComp σ} {impl : QueryImpl oSpec (StateT σ ProbComp)} [Inhabited InnerStmtOut] [Inhabited InnerWitIn] {outerRelIn : Set (OuterStmtIn × OuterWitIn)} {outerRelOut : Set (OuterStmtOut × OuterWitOut)} {innerRelIn : Set (InnerStmtIn × InnerWitIn)} {innerRelOut : Set (InnerStmtOut × InnerWitOut)} {knowledgeError : NNReal} {stmtLens : Statement.Lens OuterStmtIn OuterStmtOut InnerStmtIn InnerStmtOut} {witLens : Witness.InvLens OuterStmtIn OuterWitIn OuterWitOut InnerWitIn InnerWitOut} (V : Verifier oSpec InnerStmtIn InnerStmtOut pSpec) [lensKS : Extractor.Lens.IsKnowledgeSound outerRelIn innerRelIn outerRelOut innerRelOut (compatStatement stmtLens V) (fun (x : OuterWitOut) (x : InnerWitIn) => True) { stmt := stmtLens, wit := witLens }] (h : knowledgeSoundness init impl innerRelIn innerRelOut V knowledgeError) :
                                      knowledgeSoundness init impl outerRelIn outerRelOut (liftContext stmtLens V) knowledgeError
                                      theorem Verifier.liftContext_rbr_soundness {n : } {pSpec : ProtocolSpec n} {ι : Type} {oSpec : OracleSpec ι} {OuterStmtIn OuterStmtOut InnerStmtIn InnerStmtOut : Type} [(i : pSpec.ChallengeIdx) → OracleComp.SelectableType (pSpec.Challenge i)] {σ : Type} {init : ProbComp σ} {impl : QueryImpl oSpec (StateT σ ProbComp)} [Inhabited InnerStmtOut] {outerLangIn : Set OuterStmtIn} {outerLangOut : Set OuterStmtOut} {innerLangIn : Set InnerStmtIn} {innerLangOut : Set InnerStmtOut} {rbrSoundnessError : pSpec.ChallengeIdxNNReal} {lens : Statement.Lens OuterStmtIn OuterStmtOut InnerStmtIn InnerStmtOut} (V : Verifier oSpec InnerStmtIn InnerStmtOut pSpec) [lensSound : Statement.Lens.IsSound outerLangIn outerLangOut innerLangIn innerLangOut (compatStatement lens V) lens] (h : rbrSoundness init impl innerLangIn innerLangOut V rbrSoundnessError) :
                                      rbrSoundness init impl outerLangIn outerLangOut (liftContext lens V) rbrSoundnessError
                                      theorem Verifier.liftContext_rbr_knowledgeSoundness {n : } {pSpec : ProtocolSpec n} {ι : Type} {oSpec : OracleSpec ι} {OuterStmtIn OuterWitIn OuterStmtOut OuterWitOut InnerStmtIn InnerWitIn InnerStmtOut InnerWitOut : Type} [(i : pSpec.ChallengeIdx) → OracleComp.SelectableType (pSpec.Challenge i)] {σ : Type} {init : ProbComp σ} {impl : QueryImpl oSpec (StateT σ ProbComp)} [Inhabited InnerStmtOut] [Inhabited InnerWitIn] {outerRelIn : Set (OuterStmtIn × OuterWitIn)} {outerRelOut : Set (OuterStmtOut × OuterWitOut)} {innerRelIn : Set (InnerStmtIn × InnerWitIn)} {innerRelOut : Set (InnerStmtOut × InnerWitOut)} {rbrKnowledgeError : pSpec.ChallengeIdxNNReal} {stmtLens : Statement.Lens OuterStmtIn OuterStmtOut InnerStmtIn InnerStmtOut} {witLens : Witness.InvLens OuterStmtIn OuterWitIn OuterWitOut InnerWitIn InnerWitOut} (V : Verifier oSpec InnerStmtIn InnerStmtOut pSpec) [lensKS : Extractor.Lens.IsKnowledgeSound outerRelIn innerRelIn outerRelOut innerRelOut (compatStatement stmtLens V) (fun (x : OuterWitOut) (x : InnerWitIn) => True) { stmt := stmtLens, wit := witLens }] (h : rbrKnowledgeSoundness init impl innerRelIn innerRelOut V rbrKnowledgeError) :
                                      rbrKnowledgeSoundness init impl outerRelIn outerRelOut (liftContext stmtLens V) rbrKnowledgeError
                                      Equations
                                        Instances For
                                          Equations
                                            Instances For
                                              Equations
                                                Instances For
                                                  Equations
                                                    Instances For
                                                      Equations
                                                        Instances For
                                                          Equations
                                                            Instances For
                                                              Equations
                                                                Instances For
                                                                  Equations
                                                                    Instances For
                                                                      Equations
                                                                        Instances For