@@ -6,7 +6,6 @@ Authors: Eric Wieser, Zhangir Azerbayev
6
6
import Mathlib.GroupTheory.Perm.Sign
7
7
import Mathlib.LinearAlgebra.LinearIndependent.Defs
8
8
import Mathlib.LinearAlgebra.Multilinear.Basis
9
- import Mathlib.LinearAlgebra.Multilinear.Curry
10
9
11
10
/-!
12
11
# Alternating Maps
@@ -886,90 +885,18 @@ theorem Basis.ext_alternating {f g : N₁ [⋀^ι]→ₗ[R'] N₂} (e : Basis ι
886
885
887
886
end Basis
888
887
889
- /-! ### Currying -/
890
-
891
-
892
- section Currying
893
-
894
888
variable {R' : Type *} {M'' M₂'' N'' N₂'' : Type *} [CommSemiring R'] [AddCommMonoid M'']
895
889
[AddCommMonoid M₂''] [AddCommMonoid N''] [AddCommMonoid N₂''] [Module R' M''] [Module R' M₂'']
896
890
[Module R' N''] [Module R' N₂'']
897
891
898
- namespace AlternatingMap
899
-
900
- /-- Given an alternating map `f` in `n+1` variables, split the first variable to obtain
901
- a linear map into alternating maps in `n` variables, given by `x ↦ (m ↦ f (Matrix.vecCons x m))`.
902
- It can be thought of as a map $Hom(\bigwedge^{n+1} M, N) \to Hom(M, Hom(\bigwedge^n M, N))$.
903
-
904
- This is `MultilinearMap.curryLeft` for `AlternatingMap`. See also
905
- `AlternatingMap.curryLeftLinearMap`. -/
906
- @[simps]
907
- def curryLeft {n : ℕ} (f : M'' [⋀^Fin n.succ]→ₗ[R'] N'') :
908
- M'' →ₗ[R'] M'' [⋀^Fin n]→ₗ[R'] N'' where
909
- toFun m :=
910
- { f.toMultilinearMap.curryLeft m with
911
- toFun := fun v => f (Matrix.vecCons m v)
912
- map_eq_zero_of_eq' := fun v i j hv hij =>
913
- f.map_eq_zero_of_eq _ (by
914
- rwa [Matrix.cons_val_succ, Matrix.cons_val_succ]) ((Fin.succ_injective _).ne hij) }
915
- map_add' _ _ := ext fun _ => f.map_vecCons_add _ _ _
916
- map_smul' _ _ := ext fun _ => f.map_vecCons_smul _ _ _
917
-
918
- @[simp]
919
- theorem curryLeft_zero {n : ℕ} : curryLeft (0 : M'' [⋀^Fin n.succ]→ₗ[R'] N'') = 0 :=
920
- rfl
921
-
922
- @[simp]
923
- theorem curryLeft_add {n : ℕ} (f g : M'' [⋀^Fin n.succ]→ₗ[R'] N'') :
924
- curryLeft (f + g) = curryLeft f + curryLeft g :=
925
- rfl
926
-
927
- @[simp]
928
- theorem curryLeft_smul {n : ℕ} (r : R') (f : M'' [⋀^Fin n.succ]→ₗ[R'] N'') :
929
- curryLeft (r • f) = r • curryLeft f :=
930
- rfl
931
-
932
- /-- `AlternatingMap.curryLeft` as a `LinearMap`. This is a separate definition as dot notation
933
- does not work for this version. -/
934
- @[simps]
935
- def curryLeftLinearMap {n : ℕ} :
936
- (M'' [⋀^Fin n.succ]→ₗ[R'] N'') →ₗ[R'] M'' →ₗ[R'] M'' [⋀^Fin n]→ₗ[R'] N'' where
937
- toFun f := f.curryLeft
938
- map_add' := curryLeft_add
939
- map_smul' := curryLeft_smul
940
-
941
- /-- Currying with the same element twice gives the zero map. -/
942
- @[simp]
943
- theorem curryLeft_same {n : ℕ} (f : M'' [⋀^Fin n.succ.succ]→ₗ[R'] N'') (m : M'') :
944
- (f.curryLeft m).curryLeft m = 0 :=
945
- ext fun _ => f.map_eq_zero_of_eq _ (by simp) Fin.zero_ne_one
946
-
947
- @[simp]
948
- theorem curryLeft_compAlternatingMap {n : ℕ} (g : N'' →ₗ[R'] N₂'')
949
- (f : M'' [⋀^Fin n.succ]→ₗ[R'] N'') (m : M'') :
950
- (g.compAlternatingMap f).curryLeft m = g.compAlternatingMap (f.curryLeft m) :=
951
- rfl
952
-
953
- @[simp]
954
- theorem curryLeft_compLinearMap {n : ℕ} (g : M₂'' →ₗ[R'] M'')
955
- (f : M'' [⋀^Fin n.succ]→ₗ[R'] N'') (m : M₂'') :
956
- (f.compLinearMap g).curryLeft m = (f.curryLeft (g m)).compLinearMap g :=
957
- ext fun v => congr_arg f <| funext <| by
958
- refine Fin.cases ?_ ?_
959
- · rfl
960
- · simp
961
-
962
892
/-- The space of constant maps is equivalent to the space of maps that are alternating with respect
963
893
to an empty family. -/
964
894
@[simps]
965
- def constLinearEquivOfIsEmpty [IsEmpty ι] : N'' ≃ₗ[R'] (M'' [⋀^ι]→ₗ[R'] N'') where
895
+ def AlternatingMap. constLinearEquivOfIsEmpty [IsEmpty ι] : N'' ≃ₗ[R'] (M'' [⋀^ι]→ₗ[R'] N'') where
966
896
toFun := AlternatingMap.constOfIsEmpty R' M'' ι
967
897
map_add' _ _ := rfl
968
898
map_smul' _ _ := rfl
969
899
invFun f := f 0
970
900
left_inv _ := rfl
971
901
right_inv f := ext fun _ => AlternatingMap.congr_arg f <| Subsingleton.elim _ _
972
902
973
- end AlternatingMap
974
-
975
- end Currying
0 commit comments