Distribution Semantics for Computations with Lists and Vectors #
This file contains lemmas for probEvent
and probOutput
of computations involving List
.
We also include Vector
as a related case.
theorem
OracleComp.mem_support_seq_map_cons_iff'
{ι : Type u}
{spec : OracleSpec ι}
{α : Type v}
(oa : OracleComp spec α)
(ob : OracleComp spec (List α))
(xs : List α)
:
theorem
OracleComp.cons_mem_support_seq_map_cons_iff
{ι : Type u}
{spec : OracleSpec ι}
{α : Type v}
(oa : OracleComp spec α)
(ob : OracleComp spec (List α))
(x : α)
(xs : List α)
:
theorem
OracleComp.mem_finSupport_seq_map_cons_iff'
{ι : Type u}
{spec : OracleSpec ι}
{α : Type v}
(oa : OracleComp spec α)
(ob : OracleComp spec (List α))
[spec.FiniteRange]
[spec.DecidableEq]
[DecidableEq α]
(xs : List α)
:
xs ∈ (List.cons <$> oa <*> ob).finSupport ↔ List.recOn xs False fun (x : α) (xs : List α) (x_1 : Prop) => x ∈ oa.finSupport ∧ xs ∈ ob.finSupport
theorem
OracleComp.mem_finSupport_seq_map_cons_iff
{ι : Type u}
{spec : OracleSpec ι}
{α : Type v}
(oa : OracleComp spec α)
(ob : OracleComp spec (List α))
[spec.FiniteRange]
[spec.DecidableEq]
[DecidableEq α]
(xs : List α)
(h : xs ≠ [])
:
theorem
OracleComp.cons_mem_finSupport_seq_map_cons_iff
{ι : Type u}
{spec : OracleSpec ι}
{α : Type v}
(oa : OracleComp spec α)
(ob : OracleComp spec (List α))
[spec.FiniteRange]
[spec.DecidableEq]
[DecidableEq α]
(x : α)
(xs : List α)
:
theorem
OracleComp.probOutput_cons_seq_map_cons_eq_mul
{ι : Type u}
{spec : OracleSpec ι}
{α : Type v}
(oa : OracleComp spec α)
(ob : OracleComp spec (List α))
[spec.FiniteRange]
[spec.DecidableEq]
(x : α)
(xs : List α)
:
theorem
OracleComp.probOutput_cons_seq_map_cons_eq_mul'
{ι : Type u}
{spec : OracleSpec ι}
{α : Type v}
(oa : OracleComp spec α)
(ob : OracleComp spec (List α))
[spec.FiniteRange]
[spec.DecidableEq]
(x : α)
(xs : List α)
:
@[simp]
theorem
OracleComp.probOutput_seq_map_cons_eq_mul
{ι : Type u}
{spec : OracleSpec ι}
{α : Type v}
(oa : OracleComp spec α)
(ob : OracleComp spec (List α))
[spec.FiniteRange]
[spec.DecidableEq]
(xs : List α)
:
@[simp]
theorem
OracleComp.probOutput_map_append_left
{ι : Type u}
{spec : OracleSpec ι}
{α : Type v}
[DecidableEq α]
[spec.FiniteRange]
(xs : List α)
(oa : OracleComp spec (List α))
(ys : List α)
:
@[simp]
theorem
OracleComp.probFailure_list_mapM_loop
{ι : Type u}
{spec : OracleSpec ι}
{α : Type u_1}
{β : Type u_2}
[spec.FiniteRange]
(xs : List α)
(f : α → OracleComp spec β)
(ys : List β)
:
@[simp]
theorem
OracleComp.probOutput_list_mapM_loop
{ι : Type u}
{spec : OracleSpec ι}
{α : Type u_1}
{β : Type u_2}
[DecidableEq β]
[spec.FiniteRange]
(xs : List α)
(f : α → OracleComp spec β)
(ys zs : List β)
:
@[simp]
theorem
OracleComp.probOutput_list_mapM
{ι : Type u}
{spec : OracleSpec ι}
{α : Type u_1}
{β : Type u_2}
[spec.FiniteRange]
(xs : List α)
(f : α → OracleComp spec β)
(ys : List β)
:
@[simp]
theorem
OracleComp.neverFails_list_mapM
{ι : Type u}
{spec : OracleSpec ι}
{α β : Type v}
{f : α → OracleComp spec β}
{as : List α}
(h : ∀ x ∈ as, (f x).neverFails)
:
(List.mapM f as).neverFails
If each element of a list is mapped to a computation that never fails, then the computation obtained by monadic mapping over the list also never fails.
@[simp]
theorem
OracleComp.neverFails_list_mapM'
{ι : Type u}
{spec : OracleSpec ι}
{α β : Type v}
{f : α → OracleComp spec β}
{as : List α}
(h : ∀ x ∈ as, (f x).neverFails)
:
(List.mapM' f as).neverFails
@[simp]
theorem
OracleComp.neverFails_list_flatMapM
{ι : Type u}
{spec : OracleSpec ι}
{α β : Type v}
{f : α → OracleComp spec (List β)}
{as : List α}
(h : ∀ x ∈ as, (f x).neverFails)
:
(List.flatMapM f as).neverFails
@[simp]
theorem
OracleComp.neverFails_list_filterMapM
{ι : Type u}
{spec : OracleSpec ι}
{α β : Type v}
{f : α → OracleComp spec (Option β)}
{as : List α}
(h : ∀ x ∈ as, (f x).neverFails)
:
(List.filterMapM f as).neverFails
@[simp]
theorem
OracleComp.neverFails_list_foldlM
{ι : Type u}
{spec : OracleSpec ι}
{α s : Type v}
{f : s → α → OracleComp spec s}
{init : s}
{as : List α}
(h : ∀ (i : s), ∀ x ∈ as, (f i x).neverFails)
:
(List.foldlM f init as).neverFails
@[simp]
theorem
OracleComp.neverFails_list_foldrM
{ι : Type u}
{spec : OracleSpec ι}
{α s : Type v}
{f : α → s → OracleComp spec s}
{init : s}
{as : List α}
(h : ∀ (i : s), ∀ x ∈ as, (f x i).neverFails)
:
(List.foldrM f init as).neverFails
@[simp]
theorem
OracleComp.support_seq_map_vector_cons
{ι : Type u}
{spec : OracleSpec ι}
{α : Type v}
{n : ℕ}
(oa : OracleComp spec α)
(ob : OracleComp spec (List.Vector α n))
:
@[simp]
theorem
OracleComp.probOutput_seq_map_vector_cons_eq_mul
{ι : Type u}
{spec : OracleSpec ι}
{α : Type v}
{n : ℕ}
(oa : OracleComp spec α)
(ob : OracleComp spec (List.Vector α n))
[spec.FiniteRange]
[spec.DecidableEq]
(xs : List.Vector α (n + 1))
:
@[simp]
theorem
OracleComp.probOutput_seq_map_vector_cons_eq_mul'
{ι : Type u}
{spec : OracleSpec ι}
{α : Type v}
{n : ℕ}
(oa : OracleComp spec α)
(ob : OracleComp spec (List.Vector α n))
[spec.FiniteRange]
[spec.DecidableEq]
(xs : List.Vector α (n + 1))
:
@[simp]
theorem
OracleComp.probOutput_vector_toList
{ι : Type u}
{spec : OracleSpec ι}
{α : Type v}
[spec.FiniteRange]
[spec.DecidableEq]
{n : ℕ}
(oa : OracleComp spec (List.Vector α n))
(xs : List α)
:
@[simp]
theorem
OracleComp.neverFails_list_vector_mmap
{ι : Type u}
{spec : OracleSpec ι}
{α β : Type v}
{n : ℕ}
{f : α → OracleComp spec β}
{as : List.Vector α n}
(h : ∀ x ∈ as.toList, (f x).neverFails)
:
(List.Vector.mmap f as).neverFails
@[simp]
theorem
OracleComp.neverFails_array_mapM
{ι : Type u}
{spec : OracleSpec ι}
{α β : Type v}
{f : α → OracleComp spec β}
{as : Array α}
(h : ∀ x ∈ as, (f x).neverFails)
:
(Array.mapM f as).neverFails
theorem
OracleComp.mem_support_vector_mapM
{ι : Type u}
{spec : OracleSpec ι}
{α β : Type v}
{n : ℕ}
{f : α → OracleComp spec β}
{as : Vector α n}
{x : Vector β n}
:
@[simp]
theorem
OracleComp.neverFails_vector_mapM
{ι : Type u}
{spec : OracleSpec ι}
{α β : Type v}
{n : ℕ}
{f : α → OracleComp spec β}
{as : Vector α n}
(h : ∀ x ∈ as.toList, (f x).neverFails)
:
(Vector.mapM f as).neverFails