1. Usage and examples
1.1. Usage
To use Kernel-Hom, add the following to your lakefile.toml:
[[require]] name = "kernelhom" git = "https://github.com/gaetanserre/KernelHom.git"
or to your lakefile.lean:
require kernelhom from git "https://github.com/gaetanserre/KernelHom" @ "main"
Then, in your Lean files, you can import the library with:
import KernelHom
Tactics
The library provides several tactics for working with s-finite kernels equalities. The main tactics are:
-
kernel_hom: Transforms a s-finite kernel equality into an equality in theSFinKermonoidal category. -
hom_kernel: The inverse ofkernel_hom, transforms an equality inSFinKerback into a kernel equality. -
kernel_monoidal: Applies themonoidaltactic to a s-finite kernel equality. -
kernel_coherence: Applies thecoherencetactic to a s-finite kernel equality.
Basically, whenever you have a equality of s-finite kernels that you want to simplify, you can apply kernel_hom to transform it into a categorical equality, try applying categorical tactics, simps, or manually manipulate it, and then apply hom_kernel to get back to a kernel equality if needed. The built-in helpers kernel_monoidal and kernel_coherence directly apply categorical tactics to kernels without needing to manually invoke the translation tactic.
Kernel diagrams
The library also provides the kernel_diagram command, which generates string diagrams for kernel expressions. This is an adaptation of the string_diagram command, where s-finite kernels are represented as morphisms using kernel_hom. This provides a visual representation of kernel compositions and transformations, aiding intuition and understanding. The use of this command is similar to string_diagram:
#kernel_diagram deterministic_comp_copy
1.2. Examples
These tactics are particularly useful when dealing with compositions and parallel compositions of kernels. The following examples are taken from the file KernelLemmas.lean and illustrate how the tactics can be used to drastically simplify the proofs of kernel equalities.
-
parallelComp_id_left_comp_parallelComp
lemma parallelComp_id_left_comp_parallelComp₀ :
(Kernel.id ∥ₖ ξ) ∘ₖ (κ ∥ₖ η) = κ ∥ₖ (ξ ∘ₖ η) := X:Type u_1Y:Type u_2Z:Type u_3T:Type u_4inst✝⁵:MeasurableSpace Xinst✝⁴:MeasurableSpace Yinst✝³:MeasurableSpace Zinst✝²:MeasurableSpace Tκ:Kernel X Yξ:Kernel Z Tη:Kernel Y Zinst✝¹:IsSFiniteKernel ηinst✝:IsSFiniteKernel ξ⊢ Kernel.id ∥ₖ ξ ∘ₖ (κ ∥ₖ η) = κ ∥ₖ (ξ ∘ₖ η)
X:Type u_1Y:Type u_2Z:Type u_3T:Type u_4inst✝⁵:MeasurableSpace Xinst✝⁴:MeasurableSpace Yinst✝³:MeasurableSpace Zinst✝²:MeasurableSpace Tκ:Kernel X Yξ:Kernel Z Tη:Kernel Y Zinst✝¹:IsSFiniteKernel ηinst✝:IsSFiniteKernel ξhκ:IsSFiniteKernel κ⊢ Kernel.id ∥ₖ ξ ∘ₖ (κ ∥ₖ η) = κ ∥ₖ (ξ ∘ₖ η)X:Type u_1Y:Type u_2Z:Type u_3T:Type u_4inst✝⁵:MeasurableSpace Xinst✝⁴:MeasurableSpace Yinst✝³:MeasurableSpace Zinst✝²:MeasurableSpace Tκ:Kernel X Yξ:Kernel Z Tη:Kernel Y Zinst✝¹:IsSFiniteKernel ηinst✝:IsSFiniteKernel ξhκ:¬IsSFiniteKernel κ⊢ Kernel.id ∥ₖ ξ ∘ₖ (κ ∥ₖ η) = κ ∥ₖ (ξ ∘ₖ η)
X:Type u_1Y:Type u_2Z:Type u_3T:Type u_4inst✝⁵:MeasurableSpace Xinst✝⁴:MeasurableSpace Yinst✝³:MeasurableSpace Zinst✝²:MeasurableSpace Tκ:Kernel X Yξ:Kernel Z Tη:Kernel Y Zinst✝¹:IsSFiniteKernel ηinst✝:IsSFiniteKernel ξhκ:¬IsSFiniteKernel κ⊢ Kernel.id ∥ₖ ξ ∘ₖ (κ ∥ₖ η) = κ ∥ₖ (ξ ∘ₖ η)X:Type u_1Y:Type u_2Z:Type u_3T:Type u_4inst✝⁵:MeasurableSpace Xinst✝⁴:MeasurableSpace Yinst✝³:MeasurableSpace Zinst✝²:MeasurableSpace Tκ:Kernel X Yξ:Kernel Z Tη:Kernel Y Zinst✝¹:IsSFiniteKernel ηinst✝:IsSFiniteKernel ξhκ:IsSFiniteKernel κ⊢ Kernel.id ∥ₖ ξ ∘ₖ (κ ∥ₖ η) = κ ∥ₖ (ξ ∘ₖ η); X:Type u_1Y:Type u_2Z:Type u_3T:Type u_4inst✝⁵:MeasurableSpace Xinst✝⁴:MeasurableSpace Yinst✝³:MeasurableSpace Zinst✝²:MeasurableSpace Tκ:Kernel X Yξ:Kernel Z Tη:Kernel Y Zinst✝¹:IsSFiniteKernel ηinst✝:IsSFiniteKernel ξhκ:¬IsSFiniteKernel κ⊢ Kernel.id ∥ₖ ξ ∘ₖ (κ ∥ₖ η) = κ ∥ₖ (ξ ∘ₖ η) All goals completed! 🐙
All goals completed! 🐙-
parallelComp_id_right_comp_parallelComp
lemma parallelComp_id_right_comp_parallelComp₀ :
(ξ ∥ₖ Kernel.id) ∘ₖ (η ∥ₖ κ) = (ξ ∘ₖ η) ∥ₖ κ := X:Type u_1Y:Type u_2Z:Type u_3T:Type u_4inst✝⁵:MeasurableSpace Xinst✝⁴:MeasurableSpace Yinst✝³:MeasurableSpace Zinst✝²:MeasurableSpace Tκ:Kernel X Yξ:Kernel Z Tη:Kernel Y Zinst✝¹:IsSFiniteKernel ηinst✝:IsSFiniteKernel ξ⊢ ξ ∥ₖ Kernel.id ∘ₖ (η ∥ₖ κ) = ξ ∘ₖ η ∥ₖ κ
X:Type u_1Y:Type u_2Z:Type u_3T:Type u_4inst✝⁵:MeasurableSpace Xinst✝⁴:MeasurableSpace Yinst✝³:MeasurableSpace Zinst✝²:MeasurableSpace Tκ:Kernel X Yξ:Kernel Z Tη:Kernel Y Zinst✝¹:IsSFiniteKernel ηinst✝:IsSFiniteKernel ξhκ:IsSFiniteKernel κ⊢ ξ ∥ₖ Kernel.id ∘ₖ (η ∥ₖ κ) = ξ ∘ₖ η ∥ₖ κX:Type u_1Y:Type u_2Z:Type u_3T:Type u_4inst✝⁵:MeasurableSpace Xinst✝⁴:MeasurableSpace Yinst✝³:MeasurableSpace Zinst✝²:MeasurableSpace Tκ:Kernel X Yξ:Kernel Z Tη:Kernel Y Zinst✝¹:IsSFiniteKernel ηinst✝:IsSFiniteKernel ξhκ:¬IsSFiniteKernel κ⊢ ξ ∥ₖ Kernel.id ∘ₖ (η ∥ₖ κ) = ξ ∘ₖ η ∥ₖ κ
X:Type u_1Y:Type u_2Z:Type u_3T:Type u_4inst✝⁵:MeasurableSpace Xinst✝⁴:MeasurableSpace Yinst✝³:MeasurableSpace Zinst✝²:MeasurableSpace Tκ:Kernel X Yξ:Kernel Z Tη:Kernel Y Zinst✝¹:IsSFiniteKernel ηinst✝:IsSFiniteKernel ξhκ:¬IsSFiniteKernel κ⊢ ξ ∥ₖ Kernel.id ∘ₖ (η ∥ₖ κ) = ξ ∘ₖ η ∥ₖ κX:Type u_1Y:Type u_2Z:Type u_3T:Type u_4inst✝⁵:MeasurableSpace Xinst✝⁴:MeasurableSpace Yinst✝³:MeasurableSpace Zinst✝²:MeasurableSpace Tκ:Kernel X Yξ:Kernel Z Tη:Kernel Y Zinst✝¹:IsSFiniteKernel ηinst✝:IsSFiniteKernel ξhκ:IsSFiniteKernel κ⊢ ξ ∥ₖ Kernel.id ∘ₖ (η ∥ₖ κ) = ξ ∘ₖ η ∥ₖ κ; X:Type u_1Y:Type u_2Z:Type u_3T:Type u_4inst✝⁵:MeasurableSpace Xinst✝⁴:MeasurableSpace Yinst✝³:MeasurableSpace Zinst✝²:MeasurableSpace Tκ:Kernel X Yξ:Kernel Z Tη:Kernel Y Zinst✝¹:IsSFiniteKernel ηinst✝:IsSFiniteKernel ξhκ:¬IsSFiniteKernel κ⊢ ξ ∥ₖ Kernel.id ∘ₖ (η ∥ₖ κ) = ξ ∘ₖ η ∥ₖ κ All goals completed! 🐙
All goals completed! 🐙-
parallelComp_comp_parallelComp
lemma parallelComp_comp_parallelComp₀ :
(η ∥ₖ η') ∘ₖ (κ ∥ₖ κ') = (η ∘ₖ κ) ∥ₖ (η' ∘ₖ κ') := X:Type u_1Y:Type u_2Z:Type u_3Y':Type u_6Z':Type u_7inst✝⁸:MeasurableSpace Xinst✝⁷:MeasurableSpace Yinst✝⁶:MeasurableSpace Zinst✝⁵:MeasurableSpace Y'inst✝⁴:MeasurableSpace Z'κ:Kernel X Yη:Kernel Y Zinst✝³:IsSFiniteKernel ηinst✝²:IsSFiniteKernel κκ':Kernel X Y'η':Kernel Y' Z'inst✝¹:IsSFiniteKernel κ'inst✝:IsSFiniteKernel η'⊢ η ∥ₖ η' ∘ₖ (κ ∥ₖ κ') = η ∘ₖ κ ∥ₖ (η' ∘ₖ κ')
All goals completed! 🐙-
parallelComp_comp_prod
lemma parallelComp_comp_prod₀ :
(η ∥ₖ η') ∘ₖ (κ ×ₖ κ') = (η ∘ₖ κ) ×ₖ (η' ∘ₖ κ') := X:Type u_1Y:Type u_2Z:Type u_3Y':Type u_6Z':Type u_7inst✝⁸:MeasurableSpace Xinst✝⁷:MeasurableSpace Yinst✝⁶:MeasurableSpace Zinst✝⁵:MeasurableSpace Y'inst✝⁴:MeasurableSpace Z'κ:Kernel X Yη:Kernel Y Zinst✝³:IsSFiniteKernel ηinst✝²:IsSFiniteKernel κκ':Kernel X Y'η':Kernel Y' Z'inst✝¹:IsSFiniteKernel κ'inst✝:IsSFiniteKernel η'⊢ η ∥ₖ η' ∘ₖ (κ ×ₖ κ') = η ∘ₖ κ ×ₖ (η' ∘ₖ κ')
All goals completed! 🐙-
swap_parallelCompObject of the symmetric category are also handled by the tactic, such as
Kernel.swapthat is translated to the right braiding ofSFinKer.
lemma swap_parallelComp₀ : swap Y T ∘ₖ (κ ∥ₖ ξ) = ξ ∥ₖ κ ∘ₖ swap X Z := X:Type u_1Y:Type u_2Z:Type u_3T:Type u_4inst✝³:MeasurableSpace Xinst✝²:MeasurableSpace Yinst✝¹:MeasurableSpace Zinst✝:MeasurableSpace Tκ:Kernel X Yξ:Kernel Z T⊢ swap Y T ∘ₖ (κ ∥ₖ ξ) = ξ ∥ₖ κ ∘ₖ swap X Z
X:Type u_1Y:Type u_2Z:Type u_3T:Type u_4inst✝³:MeasurableSpace Xinst✝²:MeasurableSpace Yinst✝¹:MeasurableSpace Zinst✝:MeasurableSpace Tκ:Kernel X Yξ:Kernel Z Thκ:IsSFiniteKernel κ⊢ swap Y T ∘ₖ (κ ∥ₖ ξ) = ξ ∥ₖ κ ∘ₖ swap X ZX:Type u_1Y:Type u_2Z:Type u_3T:Type u_4inst✝³:MeasurableSpace Xinst✝²:MeasurableSpace Yinst✝¹:MeasurableSpace Zinst✝:MeasurableSpace Tκ:Kernel X Yξ:Kernel Z Thκ:¬IsSFiniteKernel κ⊢ swap Y T ∘ₖ (κ ∥ₖ ξ) = ξ ∥ₖ κ ∘ₖ swap X Z
X:Type u_1Y:Type u_2Z:Type u_3T:Type u_4inst✝³:MeasurableSpace Xinst✝²:MeasurableSpace Yinst✝¹:MeasurableSpace Zinst✝:MeasurableSpace Tκ:Kernel X Yξ:Kernel Z Thκ:¬IsSFiniteKernel κ⊢ swap Y T ∘ₖ (κ ∥ₖ ξ) = ξ ∥ₖ κ ∘ₖ swap X ZX:Type u_1Y:Type u_2Z:Type u_3T:Type u_4inst✝³:MeasurableSpace Xinst✝²:MeasurableSpace Yinst✝¹:MeasurableSpace Zinst✝:MeasurableSpace Tκ:Kernel X Yξ:Kernel Z Thκ:IsSFiniteKernel κ⊢ swap Y T ∘ₖ (κ ∥ₖ ξ) = ξ ∥ₖ κ ∘ₖ swap X Z; X:Type u_1Y:Type u_2Z:Type u_3T:Type u_4inst✝³:MeasurableSpace Xinst✝²:MeasurableSpace Yinst✝¹:MeasurableSpace Zinst✝:MeasurableSpace Tκ:Kernel X Yξ:Kernel Z Thκ:¬IsSFiniteKernel κ⊢ swap Y T ∘ₖ (κ ∥ₖ ξ) = ξ ∥ₖ κ ∘ₖ swap X Z All goals completed! 🐙
X:Type u_1Y:Type u_2Z:Type u_3T:Type u_4inst✝³:MeasurableSpace Xinst✝²:MeasurableSpace Yinst✝¹:MeasurableSpace Zinst✝:MeasurableSpace Tκ:Kernel X Yξ:Kernel Z Thκ:IsSFiniteKernel κhη:IsSFiniteKernel ξ⊢ swap Y T ∘ₖ (κ ∥ₖ ξ) = ξ ∥ₖ κ ∘ₖ swap X ZX:Type u_1Y:Type u_2Z:Type u_3T:Type u_4inst✝³:MeasurableSpace Xinst✝²:MeasurableSpace Yinst✝¹:MeasurableSpace Zinst✝:MeasurableSpace Tκ:Kernel X Yξ:Kernel Z Thκ:IsSFiniteKernel κhη:¬IsSFiniteKernel ξ⊢ swap Y T ∘ₖ (κ ∥ₖ ξ) = ξ ∥ₖ κ ∘ₖ swap X Z
X:Type u_1Y:Type u_2Z:Type u_3T:Type u_4inst✝³:MeasurableSpace Xinst✝²:MeasurableSpace Yinst✝¹:MeasurableSpace Zinst✝:MeasurableSpace Tκ:Kernel X Yξ:Kernel Z Thκ:IsSFiniteKernel κhη:¬IsSFiniteKernel ξ⊢ swap Y T ∘ₖ (κ ∥ₖ ξ) = ξ ∥ₖ κ ∘ₖ swap X ZX:Type u_1Y:Type u_2Z:Type u_3T:Type u_4inst✝³:MeasurableSpace Xinst✝²:MeasurableSpace Yinst✝¹:MeasurableSpace Zinst✝:MeasurableSpace Tκ:Kernel X Yξ:Kernel Z Thκ:IsSFiniteKernel κhη:IsSFiniteKernel ξ⊢ swap Y T ∘ₖ (κ ∥ₖ ξ) = ξ ∥ₖ κ ∘ₖ swap X Z; X:Type u_1Y:Type u_2Z:Type u_3T:Type u_4inst✝³:MeasurableSpace Xinst✝²:MeasurableSpace Yinst✝¹:MeasurableSpace Zinst✝:MeasurableSpace Tκ:Kernel X Yξ:Kernel Z Thκ:IsSFiniteKernel κhη:¬IsSFiniteKernel ξ⊢ swap Y T ∘ₖ (κ ∥ₖ ξ) = ξ ∥ₖ κ ∘ₖ swap X Z All goals completed! 🐙
X:Type u_1Y:Type u_2Z:Type u_3T:Type u_4inst✝³:MeasurableSpace Xinst✝²:MeasurableSpace Yinst✝¹:MeasurableSpace Zinst✝:MeasurableSpace Tκ:Kernel X Yξ:Kernel Z Thκ:IsSFiniteKernel κhη:IsSFiniteKernel ξ⊢ (κ ⊗ₘ ξ) ≫ (β_ Y T).hom = (β_ X Z).hom ≫ (ξ ⊗ₘ κ)
All goals completed! 🐙-
deterministic_comp_copyThe categorical counterpart of
Kernel.deterministicare automatically treated asDeterministicmorphisms.
lemma deterministic_comp_copy₀ {f : X → Y} (hf : Measurable f) :
(deterministic f hf ∥ₖ deterministic f hf) ∘ₖ copy X = copy Y ∘ₖ deterministic f hf := X:Type u_1Y:Type u_2inst✝¹:MeasurableSpace Xinst✝:MeasurableSpace Yf:X → Yhf:Measurable f⊢ deterministic f hf ∥ₖ deterministic f hf ∘ₖ copy X = copy Y ∘ₖ deterministic f hf
X:Type u_1Y:Type u_2inst✝¹:MeasurableSpace Xinst✝:MeasurableSpace Yf:X → Yhf:Measurable f⊢ Δ ≫ (deterministic f hf ⊗ₘ deterministic f hf) = deterministic f hf ≫ Δ
All goals completed! 🐙lemma discard_comp_deterministic {f : X → Y} (hf : Measurable f) :
discard Y ∘ₖ (deterministic f hf) = discard X := X:Type u_1Y:Type u_2inst✝¹:MeasurableSpace Xinst✝:MeasurableSpace Yf:X → Yhf:Measurable f⊢ discard Y ∘ₖ deterministic f hf = discard X
X:Type u_1Y:Type u_2inst✝¹:MeasurableSpace Xinst✝:MeasurableSpace Yf:X → Yhf:Measurable f⊢ deterministic f hf ≫ ε = ε
All goals completed! 🐙