use oxilean_kernel::{BinderInfo, Declaration, Environment, Expr, Level, Name};
use super::functions::*;
use super::types::{
CliffordAlgebra, CoalgebraImpl, ExteriorAlgebra, FormalGroupLawImpl, FrobeniusAlgebraImpl,
GradedAlgebraImpl, GradedModuleImpl, HeckeAlgebraElem, HopfAlgebraElem, KoszulComplex,
NoetherianRing, ProfiniteGroup,
};
pub fn register_abstract_algebra_advanced_ext(env: &mut Environment) {
let axioms: &[(&str, Expr)] = &[
("TensorAlgebra", tensor_algebra_ty()),
("TensorAlgebraUniversal", tensor_algebra_universal_ty()),
("SymmetricAlgebra", symmetric_algebra_ty()),
(
"SymmetricAlgebraUniversal",
symmetric_algebra_universal_ty(),
),
("ExteriorAlgebra", exterior_algebra_ty()),
("ExteriorAlgebraUniversal", exterior_algebra_universal_ty()),
("WedgeProduct", wedge_product_ty()),
("CliffordAlgebra", clifford_algebra_ty()),
("CliffordAlgebraUniversal", clifford_algebra_universal_ty()),
("SpinGroup", spin_group_ty()),
("HopfAlgebra", hopf_algebra_ty()),
("Comultiplication", comultiplication_ty()),
("Counit", counit_ty()),
("Antipode", antipode_ty()),
("HopfAntipodeAntiHom", hopf_antipode_anti_hom_ty()),
("HopfAntipodeInvolutive", hopf_antipode_involutive_ty()),
("CStarAlgebra", c_star_algebra_ty()),
("Spectrum", spectrum_ty()),
("GelfandNaimark", gelfand_naimark_ty()),
("GNSConstruction", gns_construction_ty()),
("VonNeumannAlgebra", von_neumann_algebra_ty()),
("DoubleCommutant", double_commutant_ty()),
("TypeClassificationVNA", type_classification_vna_ty()),
("LieAlgebra", lie_algebra_ty()),
(
"UniversalEnvelopingAlgebra",
universal_enveloping_algebra_ty(),
),
("PBWTheorem", pbw_theorem_ty()),
("UEAUniversalProperty", uea_universal_property_ty()),
("WeylAlgebra", weyl_algebra_ty()),
("WeylSimple", weyl_simple_ty()),
("OreExtension", ore_extension_ty()),
("OreCondition", ore_condition_ty()),
("SkewPolynomialRing", skew_polynomial_ring_ty()),
("MoritaEquivalent", morita_equivalent_ty()),
("MoritaContext", morita_context_ty()),
("MatrixMoritaEquiv", matrix_morita_equiv_ty()),
("MoritaInvariant", morita_invariant_ty()),
("GroupAlgebra", group_algebra_ty()),
("GroupRepresentation", group_representation_ty()),
("MaschkeTheorem", maschke_theorem_ty()),
("CharacterTheory", character_theory_ty()),
("KoszulAlgebra", koszul_algebra_ty()),
("KoszulDual", koszul_dual_ty()),
("AssociatedGradedAlgebra", associated_graded_algebra_ty()),
("GradedCommutativity", graded_commutativity_ty()),
("AzumayaAlgebra", azumaya_algebra_ty()),
("BrauerGroup", brauer_group_ty()),
("CentralSimpleAlgebra", central_simple_algebra_ty()),
("BrauerPeriod", brauer_period_ty()),
("DGAlgebra", dg_algebra_ty()),
("DGAlgebraMorphism", dg_algebra_morphism_ty()),
("AInfinityAlgebra", a_infinity_algebra_ty()),
("Operad", operad_ty()),
("OperadAlgebra", operad_algebra_ty()),
("BarConstruction", bar_construction_ty()),
("CobarConstruction", cobar_construction_ty()),
("EnrichedCategory", enriched_category_ty()),
("InfinityCategory", infinity_category_ty()),
("StableInfinityCategory", stable_infinity_category_ty()),
(
"SymmetricMonoidalInftyCategory",
symmetric_monoidal_infty_cat_ty(),
),
("EInfinityAlgebra", e_infinity_algebra_ty()),
("SymplecticForm", symplectic_form_ty()),
("SymplecticModule", symplectic_module_ty()),
("SymplecticGroup", symplectic_group_ty()),
("WittGroup", witt_group_ty()),
];
for (name, ty) in axioms {
env.add(Declaration::Axiom {
name: Name::str(*name),
univ_params: vec![],
ty: ty.clone(),
})
.ok();
}
}
pub fn coalgebra_ty() -> Expr {
arrow(type0(), prop())
}
pub fn coalgebra_morphism_ty() -> Expr {
pi(
BinderInfo::Default,
"C",
type0(),
pi(
BinderInfo::Default,
"D",
type0(),
arrow(
app(cst("Coalgebra"), bvar(1)),
arrow(app(cst("Coalgebra"), bvar(1)), type0()),
),
),
)
}
pub fn bialgebra_ty() -> Expr {
arrow(type0(), prop())
}
pub fn coalgebra_comodule_ty() -> Expr {
pi(
BinderInfo::Default,
"C",
type0(),
pi(
BinderInfo::Default,
"M",
type0(),
arrow(app(cst("Coalgebra"), bvar(1)), prop()),
),
)
}
pub fn cofree_coalgebra_ty() -> Expr {
arrow(type0(), type0())
}
pub fn frobenius_algebra_ty() -> Expr {
arrow(type0(), prop())
}
pub fn frobenius_comultiplication_ty() -> Expr {
pi(
BinderInfo::Default,
"A",
type0(),
arrow(
app(cst("FrobeniusAlgebra"), bvar(0)),
arrow(bvar(1), app2(cst("TensorProduct"), bvar(2), bvar(2))),
),
)
}
pub fn commutative_frobenius_algebra_ty() -> Expr {
arrow(type0(), prop())
}
pub fn frobenius_homomorphism_ty() -> Expr {
pi(
BinderInfo::Default,
"A",
type0(),
pi(
BinderInfo::Default,
"B",
type0(),
arrow(
app(cst("FrobeniusAlgebra"), bvar(1)),
arrow(app(cst("FrobeniusAlgebra"), bvar(1)), type0()),
),
),
)
}
pub fn quantum_group_ty() -> Expr {
arrow(type0(), prop())
}
pub fn r_matrix_ty() -> Expr {
pi(
BinderInfo::Default,
"H",
type0(),
arrow(
app(cst("QuantumGroup"), bvar(0)),
arrow(
bvar(1),
arrow(bvar(2), app2(cst("TensorProduct"), bvar(3), bvar(3))),
),
),
)
}
pub fn quantum_yang_baxter_ty() -> Expr {
pi(
BinderInfo::Default,
"H",
type0(),
arrow(app(cst("QuantumGroup"), bvar(0)), prop()),
)
}
pub fn drinfeld_double_ty() -> Expr {
pi(
BinderInfo::Default,
"H",
type0(),
arrow(app(cst("HopfAlgebra"), bvar(0)), type0()),
)
}
pub fn ribbon_category_ty() -> Expr {
arrow(type0(), prop())
}
pub fn quasitriangular_hopf_algebra_ty() -> Expr {
arrow(type0(), prop())
}
pub fn hall_algebra_ty() -> Expr {
arrow(type0(), type0())
}
pub fn hall_polynomial_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
pi(
BinderInfo::Default,
"M",
type0(),
pi(BinderInfo::Default, "N", type0(), arrow(type0(), nat_ty())),
),
)
}
pub fn ringel_hall_theorem_ty() -> Expr {
pi(
BinderInfo::Default,
"g",
type0(),
arrow(app(cst("LieAlgebra"), bvar(0)), prop()),
)
}
pub fn schur_algebra_ty() -> Expr {
arrow(nat_ty(), arrow(nat_ty(), type0()))
}
pub fn schur_functor_ty() -> Expr {
pi(
BinderInfo::Default,
"lam",
type0(),
arrow(app(cst("YoungDiagram"), bvar(0)), arrow(type0(), type0())),
)
}
pub fn schur_weyl_duality_ty() -> Expr {
arrow(nat_ty(), arrow(nat_ty(), prop()))
}
pub fn lie_superalgebra_ty() -> Expr {
arrow(type0(), prop())
}
pub fn lie_superalgebra_uea_ty() -> Expr {
pi(
BinderInfo::Default,
"g",
type0(),
arrow(app(cst("LieSuperalgebra"), bvar(0)), type0()),
)
}
pub fn super_pbw_ty() -> Expr {
pi(
BinderInfo::Default,
"g",
type0(),
arrow(app(cst("LieSuperalgebra"), bvar(0)), prop()),
)
}
pub fn lie_supermodule_ty() -> Expr {
pi(
BinderInfo::Default,
"g",
type0(),
pi(
BinderInfo::Default,
"M",
type0(),
arrow(app(cst("LieSuperalgebra"), bvar(1)), prop()),
),
)
}
pub fn star_product_ty() -> Expr {
arrow(type0(), prop())
}
pub fn kontsevich_formality_ty() -> Expr {
pi(
BinderInfo::Default,
"M",
type0(),
arrow(app(cst("PoissonManifold"), bvar(0)), prop()),
)
}
pub fn deformation_quantization_ty() -> Expr {
pi(
BinderInfo::Default,
"A",
type0(),
arrow(app(cst("PoissonAlgebra"), bvar(0)), type0()),
)
}
pub fn formal_group_law_ty() -> Expr {
arrow(type0(), prop())
}
pub fn formal_group_law_additive_ty() -> Expr {
arrow(type0(), prop())
}
pub fn formal_group_law_multiplicative_ty() -> Expr {
arrow(type0(), prop())
}
pub fn formal_group_law_height_ty() -> Expr {
pi(
BinderInfo::Default,
"F",
type0(),
arrow(app(cst("FormalGroupLaw"), bvar(0)), nat_ty()),
)
}
pub fn lazard_ring_ty() -> Expr {
type0()
}
pub fn hecke_algebra_ty() -> Expr {
pi(
BinderInfo::Default,
"G",
type0(),
pi(
BinderInfo::Default,
"K",
type0(),
arrow(
app(cst("IsGroup"), bvar(1)),
arrow(app(cst("IsGroup"), bvar(1)), type0()),
),
),
)
}
pub fn iwahori_hecke_algebra_ty() -> Expr {
pi(
BinderInfo::Default,
"W",
type0(),
pi(
BinderInfo::Default,
"q",
type0(),
arrow(app(cst("CoxeterGroup"), bvar(1)), type0()),
),
)
}
pub fn kazhdan_lusztig_polynomial_ty() -> Expr {
pi(
BinderInfo::Default,
"W",
type0(),
pi(
BinderInfo::Default,
"x",
bvar(0),
pi(
BinderInfo::Default,
"y",
bvar(1),
app(cst("Polynomial"), bvar(3)),
),
),
)
}
pub fn group_cohomology_ty() -> Expr {
pi(
BinderInfo::Default,
"G",
type0(),
pi(
BinderInfo::Default,
"M",
type0(),
arrow(
app(cst("IsGroup"), bvar(1)),
arrow(
app2(cst("GroupModule"), bvar(2), bvar(1)),
arrow(nat_ty(), type0()),
),
),
),
)
}
pub fn group_homology_ty() -> Expr {
pi(
BinderInfo::Default,
"G",
type0(),
pi(
BinderInfo::Default,
"M",
type0(),
arrow(
app(cst("IsGroup"), bvar(1)),
arrow(
app2(cst("GroupModule"), bvar(2), bvar(1)),
arrow(nat_ty(), type0()),
),
),
),
)
}
pub fn tate_cohomology_ty() -> Expr {
pi(
BinderInfo::Default,
"G",
type0(),
pi(
BinderInfo::Default,
"M",
type0(),
arrow(
app(cst("IsFiniteGroup"), bvar(1)),
arrow(app2(cst("GroupModule"), bvar(2), bvar(1)), type0()),
),
),
)
}
pub fn shapiro_lemma_ty() -> Expr {
pi(
BinderInfo::Default,
"G",
type0(),
pi(
BinderInfo::Default,
"H",
type0(),
pi(
BinderInfo::Default,
"M",
type0(),
arrow(
app(cst("IsGroup"), bvar(2)),
arrow(
app2(cst("IsSubgroup"), bvar(2), bvar(3)),
arrow(app2(cst("GroupModule"), bvar(3), bvar(1)), prop()),
),
),
),
),
)
}
pub fn iwasawa_algebra_ty() -> Expr {
pi(
BinderInfo::Default,
"G",
type0(),
arrow(app(cst("ProfiniteGroup"), bvar(0)), type0()),
)
}
pub fn iwasawa_module_ty() -> Expr {
pi(
BinderInfo::Default,
"G",
type0(),
pi(
BinderInfo::Default,
"M",
type0(),
arrow(app(cst("ProfiniteGroup"), bvar(1)), prop()),
),
)
}
pub fn characteristic_ideal_ty() -> Expr {
pi(
BinderInfo::Default,
"G",
type0(),
pi(
BinderInfo::Default,
"M",
type0(),
arrow(app2(cst("IwasawaModule"), bvar(1), bvar(0)), type0()),
),
)
}
pub fn projective_module_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
pi(
BinderInfo::Default,
"M",
type0(),
arrow(
app(cst("IsRing"), bvar(1)),
arrow(app2(cst("IsModule"), bvar(2), bvar(1)), prop()),
),
),
)
}
pub fn injective_module_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
pi(
BinderInfo::Default,
"M",
type0(),
arrow(
app(cst("IsRing"), bvar(1)),
arrow(app2(cst("IsModule"), bvar(2), bvar(1)), prop()),
),
),
)
}
pub fn flat_module_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
pi(
BinderInfo::Default,
"M",
type0(),
arrow(
app(cst("IsRing"), bvar(1)),
arrow(app2(cst("IsModule"), bvar(2), bvar(1)), prop()),
),
),
)
}
pub fn injective_envelope_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
pi(
BinderInfo::Default,
"M",
type0(),
arrow(app2(cst("IsModule"), bvar(1), bvar(0)), type0()),
),
)
}
pub fn artinian_ring_ty() -> Expr {
arrow(type0(), prop())
}
pub fn semisimple_ring_ty() -> Expr {
arrow(type0(), prop())
}
pub fn jacobson_radical_ty() -> Expr {
arrow(type0(), type0())
}
pub fn nakayama_lemma_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
pi(
BinderInfo::Default,
"M",
type0(),
arrow(
app(cst("IsRing"), bvar(1)),
arrow(app2(cst("IsFinGenModule"), bvar(2), bvar(1)), prop()),
),
),
)
}
pub fn hopkins_levitzki_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
arrow(
app(cst("ArtinianRing"), bvar(0)),
app(cst("NoetherianRing"), bvar(1)),
),
)
}
pub fn graded_module_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
pi(
BinderInfo::Default,
"M",
type0(),
arrow(app(cst("IsRing"), bvar(1)), prop()),
),
)
}
pub fn graded_module_shift_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
pi(
BinderInfo::Default,
"M",
type0(),
pi(
BinderInfo::Default,
"n",
nat_ty(),
arrow(
app2(cst("GradedModule"), bvar(2), bvar(1)),
app2(cst("GradedModule"), bvar(3), bvar(2)),
),
),
),
)
}
pub fn filtered_module_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
pi(
BinderInfo::Default,
"M",
type0(),
arrow(
app(cst("IsRing"), bvar(1)),
arrow(app2(cst("IsModule"), bvar(2), bvar(1)), prop()),
),
),
)
}
pub fn associated_graded_module_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
pi(
BinderInfo::Default,
"M",
type0(),
arrow(
app2(cst("FilteredModule"), bvar(1), bvar(0)),
app2(cst("GradedModule"), bvar(2), bvar(1)),
),
),
)
}
pub fn register_abstract_algebra_advanced_ext2(env: &mut Environment) {
let axioms: &[(&str, Expr)] = &[
("Coalgebra", coalgebra_ty()),
("CoalgebraMorphism", coalgebra_morphism_ty()),
("Bialgebra", bialgebra_ty()),
("CoalgebraComodule", coalgebra_comodule_ty()),
("CofreeCoalgebra", cofree_coalgebra_ty()),
("FrobeniusAlgebra", frobenius_algebra_ty()),
("FrobeniusComultiplication", frobenius_comultiplication_ty()),
(
"CommutativeFrobeniusAlgebra",
commutative_frobenius_algebra_ty(),
),
("FrobeniusHomomorphism", frobenius_homomorphism_ty()),
("QuantumGroup", quantum_group_ty()),
("RMatrix", r_matrix_ty()),
("QuantumYangBaxterEquation", quantum_yang_baxter_ty()),
("DrinfeldDouble", drinfeld_double_ty()),
("RibbonCategory", ribbon_category_ty()),
(
"QuasitriangularHopfAlgebra",
quasitriangular_hopf_algebra_ty(),
),
("HallAlgebra", hall_algebra_ty()),
("HallPolynomial", hall_polynomial_ty()),
("RingelHallTheorem", ringel_hall_theorem_ty()),
("SchurAlgebra", schur_algebra_ty()),
("SchurFunctor", schur_functor_ty()),
("SchurWeylDuality", schur_weyl_duality_ty()),
("LieSuperalgebra", lie_superalgebra_ty()),
("LieSuperalgebraUEA", lie_superalgebra_uea_ty()),
("SuperPBW", super_pbw_ty()),
("LieSupermodule", lie_supermodule_ty()),
("StarProduct", star_product_ty()),
("KontsevichFormality", kontsevich_formality_ty()),
("DeformationQuantization", deformation_quantization_ty()),
("FormalGroupLaw", formal_group_law_ty()),
("FormalGroupLawAdditive", formal_group_law_additive_ty()),
(
"FormalGroupLawMultiplicative",
formal_group_law_multiplicative_ty(),
),
("FormalGroupLawHeight", formal_group_law_height_ty()),
("LazardRing", lazard_ring_ty()),
("HeckeAlgebra", hecke_algebra_ty()),
("IwahoriHeckeAlgebra", iwahori_hecke_algebra_ty()),
("KazhdanLusztigPolynomial", kazhdan_lusztig_polynomial_ty()),
("GroupCohomology", group_cohomology_ty()),
("GroupHomology", group_homology_ty()),
("TateCohomology", tate_cohomology_ty()),
("ShapiroLemma", shapiro_lemma_ty()),
("IwasawaAlgebra", iwasawa_algebra_ty()),
("IwasawaModule", iwasawa_module_ty()),
("CharacteristicIdeal", characteristic_ideal_ty()),
("ProjectiveModule", projective_module_ty()),
("InjectiveModule", injective_module_ty()),
("FlatModule", flat_module_ty()),
("InjectiveEnvelope", injective_envelope_ty()),
("ArtinianRing", artinian_ring_ty()),
("SemisimpleRing", semisimple_ring_ty()),
("JacobsonRadical", jacobson_radical_ty()),
("NakayamaLemma", nakayama_lemma_ty()),
("HopkinsLevitzki", hopkins_levitzki_ty()),
("GradedModule", graded_module_ty()),
("GradedModuleShift", graded_module_shift_ty()),
("FilteredModule", filtered_module_ty()),
("AssociatedGradedModule", associated_graded_module_ty()),
];
for (name, ty) in axioms {
env.add(Declaration::Axiom {
name: Name::str(*name),
univ_params: vec![],
ty: ty.clone(),
})
.ok();
}
}
#[cfg(test)]
mod tests_ext {
use super::*;
fn ext_env() -> Environment {
let mut env = Environment::new();
register_abstract_algebra_advanced_ext(&mut env);
env
}
#[test]
fn test_tensor_exterior_clifford_registered() {
let env = ext_env();
assert!(env.get(&Name::str("TensorAlgebra")).is_some());
assert!(env.get(&Name::str("SymmetricAlgebra")).is_some());
assert!(env.get(&Name::str("ExteriorAlgebra")).is_some());
assert!(env.get(&Name::str("WedgeProduct")).is_some());
assert!(env.get(&Name::str("CliffordAlgebra")).is_some());
assert!(env.get(&Name::str("SpinGroup")).is_some());
}
#[test]
fn test_hopf_algebras_registered() {
let env = ext_env();
assert!(env.get(&Name::str("HopfAlgebra")).is_some());
assert!(env.get(&Name::str("Comultiplication")).is_some());
assert!(env.get(&Name::str("Counit")).is_some());
assert!(env.get(&Name::str("Antipode")).is_some());
assert!(env.get(&Name::str("HopfAntipodeAntiHom")).is_some());
}
#[test]
fn test_cstar_von_neumann_registered() {
let env = ext_env();
assert!(env.get(&Name::str("CStarAlgebra")).is_some());
assert!(env.get(&Name::str("Spectrum")).is_some());
assert!(env.get(&Name::str("GelfandNaimark")).is_some());
assert!(env.get(&Name::str("GNSConstruction")).is_some());
assert!(env.get(&Name::str("VonNeumannAlgebra")).is_some());
assert!(env.get(&Name::str("DoubleCommutant")).is_some());
}
#[test]
fn test_uea_pbw_registered() {
let env = ext_env();
assert!(env.get(&Name::str("LieAlgebra")).is_some());
assert!(env.get(&Name::str("UniversalEnvelopingAlgebra")).is_some());
assert!(env.get(&Name::str("PBWTheorem")).is_some());
assert!(env.get(&Name::str("UEAUniversalProperty")).is_some());
}
#[test]
fn test_weyl_ore_registered() {
let env = ext_env();
assert!(env.get(&Name::str("WeylAlgebra")).is_some());
assert!(env.get(&Name::str("WeylSimple")).is_some());
assert!(env.get(&Name::str("OreExtension")).is_some());
assert!(env.get(&Name::str("OreCondition")).is_some());
assert!(env.get(&Name::str("SkewPolynomialRing")).is_some());
}
#[test]
fn test_morita_registered() {
let env = ext_env();
assert!(env.get(&Name::str("MoritaEquivalent")).is_some());
assert!(env.get(&Name::str("MoritaContext")).is_some());
assert!(env.get(&Name::str("MatrixMoritaEquiv")).is_some());
assert!(env.get(&Name::str("MoritaInvariant")).is_some());
}
#[test]
fn test_group_algebras_registered() {
let env = ext_env();
assert!(env.get(&Name::str("GroupAlgebra")).is_some());
assert!(env.get(&Name::str("GroupRepresentation")).is_some());
assert!(env.get(&Name::str("MaschkeTheorem")).is_some());
assert!(env.get(&Name::str("CharacterTheory")).is_some());
}
#[test]
fn test_koszul_azumaya_registered() {
let env = ext_env();
assert!(env.get(&Name::str("KoszulAlgebra")).is_some());
assert!(env.get(&Name::str("KoszulDual")).is_some());
assert!(env.get(&Name::str("AzumayaAlgebra")).is_some());
assert!(env.get(&Name::str("BrauerGroup")).is_some());
assert!(env.get(&Name::str("CentralSimpleAlgebra")).is_some());
}
#[test]
fn test_dga_operad_registered() {
let env = ext_env();
assert!(env.get(&Name::str("DGAlgebra")).is_some());
assert!(env.get(&Name::str("AInfinityAlgebra")).is_some());
assert!(env.get(&Name::str("Operad")).is_some());
assert!(env.get(&Name::str("OperadAlgebra")).is_some());
assert!(env.get(&Name::str("BarConstruction")).is_some());
assert!(env.get(&Name::str("CobarConstruction")).is_some());
}
#[test]
fn test_higher_category_registered() {
let env = ext_env();
assert!(env.get(&Name::str("EnrichedCategory")).is_some());
assert!(env.get(&Name::str("InfinityCategory")).is_some());
assert!(env.get(&Name::str("StableInfinityCategory")).is_some());
assert!(env
.get(&Name::str("SymmetricMonoidalInftyCategory"))
.is_some());
assert!(env.get(&Name::str("EInfinityAlgebra")).is_some());
}
#[test]
fn test_symplectic_registered() {
let env = ext_env();
assert!(env.get(&Name::str("SymplecticForm")).is_some());
assert!(env.get(&Name::str("SymplecticModule")).is_some());
assert!(env.get(&Name::str("SymplecticGroup")).is_some());
assert!(env.get(&Name::str("WittGroup")).is_some());
}
#[test]
fn test_exterior_algebra_impl() {
let ext = ExteriorAlgebra::new(3);
assert_eq!(ext.total_dim(), 8);
let desc = ext.describe();
assert!(desc.contains("Λ(ℝ^3)"));
let result = ExteriorAlgebra::wedge_basis(&[0], &[1]);
assert!(result.is_some());
let (sign, merged) = result.expect("result should be valid");
assert_eq!(merged, vec![0, 1]);
assert_eq!(sign, 1);
let result2 = ExteriorAlgebra::wedge_basis(&[0, 1], &[1, 2]);
assert!(result2.is_none());
}
#[test]
fn test_clifford_algebra_impl() {
let cl = CliffordAlgebra::new(vec![1.0, 1.0, 1.0]);
assert_eq!(cl.dim(), 3);
assert_eq!(cl.total_dim(), 8);
let (p, q) = cl.signature();
assert_eq!(p, 3);
assert_eq!(q, 0);
assert_eq!(cl.clifford_relation(0), 1.0);
let cl2 = CliffordAlgebra::new(vec![1.0, -1.0]);
let (p2, q2) = cl2.signature();
assert_eq!(p2, 1);
assert_eq!(q2, 1);
}
#[test]
fn test_hopf_algebra_elem() {
let g = HopfAlgebraElem::from_group("g");
assert_eq!(g.antipode(), "g⁻¹");
assert_eq!(g.coproduct(), "g ⊗ g");
assert_eq!(g.counit(), 1);
let h = HopfAlgebraElem::new("x");
assert_eq!(h.antipode(), "S(x)");
}
#[test]
fn test_graded_algebra_impl() {
let ga = GradedAlgebraImpl::new(
"ℕ",
vec!["k".to_string(), "V".to_string(), "V⊗V/sym".to_string()],
);
assert!(ga.is_connected());
assert_eq!(ga.top_degree(), Some(2));
let ps = ga.poincare_series();
assert!(ps.contains("t^0") || ps.contains("t^1") || ps.contains("t^2"));
}
#[test]
fn test_koszul_complex() {
let kc = KoszulComplex::new(vec!["x".to_string(), "y".to_string(), "z".to_string()], "R");
assert_eq!(kc.length(), 3);
assert_eq!(kc.num_terms(), 4);
assert!(kc.is_acyclic_for_regular_sequence());
assert_eq!(kc.euler_characteristic(), 0);
let desc = kc.describe();
assert!(desc.contains("Koszul complex"));
}
}
#[cfg(test)]
mod tests_ext2 {
use super::*;
fn ext2_env() -> Environment {
let mut env = Environment::new();
register_abstract_algebra_advanced_ext2(&mut env);
env
}
#[test]
fn test_coalgebra_bialgebra_registered() {
let env = ext2_env();
assert!(env.get(&Name::str("Coalgebra")).is_some());
assert!(env.get(&Name::str("CoalgebraMorphism")).is_some());
assert!(env.get(&Name::str("Bialgebra")).is_some());
assert!(env.get(&Name::str("CoalgebraComodule")).is_some());
assert!(env.get(&Name::str("CofreeCoalgebra")).is_some());
}
#[test]
fn test_frobenius_algebra_registered() {
let env = ext2_env();
assert!(env.get(&Name::str("FrobeniusAlgebra")).is_some());
assert!(env.get(&Name::str("FrobeniusComultiplication")).is_some());
assert!(env.get(&Name::str("CommutativeFrobeniusAlgebra")).is_some());
assert!(env.get(&Name::str("FrobeniusHomomorphism")).is_some());
}
#[test]
fn test_quantum_groups_registered() {
let env = ext2_env();
assert!(env.get(&Name::str("QuantumGroup")).is_some());
assert!(env.get(&Name::str("RMatrix")).is_some());
assert!(env.get(&Name::str("QuantumYangBaxterEquation")).is_some());
assert!(env.get(&Name::str("DrinfeldDouble")).is_some());
assert!(env.get(&Name::str("RibbonCategory")).is_some());
assert!(env.get(&Name::str("QuasitriangularHopfAlgebra")).is_some());
}
#[test]
fn test_hall_schur_registered() {
let env = ext2_env();
assert!(env.get(&Name::str("HallAlgebra")).is_some());
assert!(env.get(&Name::str("HallPolynomial")).is_some());
assert!(env.get(&Name::str("RingelHallTheorem")).is_some());
assert!(env.get(&Name::str("SchurAlgebra")).is_some());
assert!(env.get(&Name::str("SchurFunctor")).is_some());
assert!(env.get(&Name::str("SchurWeylDuality")).is_some());
}
#[test]
fn test_lie_superalgebra_registered() {
let env = ext2_env();
assert!(env.get(&Name::str("LieSuperalgebra")).is_some());
assert!(env.get(&Name::str("LieSuperalgebraUEA")).is_some());
assert!(env.get(&Name::str("SuperPBW")).is_some());
assert!(env.get(&Name::str("LieSupermodule")).is_some());
}
#[test]
fn test_deformation_quantization_registered() {
let env = ext2_env();
assert!(env.get(&Name::str("StarProduct")).is_some());
assert!(env.get(&Name::str("KontsevichFormality")).is_some());
assert!(env.get(&Name::str("DeformationQuantization")).is_some());
}
#[test]
fn test_formal_group_laws_registered() {
let env = ext2_env();
assert!(env.get(&Name::str("FormalGroupLaw")).is_some());
assert!(env.get(&Name::str("FormalGroupLawAdditive")).is_some());
assert!(env
.get(&Name::str("FormalGroupLawMultiplicative"))
.is_some());
assert!(env.get(&Name::str("FormalGroupLawHeight")).is_some());
assert!(env.get(&Name::str("LazardRing")).is_some());
}
#[test]
fn test_hecke_algebras_registered() {
let env = ext2_env();
assert!(env.get(&Name::str("HeckeAlgebra")).is_some());
assert!(env.get(&Name::str("IwahoriHeckeAlgebra")).is_some());
assert!(env.get(&Name::str("KazhdanLusztigPolynomial")).is_some());
}
#[test]
fn test_group_cohomology_registered() {
let env = ext2_env();
assert!(env.get(&Name::str("GroupCohomology")).is_some());
assert!(env.get(&Name::str("GroupHomology")).is_some());
assert!(env.get(&Name::str("TateCohomology")).is_some());
assert!(env.get(&Name::str("ShapiroLemma")).is_some());
}
#[test]
fn test_iwasawa_registered() {
let env = ext2_env();
assert!(env.get(&Name::str("IwasawaAlgebra")).is_some());
assert!(env.get(&Name::str("IwasawaModule")).is_some());
assert!(env.get(&Name::str("CharacteristicIdeal")).is_some());
}
#[test]
fn test_projective_injective_flat_registered() {
let env = ext2_env();
assert!(env.get(&Name::str("ProjectiveModule")).is_some());
assert!(env.get(&Name::str("InjectiveModule")).is_some());
assert!(env.get(&Name::str("FlatModule")).is_some());
assert!(env.get(&Name::str("InjectiveEnvelope")).is_some());
}
#[test]
fn test_artinian_semisimple_registered() {
let env = ext2_env();
assert!(env.get(&Name::str("ArtinianRing")).is_some());
assert!(env.get(&Name::str("SemisimpleRing")).is_some());
assert!(env.get(&Name::str("JacobsonRadical")).is_some());
assert!(env.get(&Name::str("NakayamaLemma")).is_some());
assert!(env.get(&Name::str("HopkinsLevitzki")).is_some());
}
#[test]
fn test_graded_filtered_modules_registered() {
let env = ext2_env();
assert!(env.get(&Name::str("GradedModule")).is_some());
assert!(env.get(&Name::str("GradedModuleShift")).is_some());
assert!(env.get(&Name::str("FilteredModule")).is_some());
assert!(env.get(&Name::str("AssociatedGradedModule")).is_some());
}
#[test]
fn test_coalgebra_impl() {
let coal = CoalgebraImpl::group_like(3);
assert_eq!(coal.dim, 3);
assert!(coal.is_coassociative_group_like());
assert_eq!(coal.counit_val(0), 1.0);
assert_eq!(coal.counit_val(2), 1.0);
assert_eq!(coal.comult[1], vec![(1, 1, 1.0)]);
}
#[test]
fn test_frobenius_algebra_impl() {
let frob = FrobeniusAlgebraImpl::trivial();
assert_eq!(frob.dim, 1);
assert!(frob.is_nondegenerate());
let desc = frob.describe();
assert!(desc.contains("Frobenius algebra"));
assert!(desc.contains("nondegenerate form: yes"));
}
#[test]
fn test_formal_group_law_additive() {
let fgl = FormalGroupLawImpl::additive(3);
assert!((fgl.eval(2.0, 3.0) - 5.0).abs() < 1e-10);
assert!(fgl.check_unit_axioms());
let desc = fgl.describe();
assert!(desc.contains("unit axioms hold: yes"));
}
#[test]
fn test_formal_group_law_multiplicative() {
let fgl = FormalGroupLawImpl::multiplicative(3);
assert!((fgl.eval(1.0, 1.0) - 3.0).abs() < 1e-10);
assert!(fgl.check_unit_axioms());
}
#[test]
fn test_graded_module_impl() {
let gm = GradedModuleImpl::new(
"k[x]",
vec!["k".to_string(), "k".to_string(), "k".to_string()],
);
assert_eq!(gm.top_degree(), Some(2));
assert_eq!(gm.hilbert_function(2), 3);
let shifted = gm.shift(1);
assert_eq!(shifted.components.len(), 2);
let desc = gm.describe();
assert!(desc.contains("Graded module over k[x]"));
}
#[test]
fn test_hecke_algebra_elem() {
let e = HeckeAlgebraElem::identity(2.0);
assert_eq!(e.terms.len(), 1);
let t1 = HeckeAlgebraElem::generator(2.0, 0);
let (a, b) = t1.quadratic_relation_lhs_coeff();
assert!((a - 1.0).abs() < 1e-10);
assert!((b - 2.0).abs() < 1e-10);
let desc = t1.describe();
assert!(desc.contains("Hecke algebra element"));
}
}
pub fn hopf_comodule_ty() -> Expr {
pi(
BinderInfo::Default,
"H",
type0(),
pi(
BinderInfo::Default,
"M",
type0(),
arrow(app(cst("HopfAlgebra"), bvar(1)), prop()),
),
)
}
pub fn hopf_module_ty() -> Expr {
pi(
BinderInfo::Default,
"H",
type0(),
pi(
BinderInfo::Default,
"M",
type0(),
arrow(app(cst("HopfAlgebra"), bvar(1)), prop()),
),
)
}
pub fn bialgebra_coassociativity_ty() -> Expr {
pi(
BinderInfo::Default,
"B",
type0(),
arrow(app(cst("Bialgebra"), bvar(0)), prop()),
)
}
pub fn hopf_antipode_axiom_ty() -> Expr {
pi(
BinderInfo::Default,
"H",
type0(),
arrow(app(cst("HopfAlgebra"), bvar(0)), prop()),
)
}
pub fn smash_product_ty() -> Expr {
pi(
BinderInfo::Default,
"H",
type0(),
pi(
BinderInfo::Default,
"A",
type0(),
arrow(
app(cst("HopfAlgebra"), bvar(1)),
arrow(app2(cst("HopfModule"), bvar(2), bvar(1)), type0()),
),
),
)
}
pub fn takeuchi_equivalence_ty() -> Expr {
pi(
BinderInfo::Default,
"H",
type0(),
arrow(app(cst("HopfAlgebra"), bvar(0)), prop()),
)
}
pub fn tilting_module_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
pi(
BinderInfo::Default,
"T",
type0(),
arrow(app(cst("IsRing"), bvar(1)), prop()),
),
)
}
pub fn derived_morita_equivalence_ty() -> Expr {
arrow(type0(), arrow(type0(), prop()))
}
pub fn tilting_equivalence_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
pi(
BinderInfo::Default,
"S",
type0(),
pi(
BinderInfo::Default,
"T",
type0(),
arrow(
app2(cst("TiltingModule"), bvar(2), bvar(1)),
arrow(
app2(
cst("RingIso"),
bvar(2),
app2(cst("EndRing"), bvar(3), bvar(1)),
),
app2(cst("DerivedMoritaEquivalence"), bvar(4), bvar(3)),
),
),
),
),
)
}
pub fn silting_module_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
pi(
BinderInfo::Default,
"T",
type0(),
arrow(app(cst("IsRing"), bvar(1)), prop()),
),
)
}
pub fn apr_tilting_ty() -> Expr {
pi(
BinderInfo::Default,
"A",
type0(),
pi(
BinderInfo::Default,
"T",
type0(),
arrow(app(cst("IsAlgebra"), bvar(1)), prop()),
),
)
}
pub fn graded_ring_ty() -> Expr {
arrow(type0(), prop())
}
pub fn hilbert_series_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
arrow(app(cst("GradedRing"), bvar(0)), type0()),
)
}
pub fn hilbert_syzygy_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
pi(
BinderInfo::Default,
"M",
type0(),
arrow(
app(cst("GradedRing"), bvar(1)),
arrow(app2(cst("GradedModule"), bvar(2), bvar(1)), prop()),
),
),
)
}
pub fn regular_sequence_graded_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
arrow(
app(cst("GradedRing"), bvar(0)),
arrow(app(cst("List"), bvar(1)), prop()),
),
)
}
pub fn gk_dimension_ty() -> Expr {
pi(
BinderInfo::Default,
"A",
type0(),
arrow(app(cst("IsAlgebra"), bvar(0)), nat_ty()),
)
}
pub fn projective_dimension_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
pi(
BinderInfo::Default,
"M",
type0(),
arrow(app2(cst("IsModule"), bvar(1), bvar(0)), nat_ty()),
),
)
}
pub fn injective_dimension_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
pi(
BinderInfo::Default,
"M",
type0(),
arrow(app2(cst("IsModule"), bvar(1), bvar(0)), nat_ty()),
),
)
}
pub fn global_dimension_ty() -> Expr {
arrow(type0(), nat_ty())
}
pub fn weak_dimension_ty() -> Expr {
arrow(type0(), nat_ty())
}
pub fn auslander_buchsbaum_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
pi(
BinderInfo::Default,
"M",
type0(),
arrow(
app(cst("RegularLocalRing"), bvar(1)),
arrow(app2(cst("IsModule"), bvar(2), bvar(1)), prop()),
),
),
)
}
pub fn serre_regularity_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
arrow(app(cst("LocalRing"), bvar(0)), prop()),
)
}
pub fn prime_spectrum_ty() -> Expr {
arrow(type0(), type0())
}
pub fn noetherian_ring_axiom_ty() -> Expr {
arrow(type0(), prop())
}
pub fn artinian_ring_axiom_ty() -> Expr {
arrow(type0(), prop())
}
pub fn primary_decomposition_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
pi(
BinderInfo::Default,
"I",
type0(),
arrow(
app(cst("NoetherianRing"), bvar(1)),
arrow(app2(cst("Ideal"), bvar(2), bvar(1)), prop()),
),
),
)
}
pub fn krull_dimension_ty() -> Expr {
arrow(type0(), nat_ty())
}
pub fn local_ring_ty() -> Expr {
arrow(type0(), prop())
}
pub fn regular_local_ring_ty() -> Expr {
arrow(type0(), prop())
}
pub fn cohen_macaulay_ty() -> Expr {
arrow(type0(), prop())
}
pub fn solvable_extension_ty() -> Expr {
pi(
BinderInfo::Default,
"K",
type0(),
pi(
BinderInfo::Default,
"L",
type0(),
arrow(app2(cst("FieldExtension"), bvar(1), bvar(0)), prop()),
),
)
}
pub fn radical_extension_ty() -> Expr {
pi(
BinderInfo::Default,
"K",
type0(),
pi(
BinderInfo::Default,
"L",
type0(),
arrow(app2(cst("FieldExtension"), bvar(1), bvar(0)), prop()),
),
)
}
pub fn abel_ruffini_ty() -> Expr {
pi(
BinderInfo::Default,
"K",
type0(),
arrow(app(cst("Polynomial"), bvar(0)), prop()),
)
}
pub fn infinite_galois_group_ty() -> Expr {
pi(
BinderInfo::Default,
"K",
type0(),
arrow(app(cst("IsField"), bvar(0)), type0()),
)
}
pub fn inverse_galois_problem_ty() -> Expr {
pi(
BinderInfo::Default,
"G",
type0(),
arrow(app(cst("IsFiniteGroup"), bvar(0)), prop()),
)
}
pub fn wedderburn_little_theorem_ty() -> Expr {
pi(
BinderInfo::Default,
"D",
type0(),
arrow(
app(cst("IsFiniteDivisionRing"), bvar(0)),
app(cst("IsField"), bvar(1)),
),
)
}
pub fn artin_wedderburn_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
arrow(app(cst("SemisimpleRing"), bvar(0)), prop()),
)
}
pub fn brauer_equivalence_ty() -> Expr {
pi(
BinderInfo::Default,
"A",
type0(),
pi(
BinderInfo::Default,
"B",
type0(),
arrow(
app(cst("CentralSimpleAlgebra"), bvar(1)),
arrow(app(cst("CentralSimpleAlgebra"), bvar(1)), prop()),
),
),
)
}
pub fn brauer_group_tsen_ty() -> Expr {
pi(
BinderInfo::Default,
"k",
type0(),
arrow(app(cst("IsAlgebraicallyClosed"), bvar(0)), prop()),
)
}
pub fn albert_theorem_ty() -> Expr {
pi(
BinderInfo::Default,
"D",
type0(),
arrow(
app(cst("IsDivisionAlgebra"), bvar(0)),
arrow(app(cst("IsField"), app(cst("Center"), bvar(1))), prop()),
),
)
}
pub fn witt_vectors_ty() -> Expr {
arrow(type0(), type0())
}
pub fn witt_vectors_p_ty() -> Expr {
arrow(nat_ty(), arrow(type0(), type0()))
}
pub fn lambda_ring_ty() -> Expr {
arrow(type0(), prop())
}
pub fn adams_operation_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
pi(
BinderInfo::Default,
"n",
nat_ty(),
arrow(app(cst("LambdaRing"), bvar(1)), arrow(bvar(2), bvar(3))),
),
)
}
pub fn grothendieck_group_ty() -> Expr {
arrow(type0(), type0())
}