Kernel Categorical Reasoning

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 the SFinKer monoidal category.

  • hom_kernel: The inverse of kernel_hom, transforms an equality in SFinKer back into a kernel equality.

  • kernel_monoidal: Applies the monoidal tactic to a s-finite kernel equality.

  • kernel_coherence: Applies the coherence tactic 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
Loading string diagram...

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 ξ: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 ξ:¬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 ξ:¬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 ξ: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 ξ:¬IsSFiniteKernel κKernel.id ∥ₖ ξ ∘ₖ (κ ∥ₖ η) = κ ∥ₖ (ξ ∘ₖ η) All goals completed! 🐙 All goals completed! 🐙
Loading string diagram...
  • 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 ξ: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 ξ:¬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 ξ:¬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 ξ: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 ξ:¬IsSFiniteKernel κξ ∥ₖ Kernel.id ∘ₖ (η ∥ₖ κ) = ξ ∘ₖ η ∥ₖ κ All goals completed! 🐙 All goals completed! 🐙
Loading string diagram...
  • 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! 🐙
Loading string diagram...
  • 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! 🐙
Loading string diagram...
  • swap_parallelComp

    Object of the symmetric category are also handled by the tactic, such as Kernel.swap that is translated to the right braiding of SFinKer.

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 Tswap 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: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 T:¬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 T:¬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 T: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 T:¬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 T:IsSFiniteKernel κ: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 T:IsSFiniteKernel κ:¬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 T:IsSFiniteKernel κ:¬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 T:IsSFiniteKernel κ: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 T:IsSFiniteKernel κ:¬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 T:IsSFiniteKernel κ:IsSFiniteKernel ξ(κ ⊗ₘ ξ) (β_ Y T).hom = (β_ X Z).hom (ξ ⊗ₘ κ) All goals completed! 🐙
Loading string diagram...
  • deterministic_comp_copy

    The categorical counterpart of Kernel.deterministic are automatically treated as Deterministic morphisms.

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 fdeterministic 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! 🐙
Loading string diagram...
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 fdiscard Y ∘ₖ deterministic f hf = discard X X:Type u_1Y:Type u_2inst✝¹:MeasurableSpace Xinst✝:MeasurableSpace Yf:X Yhf:Measurable fdeterministic f hf ε = ε All goals completed! 🐙
Loading string diagram...