Forking Lemma #
theorem
probOutput_prod_mk_seq_map_eq_mul
{ι : Type u}
{spec : OracleSpec ι}
{α β : Type v}
[spec.FiniteRange]
(oa : OracleComp spec α)
(ob : OracleComp spec β)
(z : α × β)
:
theorem
probOutput_prod_mk_apply_seq_map_eq_mul
{ι : Type u}
{spec : OracleSpec ι}
{α β γ δ : Type v}
[spec.FiniteRange]
(oa : OracleComp spec α)
(ob : OracleComp spec β)
(f : α → γ)
(g : β → δ)
(z : γ × δ)
:
theorem
probOutput_prod_mk_apply_seq_map_eq_mul'
{ι : Type u}
{spec : OracleSpec ι}
{α β γ δ : Type v}
[spec.FiniteRange]
(oa : OracleComp spec α)
(ob : OracleComp spec β)
(f : α → γ)
(g : β → δ)
(x : γ)
(y : δ)
:
@[simp]
theorem
probFailure_bind_eq_sum_probFailure
{ι : Type u}
{spec : OracleSpec ι}
{α β γ : Type v}
[spec.FiniteRange]
(oa : OracleComp spec α)
{ob : α → OracleComp spec β}
{σ : Type u}
{s : Finset σ}
{oc : σ → α → OracleComp spec γ}
:
theorem
probOutput_map_eq_probEvent
{ι : Type u}
{spec : OracleSpec ι}
{α β : Type v}
[spec.FiniteRange]
(oa : OracleComp spec α)
(f : α → β)
(y : β)
:
theorem
probOutput_bind_ite_failure_eq_tsum
{ι : Type u}
{spec : OracleSpec ι}
{α β : Type v}
[spec.FiniteRange]
[DecidableEq β]
(oa : OracleComp spec α)
(f : α → β)
(p : α → Prop)
[DecidablePred p]
(y : β)
:
- main : OracleComp spec α
The main program to fork execution of
- queryBound : ι → ℕ
A bound on the number of queries the adversary makes
- js : List ι
List of oracles that are queried during computation (used to order seed generation).
Instances For
def
OracleComp.fork
{ι : Type}
[DecidableEq ι]
{spec : OracleSpec ι}
[(i : ι) → SelectableType (spec.range i)]
[spec.DecidableEq]
[unifSpec ⊂ₒ spec]
{α : Type}
(main : OracleComp spec α)
(qb : ι → ℕ)
(js : List ι)
(i : ι)
(cf : α → Option (Fin (qb i + 1)))
:
OracleComp spec (α × α)
Version of fork
that doesn't choose s
ahead of time.
Should give better concrete bounds.
Equations
- One or more equations did not get rendered due to their size.
Instances For
@[simp]
theorem
OracleComp.support_map_prod_map_fork
{ι : Type}
[DecidableEq ι]
{spec : OracleSpec ι}
[(i : ι) → SelectableType (spec.range i)]
[spec.DecidableEq]
[unifSpec ⊂ₒ spec]
{α : Type}
(main : OracleComp spec α)
(qb : ι → ℕ)
(js : List ι)
(i : ι)
(cf : α → Option (Fin (qb i + 1)))
[spec.FiniteRange]
:
@[simp]
theorem
OracleComp.finSupport_map_prod_map_fork
{ι : Type}
[DecidableEq ι]
{spec : OracleSpec ι}
[(i : ι) → SelectableType (spec.range i)]
[spec.DecidableEq]
[unifSpec ⊂ₒ spec]
{α : Type}
(main : OracleComp spec α)
(qb : ι → ℕ)
(js : List ι)
(i : ι)
(cf : α → Option (Fin (qb i + 1)))
[spec.FiniteRange]
:
(Prod.map cf cf <$> main.fork qb js i cf).finSupport = Finset.image (fun (s : Option (Fin (qb i + 1))) => (s, s)) (cf <$> main).finSupport
theorem
OracleComp.apply_eq_apply_of_mem_support_fork
{ι : Type}
[DecidableEq ι]
{spec : OracleSpec ι}
[(i : ι) → SelectableType (spec.range i)]
[spec.DecidableEq]
[unifSpec ⊂ₒ spec]
{α : Type}
(main : OracleComp spec α)
(qb : ι → ℕ)
(js : List ι)
(i : ι)
(cf : α → Option (Fin (qb i + 1)))
[spec.FiniteRange]
(x₁ x₂ : α)
(h : (x₁, x₂) ∈ (main.fork qb js i cf).support)
:
@[simp]
theorem
OracleComp.probOutput_none_map_fork_left
{ι : Type}
[DecidableEq ι]
{spec : OracleSpec ι}
[(i : ι) → SelectableType (spec.range i)]
[spec.DecidableEq]
[unifSpec ⊂ₒ spec]
{α : Type}
(main : OracleComp spec α)
(qb : ι → ℕ)
(js : List ι)
(i : ι)
(cf : α → Option (Fin (qb i + 1)))
[spec.FiniteRange]
(s : Option (Fin (qb i + 1)))
:
@[simp]
theorem
OracleComp.probOutput_none_map_fork_right
{ι : Type}
[DecidableEq ι]
{spec : OracleSpec ι}
[(i : ι) → SelectableType (spec.range i)]
[spec.DecidableEq]
[unifSpec ⊂ₒ spec]
{α : Type}
(main : OracleComp spec α)
(qb : ι → ℕ)
(js : List ι)
(i : ι)
(cf : α → Option (Fin (qb i + 1)))
[spec.FiniteRange]
(s : Option (Fin (qb i + 1)))
:
theorem
OracleComp.exists_log_of_mem_support_fork
{ι : Type}
[DecidableEq ι]
{spec : OracleSpec ι}
[(i : ι) → SelectableType (spec.range i)]
[spec.DecidableEq]
[unifSpec ⊂ₒ spec]
{α : Type}
(main : OracleComp spec α)
(qb : ι → ℕ)
(js : List ι)
(i : ι)
(cf : α → Option (Fin (qb i + 1)))
[spec.FiniteRange]
(x₁ x₂ : α)
(h : (x₁, x₂) ∈ (main.fork qb js i cf).support)
:
∃ (s : Fin (qb i + 1)),
cf x₁ = some s ∧ cf x₂ = some s ∧ ∃ (log₁ : spec.QueryLog) (hcf₁ : ↑s < log₁.countQ i) (log₂ : spec.QueryLog) (hcf₁_1 : ↑s < log₂.countQ i),
(log₁.getQ i)[s].1 = (log₂.getQ i)[s].1 ∧ (log₁.getQ i)[s].2 ≠ (log₂.getQ i)[s].2 ∧ (x₁, log₁) ∈ (simulateQ loggingOracle main).run.support ∧ (x₂, log₂) ∈ (simulateQ loggingOracle main).run.support
theorem
OracleComp.le_probOutput_fork
{ι : Type}
[DecidableEq ι]
{spec : OracleSpec ι}
[(i : ι) → SelectableType (spec.range i)]
[spec.DecidableEq]
[unifSpec ⊂ₒ spec]
{α : Type}
(main : OracleComp spec α)
(qb : ι → ℕ)
(js : List ι)
(i : ι)
(cf : α → Option (Fin (qb i + 1)))
[spec.FiniteRange]
(s : Fin (qb i + 1))
:
theorem
OracleComp.probFailure_fork_le
{ι : Type}
[DecidableEq ι]
{spec : OracleSpec ι}
[(i : ι) → SelectableType (spec.range i)]
[spec.DecidableEq]
[unifSpec ⊂ₒ spec]
{α : Type}
(main : OracleComp spec α)
(qb : ι → ℕ)
(js : List ι)
(i : ι)
(cf : α → Option (Fin (qb i + 1)))
[spec.FiniteRange]
: