use oxilean_kernel::{BinderInfo, Declaration, Environment, Expr, Level, Name};
use super::types::{
DGAlgebra, GaloisExtensionData, GradedModule, GradedRing, HopfAlgebraData, KoszulComplex,
KrullDimEstimator, LocalRing, PrimaryDecompositionData,
};
pub fn app(f: Expr, a: Expr) -> Expr {
Expr::App(Box::new(f), Box::new(a))
}
pub fn app2(f: Expr, a: Expr, b: Expr) -> Expr {
app(app(f, a), b)
}
pub fn app3(f: Expr, a: Expr, b: Expr, c: Expr) -> Expr {
app(app2(f, a, b), c)
}
pub fn cst(s: &str) -> Expr {
Expr::Const(Name::str(s), vec![])
}
pub fn prop() -> Expr {
Expr::Sort(Level::zero())
}
pub fn type0() -> Expr {
Expr::Sort(Level::succ(Level::zero()))
}
pub fn pi(bi: BinderInfo, name: &str, dom: Expr, body: Expr) -> Expr {
Expr::Pi(bi, Name::str(name), Box::new(dom), Box::new(body))
}
pub fn arrow(a: Expr, b: Expr) -> Expr {
pi(BinderInfo::Default, "_", a, b)
}
pub fn impl_pi(name: &str, dom: Expr, body: Expr) -> Expr {
pi(BinderInfo::Implicit, name, dom, body)
}
pub fn bvar(n: u32) -> Expr {
Expr::BVar(n)
}
pub fn nat_ty() -> Expr {
cst("Nat")
}
pub fn module_ty() -> Expr {
impl_pi("R", type0(), impl_pi("M", type0(), prop()))
}
pub fn algebra_ty() -> Expr {
impl_pi("R", type0(), impl_pi("A", type0(), prop()))
}
pub fn linear_map_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi("M", type0(), impl_pi("N", type0(), type0())),
)
}
pub fn tensor_product_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi("M", type0(), impl_pi("N", type0(), type0())),
)
}
pub fn exterior_algebra_ty() -> Expr {
impl_pi("R", type0(), impl_pi("M", type0(), type0()))
}
pub fn graded_ring_ty() -> Expr {
impl_pi("ι", type0(), impl_pi("R", type0(), prop()))
}
pub fn graded_module_ty() -> Expr {
impl_pi(
"ι",
type0(),
impl_pi("R", type0(), impl_pi("M", type0(), prop())),
)
}
pub fn derivation_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi("A", type0(), impl_pi("M", type0(), type0())),
)
}
pub fn lie_algebra_ty() -> Expr {
impl_pi("R", type0(), impl_pi("L", type0(), prop()))
}
pub fn lie_module_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi("L", type0(), impl_pi("M", type0(), prop())),
)
}
pub fn lie_bracket_ty() -> Expr {
impl_pi("L", type0(), arrow(bvar(0), arrow(bvar(1), bvar(2))))
}
pub fn jacobi_identity_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi(
"L",
type0(),
arrow(bvar(0), arrow(bvar(1), arrow(bvar(2), prop()))),
),
)
}
pub fn pbw_basis_ty() -> Expr {
impl_pi("R", type0(), impl_pi("g", type0(), prop()))
}
pub fn filtered_ring_ty() -> Expr {
impl_pi("R", type0(), prop())
}
pub fn associated_graded_ty() -> Expr {
impl_pi("R", type0(), type0())
}
pub fn formal_power_series_ty() -> Expr {
impl_pi("R", type0(), type0())
}
pub fn i_adic_topology_ty() -> Expr {
impl_pi("R", type0(), impl_pi("I", type0(), prop()))
}
pub fn complete_ring_ty() -> Expr {
impl_pi("R", type0(), impl_pi("I", type0(), prop()))
}
pub fn artin_rees_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi("I", type0(), impl_pi("M", type0(), prop())),
)
}
pub fn integral_extension_ty() -> Expr {
impl_pi("R", type0(), impl_pi("S", type0(), prop()))
}
pub fn integral_closure_ty() -> Expr {
impl_pi("R", type0(), impl_pi("S", type0(), type0()))
}
pub fn integrally_closed_domain_ty() -> Expr {
impl_pi("R", type0(), prop())
}
pub fn going_up_ty() -> Expr {
impl_pi("R", type0(), impl_pi("S", type0(), prop()))
}
pub fn going_down_ty() -> Expr {
impl_pi("R", type0(), impl_pi("S", type0(), prop()))
}
pub fn lying_over_ty() -> Expr {
impl_pi("R", type0(), impl_pi("S", type0(), prop()))
}
pub fn krull_dimension_ty() -> Expr {
impl_pi("R", type0(), nat_ty())
}
pub fn ideal_height_ty() -> Expr {
impl_pi("R", type0(), impl_pi("P", arrow(bvar(0), prop()), nat_ty()))
}
pub fn noetherian_ring_ty() -> Expr {
impl_pi("R", type0(), prop())
}
pub fn artinian_ring_ty() -> Expr {
impl_pi("R", type0(), prop())
}
pub fn hopkins_levitzki_ty() -> Expr {
impl_pi("R", type0(), prop())
}
pub fn primary_ideal_ty() -> Expr {
impl_pi("R", type0(), impl_pi("Q", arrow(bvar(0), prop()), prop()))
}
pub fn primary_decomposition_ty() -> Expr {
impl_pi("R", type0(), impl_pi("I", arrow(bvar(0), prop()), prop()))
}
pub fn lasker_noether_ty() -> Expr {
impl_pi("R", type0(), prop())
}
pub fn associated_primes_ty() -> Expr {
impl_pi("R", type0(), impl_pi("M", type0(), type0()))
}
pub fn localization_ty() -> Expr {
impl_pi("R", type0(), impl_pi("S", arrow(bvar(0), prop()), type0()))
}
pub fn localization_module_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi("M", type0(), impl_pi("S", arrow(bvar(1), prop()), type0())),
)
}
pub fn nakayamas_lemma_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi("M", type0(), impl_pi("I", arrow(bvar(1), prop()), prop())),
)
}
pub fn cohen_macaulay_ty() -> Expr {
impl_pi("R", type0(), prop())
}
pub fn regular_local_ring_ty() -> Expr {
impl_pi("R", type0(), prop())
}
pub fn regular_sequence_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi(
"M",
type0(),
impl_pi("seq", app(cst("List"), bvar(1)), prop()),
),
)
}
pub fn module_depth_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi("M", type0(), impl_pi("I", arrow(bvar(1), prop()), nat_ty())),
)
}
pub fn projective_dimension_ty() -> Expr {
impl_pi("R", type0(), impl_pi("M", type0(), nat_ty()))
}
pub fn auslander_buchsbaum_ty() -> Expr {
impl_pi("R", type0(), impl_pi("M", type0(), prop()))
}
pub fn gorenstein_ring_ty() -> Expr {
impl_pi("R", type0(), prop())
}
pub fn graded_morphism_ty() -> Expr {
impl_pi(
"ι",
type0(),
impl_pi("R", type0(), impl_pi("S", type0(), prop())),
)
}
pub fn homogeneous_ideal_ty() -> Expr {
impl_pi(
"ι",
type0(),
impl_pi("R", type0(), impl_pi("I", arrow(bvar(0), prop()), prop())),
)
}
pub fn hilbert_function_ty() -> Expr {
impl_pi(
"ι",
type0(),
impl_pi("R", type0(), arrow(nat_ty(), nat_ty())),
)
}
pub fn jacobson_radical_ty() -> Expr {
impl_pi("R", type0(), type0())
}
pub fn nil_radical_ty() -> Expr {
impl_pi("R", type0(), type0())
}
pub fn symmetric_algebra_ty() -> Expr {
impl_pi("R", type0(), impl_pi("M", type0(), type0()))
}
pub fn divided_power_algebra_ty() -> Expr {
impl_pi("R", type0(), impl_pi("M", type0(), type0()))
}
pub fn bialgebra_ty() -> Expr {
impl_pi("R", type0(), impl_pi("H", type0(), prop()))
}
pub fn hopf_algebra_ty() -> Expr {
impl_pi("R", type0(), impl_pi("H", type0(), prop()))
}
pub fn antipode_ty() -> Expr {
impl_pi("R", type0(), impl_pi("H", type0(), arrow(bvar(0), bvar(1))))
}
pub fn comultiplication_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi(
"H",
type0(),
arrow(
bvar(0),
app3(cst("TensorProduct"), bvar(1), bvar(1), bvar(1)),
),
),
)
}
pub fn comodule_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi("H", type0(), impl_pi("M", type0(), prop())),
)
}
pub fn coalgebra_map_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi("C", type0(), impl_pi("D", type0(), prop())),
)
}
pub fn morita_equivalent_ty() -> Expr {
impl_pi("R", type0(), impl_pi("S", type0(), prop()))
}
pub fn derived_morita_equivalent_ty() -> Expr {
impl_pi("R", type0(), impl_pi("S", type0(), prop()))
}
pub fn tilting_module_ty() -> Expr {
impl_pi("R", type0(), impl_pi("T", type0(), prop()))
}
pub fn morita_context_ty() -> Expr {
impl_pi("R", type0(), impl_pi("S", type0(), prop()))
}
pub fn ore_extension_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi(
"σ",
arrow(bvar(0), bvar(1)),
impl_pi("δ", arrow(bvar(1), bvar(2)), type0()),
),
)
}
pub fn skew_polynomial_ring_ty() -> Expr {
impl_pi("R", type0(), impl_pi("σ", arrow(bvar(0), bvar(1)), type0()))
}
pub fn ore_condition_ty() -> Expr {
impl_pi("R", type0(), impl_pi("S", arrow(bvar(0), prop()), prop()))
}
pub fn weyl_algebra_ty() -> Expr {
impl_pi("R", type0(), impl_pi("n", nat_ty(), type0()))
}
pub fn hilbert_series_ty() -> Expr {
impl_pi("ι", type0(), impl_pi("R", type0(), type0()))
}
pub fn castelnuovo_mumford_regularity_ty() -> Expr {
impl_pi("R", type0(), impl_pi("M", type0(), nat_ty()))
}
pub fn graded_free_resolution_ty() -> Expr {
impl_pi("R", type0(), impl_pi("M", type0(), prop()))
}
pub fn global_dimension_ty() -> Expr {
impl_pi("R", type0(), nat_ty())
}
pub fn injective_dimension_ty() -> Expr {
impl_pi("R", type0(), impl_pi("M", type0(), nat_ty()))
}
pub fn flat_dimension_ty() -> Expr {
impl_pi("R", type0(), impl_pi("M", type0(), nat_ty()))
}
pub fn weak_global_dimension_ty() -> Expr {
impl_pi("R", type0(), nat_ty())
}
pub fn galois_extension_ty() -> Expr {
impl_pi("K", type0(), impl_pi("L", type0(), prop()))
}
pub fn galois_group_ty() -> Expr {
impl_pi("K", type0(), impl_pi("L", type0(), type0()))
}
pub fn fundamental_theorem_galois_ty() -> Expr {
impl_pi("K", type0(), impl_pi("L", type0(), prop()))
}
pub fn solvable_extension_ty() -> Expr {
impl_pi("K", type0(), impl_pi("L", type0(), prop()))
}
pub fn separable_extension_ty() -> Expr {
impl_pi("K", type0(), impl_pi("L", type0(), prop()))
}
pub fn central_simple_algebra_ty() -> Expr {
impl_pi("K", type0(), impl_pi("A", type0(), prop()))
}
pub fn brauer_group_ty() -> Expr {
impl_pi("K", type0(), type0())
}
pub fn wedderburn_theorem_ty() -> Expr {
impl_pi("A", type0(), prop())
}
pub fn artin_wedderburn_ty() -> Expr {
impl_pi("R", type0(), prop())
}
pub fn schur_lemma_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi("M", type0(), impl_pi("N", type0(), prop())),
)
}
pub fn witt_vectors_ty() -> Expr {
impl_pi("R", type0(), type0())
}
pub fn lambda_ring_ty() -> Expr {
impl_pi("R", type0(), prop())
}
pub fn teichmuller_lift_ty() -> Expr {
impl_pi("R", type0(), impl_pi("p", nat_ty(), prop()))
}
pub fn ordered_group_ty() -> Expr {
impl_pi("G", type0(), prop())
}
pub fn lattice_ordered_ring_ty() -> Expr {
impl_pi("R", type0(), prop())
}
pub fn valued_field_ty() -> Expr {
impl_pi("K", type0(), impl_pi("Γ", type0(), prop()))
}
pub fn differential_graded_algebra_ty() -> Expr {
impl_pi("R", type0(), impl_pi("A", type0(), prop()))
}
pub fn a_infinity_algebra_ty() -> Expr {
impl_pi("R", type0(), impl_pi("A", type0(), prop()))
}
pub fn dg_module_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi("A", type0(), impl_pi("M", type0(), prop())),
)
}
pub fn quasi_isomorphism_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi("A", type0(), impl_pi("B", type0(), prop())),
)
}
pub fn operad_ty() -> Expr {
impl_pi("R", type0(), impl_pi("P", type0(), prop()))
}
pub fn operad_algebra_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi("P", type0(), impl_pi("A", type0(), prop())),
)
}
pub fn cyclic_operad_ty() -> Expr {
impl_pi("R", type0(), impl_pi("P", type0(), prop()))
}
pub fn associahedron_ty() -> Expr {
impl_pi("n", nat_ty(), type0())
}
pub fn bounded_derived_category_ty() -> Expr {
impl_pi("R", type0(), type0())
}
pub fn t_structure_ty() -> Expr {
impl_pi("R", type0(), impl_pi("D", type0(), prop()))
}
pub fn koszul_duality_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi("A", type0(), impl_pi("B", type0(), prop())),
)
}
pub fn koszul_algebra_ty() -> Expr {
impl_pi("R", type0(), impl_pi("A", type0(), prop()))
}
pub fn koszul_resolution_ty() -> Expr {
impl_pi("R", type0(), impl_pi("A", type0(), type0()))
}
pub fn derived_functor_ty() -> Expr {
impl_pi("R", type0(), impl_pi("F", type0(), type0()))
}
pub fn vertex_algebra_ty() -> Expr {
impl_pi("R", type0(), impl_pi("V", type0(), prop()))
}
pub fn conformal_vertex_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi("V", type0(), impl_pi("c", type0(), prop())),
)
}
pub fn prime_spectrum_ty() -> Expr {
impl_pi("R", type0(), type0())
}
pub fn maximal_spectrum_ty() -> Expr {
impl_pi("R", type0(), type0())
}
pub fn zariski_topology_ty() -> Expr {
impl_pi("R", type0(), prop())
}
pub fn structure_sheaf_ty() -> Expr {
impl_pi("R", type0(), type0())
}
pub fn register_abstract_algebra_adv(env: &mut Environment) {
let axioms: &[(&str, Expr)] = &[
("Module", module_ty()),
("Algebra", algebra_ty()),
("LinearMap", linear_map_ty()),
("TensorProduct", tensor_product_ty()),
("ExteriorAlgebra", exterior_algebra_ty()),
("GradedRing", graded_ring_ty()),
("GradedModule", graded_module_ty()),
("Derivation", derivation_ty()),
("LieAlgebra", lie_algebra_ty()),
("LieModule", lie_module_ty()),
("LieBracket", lie_bracket_ty()),
("JacobiIdentity", jacobi_identity_ty()),
("PBWBasis", pbw_basis_ty()),
("FilteredRing", filtered_ring_ty()),
("AssociatedGraded", associated_graded_ty()),
("FormalPowerSeries", formal_power_series_ty()),
("IAdicTopology", i_adic_topology_ty()),
("CompleteRing", complete_ring_ty()),
("ArtinRees", artin_rees_ty()),
("IntegralExtension", integral_extension_ty()),
("IntegralClosure", integral_closure_ty()),
("IntegrallyClosedDomain", integrally_closed_domain_ty()),
("GoingUp", going_up_ty()),
("GoingDown", going_down_ty()),
("LyingOver", lying_over_ty()),
("KrullDimension", krull_dimension_ty()),
("IdealHeight", ideal_height_ty()),
("NoetherianRing", noetherian_ring_ty()),
("ArtinianRing", artinian_ring_ty()),
("HopkinsLevitzki", hopkins_levitzki_ty()),
("PrimaryIdeal", primary_ideal_ty()),
("PrimaryDecomposition", primary_decomposition_ty()),
("LaskerNoether", lasker_noether_ty()),
("AssociatedPrimes", associated_primes_ty()),
("Localization", localization_ty()),
("LocalizationModule", localization_module_ty()),
("NakayamasLemma", nakayamas_lemma_ty()),
("CohenMacaulay", cohen_macaulay_ty()),
("RegularLocalRing", regular_local_ring_ty()),
("RegularSequence", regular_sequence_ty()),
("ModuleDepth", module_depth_ty()),
("ProjectiveDimension", projective_dimension_ty()),
("AuslanderBuchsbaum", auslander_buchsbaum_ty()),
("GorensteinRing", gorenstein_ring_ty()),
("GradedMorphism", graded_morphism_ty()),
("HomogeneousIdeal", homogeneous_ideal_ty()),
("HilbertFunction", hilbert_function_ty()),
("JacobsonRadical", jacobson_radical_ty()),
("NilRadical", nil_radical_ty()),
("SymmetricAlgebra", symmetric_algebra_ty()),
("DividedPowerAlgebra", divided_power_algebra_ty()),
("Bialgebra", bialgebra_ty()),
("HopfAlgebra", hopf_algebra_ty()),
("Antipode", antipode_ty()),
("Comultiplication", comultiplication_ty()),
("Comodule", comodule_ty()),
("CoalgebraMap", coalgebra_map_ty()),
("MoritaEquivalent", morita_equivalent_ty()),
("DerivedMoritaEquivalent", derived_morita_equivalent_ty()),
("TiltingModule", tilting_module_ty()),
("MoritaContext", morita_context_ty()),
("OreExtension", ore_extension_ty()),
("SkewPolynomialRing", skew_polynomial_ring_ty()),
("OreCondition", ore_condition_ty()),
("WeylAlgebra", weyl_algebra_ty()),
("HilbertSeries", hilbert_series_ty()),
(
"CastelnuovoMumfordRegularity",
castelnuovo_mumford_regularity_ty(),
),
("GradedFreeResolution", graded_free_resolution_ty()),
("GlobalDimension", global_dimension_ty()),
("InjectiveDimension", injective_dimension_ty()),
("FlatDimension", flat_dimension_ty()),
("WeakGlobalDimension", weak_global_dimension_ty()),
("GaloisExtension", galois_extension_ty()),
("GaloisGroup", galois_group_ty()),
("FundamentalTheoremGalois", fundamental_theorem_galois_ty()),
("SolvableExtension", solvable_extension_ty()),
("SeparableExtension", separable_extension_ty()),
("CentralSimpleAlgebra", central_simple_algebra_ty()),
("BrauerGroup", brauer_group_ty()),
("WedderburnTheorem", wedderburn_theorem_ty()),
("ArtinWedderburn", artin_wedderburn_ty()),
("SchurLemma", schur_lemma_ty()),
("WittVectors", witt_vectors_ty()),
("LambdaRing", lambda_ring_ty()),
("TeichmullerLift", teichmuller_lift_ty()),
("OrderedGroup", ordered_group_ty()),
("LatticeOrderedRing", lattice_ordered_ring_ty()),
("ValuedField", valued_field_ty()),
(
"DifferentialGradedAlgebra",
differential_graded_algebra_ty(),
),
("AInfinityAlgebra", a_infinity_algebra_ty()),
("DGModule", dg_module_ty()),
("QuasiIsomorphism", quasi_isomorphism_ty()),
("Operad", operad_ty()),
("OperadAlgebra", operad_algebra_ty()),
("CyclicOperad", cyclic_operad_ty()),
("Associahedron", associahedron_ty()),
("BoundedDerivedCategory", bounded_derived_category_ty()),
("TStructure", t_structure_ty()),
("KoszulDuality", koszul_duality_ty()),
("KoszulAlgebra", koszul_algebra_ty()),
("KoszulResolution", koszul_resolution_ty()),
("DerivedFunctor", derived_functor_ty()),
("VertexAlgebra", vertex_algebra_ty()),
("ConformalVertex", conformal_vertex_ty()),
("PrimeSpectrum", prime_spectrum_ty()),
("MaximalSpectrum", maximal_spectrum_ty()),
("ZariskiTopology", zariski_topology_ty()),
("StructureSheaf", structure_sheaf_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 {
use super::*;
fn registered_env() -> Environment {
let mut env = Environment::new();
register_abstract_algebra_adv(&mut env);
env
}
#[test]
fn test_module_registered() {
let env = registered_env();
assert!(env.get(&Name::str("Module")).is_some());
}
#[test]
fn test_algebra_registered() {
let env = registered_env();
assert!(env.get(&Name::str("Algebra")).is_some());
}
#[test]
fn test_linear_map_registered() {
let env = registered_env();
assert!(env.get(&Name::str("LinearMap")).is_some());
}
#[test]
fn test_tensor_product_registered() {
let env = registered_env();
assert!(env.get(&Name::str("TensorProduct")).is_some());
}
#[test]
fn test_exterior_algebra_registered() {
let env = registered_env();
assert!(env.get(&Name::str("ExteriorAlgebra")).is_some());
}
#[test]
fn test_lie_algebra_and_bracket_registered() {
let env = registered_env();
assert!(env.get(&Name::str("LieAlgebra")).is_some());
assert!(env.get(&Name::str("LieBracket")).is_some());
}
#[test]
fn test_jacobi_identity_registered() {
let env = registered_env();
assert!(env.get(&Name::str("JacobiIdentity")).is_some());
}
#[test]
fn test_pbw_basis_registered() {
let env = registered_env();
assert!(env.get(&Name::str("PBWBasis")).is_some());
}
#[test]
fn test_filtered_ring_registered() {
let env = registered_env();
assert!(env.get(&Name::str("FilteredRing")).is_some());
}
#[test]
fn test_associated_graded_registered() {
let env = registered_env();
assert!(env.get(&Name::str("AssociatedGraded")).is_some());
}
#[test]
fn test_formal_power_series_registered() {
let env = registered_env();
assert!(env.get(&Name::str("FormalPowerSeries")).is_some());
}
#[test]
fn test_i_adic_topology_registered() {
let env = registered_env();
assert!(env.get(&Name::str("IAdicTopology")).is_some());
}
#[test]
fn test_complete_ring_registered() {
let env = registered_env();
assert!(env.get(&Name::str("CompleteRing")).is_some());
}
#[test]
fn test_artin_rees_registered() {
let env = registered_env();
assert!(env.get(&Name::str("ArtinRees")).is_some());
}
#[test]
fn test_integral_extension_registered() {
let env = registered_env();
assert!(env.get(&Name::str("IntegralExtension")).is_some());
}
#[test]
fn test_integral_closure_registered() {
let env = registered_env();
assert!(env.get(&Name::str("IntegralClosure")).is_some());
}
#[test]
fn test_integrally_closed_domain_registered() {
let env = registered_env();
assert!(env.get(&Name::str("IntegrallyClosedDomain")).is_some());
}
#[test]
fn test_going_up_down_lying_over_registered() {
let env = registered_env();
assert!(env.get(&Name::str("GoingUp")).is_some());
assert!(env.get(&Name::str("GoingDown")).is_some());
assert!(env.get(&Name::str("LyingOver")).is_some());
}
#[test]
fn test_krull_dim_and_height_registered() {
let env = registered_env();
assert!(env.get(&Name::str("KrullDimension")).is_some());
assert!(env.get(&Name::str("IdealHeight")).is_some());
}
#[test]
fn test_noetherian_artinian_registered() {
let env = registered_env();
assert!(env.get(&Name::str("NoetherianRing")).is_some());
assert!(env.get(&Name::str("ArtinianRing")).is_some());
assert!(env.get(&Name::str("HopkinsLevitzki")).is_some());
}
#[test]
fn test_primary_decomposition_registered() {
let env = registered_env();
assert!(env.get(&Name::str("PrimaryIdeal")).is_some());
assert!(env.get(&Name::str("PrimaryDecomposition")).is_some());
assert!(env.get(&Name::str("LaskerNoether")).is_some());
assert!(env.get(&Name::str("AssociatedPrimes")).is_some());
}
#[test]
fn test_localization_registered() {
let env = registered_env();
assert!(env.get(&Name::str("Localization")).is_some());
assert!(env.get(&Name::str("LocalizationModule")).is_some());
}
#[test]
fn test_nakayamas_lemma_registered() {
let env = registered_env();
assert!(env.get(&Name::str("NakayamasLemma")).is_some());
}
#[test]
fn test_cohen_macaulay_and_regular_registered() {
let env = registered_env();
assert!(env.get(&Name::str("CohenMacaulay")).is_some());
assert!(env.get(&Name::str("RegularLocalRing")).is_some());
assert!(env.get(&Name::str("RegularSequence")).is_some());
assert!(env.get(&Name::str("ModuleDepth")).is_some());
}
#[test]
fn test_auslander_buchsbaum_gorenstein_registered() {
let env = registered_env();
assert!(env.get(&Name::str("ProjectiveDimension")).is_some());
assert!(env.get(&Name::str("AuslanderBuchsbaum")).is_some());
assert!(env.get(&Name::str("GorensteinRing")).is_some());
}
#[test]
fn test_graded_morphism_and_homogeneous_ideal_registered() {
let env = registered_env();
assert!(env.get(&Name::str("GradedMorphism")).is_some());
assert!(env.get(&Name::str("HomogeneousIdeal")).is_some());
assert!(env.get(&Name::str("HilbertFunction")).is_some());
}
#[test]
fn test_radicals_and_algebras_registered() {
let env = registered_env();
assert!(env.get(&Name::str("JacobsonRadical")).is_some());
assert!(env.get(&Name::str("NilRadical")).is_some());
assert!(env.get(&Name::str("SymmetricAlgebra")).is_some());
assert!(env.get(&Name::str("DividedPowerAlgebra")).is_some());
}
#[test]
fn test_graded_ring_basic() {
let mut gr = GradedRing::new("k");
gr.add_generator(0, "1");
gr.add_generator(1, "x");
gr.add_generator(1, "y");
gr.add_generator(2, "x^2");
gr.add_generator(2, "xy");
gr.add_generator(2, "y^2");
assert_eq!(gr.component_rank(0), 1);
assert_eq!(gr.component_rank(1), 2);
assert_eq!(gr.component_rank(2), 3);
assert_eq!(gr.component_rank(3), 0);
assert!(gr.is_standard_graded());
let degrees = gr.degrees();
assert_eq!(degrees, vec![0, 1, 2]);
}
#[test]
fn test_graded_ring_non_standard() {
let mut gr = GradedRing::new("Z");
gr.add_generator(-1, "t_inv");
gr.add_generator(0, "1");
gr.add_generator(1, "t");
assert!(!gr.is_standard_graded());
}
#[test]
fn test_local_ring_regular() {
let lr = LocalRing::new("k[[x,y]]", vec!["x".to_string(), "y".to_string()], "k")
.with_krull_dim(2);
assert!(lr.is_regular());
assert_eq!(lr.embedding_dimension(), 2);
assert!(lr.is_in_maximal_ideal("x"));
assert!(!lr.is_in_maximal_ideal("1"));
}
#[test]
fn test_local_ring_non_regular() {
let lr = LocalRing::new("k[[x,y]]/(xy)", vec!["x".to_string(), "y".to_string()], "k")
.with_krull_dim(1);
assert!(!lr.is_regular());
}
#[test]
fn test_primary_decomposition_data() {
let mut pd = PrimaryDecompositionData::new(2, vec!["x^2".to_string(), "y".to_string()]);
pd.add_component(vec!["x^2".to_string()], vec!["x".to_string()]);
pd.add_component(vec!["y".to_string()], vec!["y".to_string()]);
assert_eq!(pd.num_components(), 2);
assert!(pd.is_irredundant());
}
#[test]
fn test_primary_decomposition_redundant() {
let mut pd = PrimaryDecompositionData::new(5, vec!["x".to_string()]);
pd.add_component(vec!["x".to_string()], vec!["x".to_string()]);
pd.add_component(
vec!["x".to_string(), "y".to_string()],
vec!["x".to_string()],
);
assert_eq!(pd.num_components(), 2);
}
#[test]
fn test_graded_module_poincare() {
let mut m = GradedModule::new("k[x,y]");
m.set_rank(0, 1);
m.set_rank(1, 2);
m.set_rank(2, 3);
m.set_rank(3, 4);
let ps = m.poincare_series();
assert_eq!(ps, vec![(0, 1), (1, 2), (2, 3), (3, 4)]);
assert_eq!(m.total_rank(), 10);
assert_eq!(m.euler_characteristic(), -2);
}
#[test]
fn test_graded_module_euler_characteristic() {
let mut m = GradedModule::new("trivial");
m.set_rank(0, 1);
m.set_rank(2, 1);
assert_eq!(m.euler_characteristic(), 2);
}
#[test]
fn test_krull_dim_estimator_chain() {
let mut est = KrullDimEstimator::new();
est.add_prime(vec![]);
est.add_prime(vec!["x".to_string()]);
est.add_prime(vec!["x".to_string(), "y".to_string()]);
assert_eq!(est.estimate_krull_dim(), 2);
}
#[test]
fn test_krull_dim_estimator_empty() {
let est = KrullDimEstimator::new();
assert_eq!(est.estimate_krull_dim(), 0);
}
#[test]
fn test_krull_dim_estimator_field() {
let mut est = KrullDimEstimator::new();
est.add_prime(vec![]);
assert_eq!(est.estimate_krull_dim(), 0);
}
#[test]
fn test_krull_dim_maximal_chains() {
let mut est = KrullDimEstimator::new();
est.add_prime(vec![]);
est.add_prime(vec!["x".to_string()]);
est.add_prime(vec!["y".to_string()]);
est.add_prime(vec!["x".to_string(), "y".to_string()]);
let chains = est.maximal_chains();
assert!(!chains.is_empty());
}
#[test]
fn test_total_new_axioms_count() {
let env = registered_env();
let new_axioms = [
"FilteredRing",
"AssociatedGraded",
"FormalPowerSeries",
"IAdicTopology",
"CompleteRing",
"ArtinRees",
"IntegralExtension",
"IntegralClosure",
"IntegrallyClosedDomain",
"GoingUp",
"GoingDown",
"LyingOver",
"KrullDimension",
"IdealHeight",
"NoetherianRing",
"ArtinianRing",
"HopkinsLevitzki",
"PrimaryIdeal",
"PrimaryDecomposition",
"LaskerNoether",
"AssociatedPrimes",
"Localization",
"LocalizationModule",
"NakayamasLemma",
"CohenMacaulay",
"RegularLocalRing",
"RegularSequence",
"ModuleDepth",
"ProjectiveDimension",
"AuslanderBuchsbaum",
"GorensteinRing",
"GradedMorphism",
"HomogeneousIdeal",
"HilbertFunction",
"JacobsonRadical",
"NilRadical",
"SymmetricAlgebra",
"DividedPowerAlgebra",
];
for name in &new_axioms {
assert!(
env.get(&Name::str(*name)).is_some(),
"Axiom '{}' not registered",
name
);
}
}
#[test]
fn test_hopf_algebra_axioms_registered() {
let env = registered_env();
assert!(env.get(&Name::str("Bialgebra")).is_some());
assert!(env.get(&Name::str("HopfAlgebra")).is_some());
assert!(env.get(&Name::str("Antipode")).is_some());
assert!(env.get(&Name::str("Comultiplication")).is_some());
assert!(env.get(&Name::str("Comodule")).is_some());
assert!(env.get(&Name::str("CoalgebraMap")).is_some());
}
#[test]
fn test_morita_theory_axioms_registered() {
let env = registered_env();
assert!(env.get(&Name::str("MoritaEquivalent")).is_some());
assert!(env.get(&Name::str("DerivedMoritaEquivalent")).is_some());
assert!(env.get(&Name::str("TiltingModule")).is_some());
assert!(env.get(&Name::str("MoritaContext")).is_some());
}
#[test]
fn test_noncommutative_axioms_registered() {
let env = registered_env();
assert!(env.get(&Name::str("OreExtension")).is_some());
assert!(env.get(&Name::str("SkewPolynomialRing")).is_some());
assert!(env.get(&Name::str("OreCondition")).is_some());
assert!(env.get(&Name::str("WeylAlgebra")).is_some());
}
#[test]
fn test_graded_hilbert_axioms_registered() {
let env = registered_env();
assert!(env.get(&Name::str("HilbertSeries")).is_some());
assert!(env
.get(&Name::str("CastelnuovoMumfordRegularity"))
.is_some());
assert!(env.get(&Name::str("GradedFreeResolution")).is_some());
}
#[test]
fn test_homological_dimension_axioms_registered() {
let env = registered_env();
assert!(env.get(&Name::str("GlobalDimension")).is_some());
assert!(env.get(&Name::str("InjectiveDimension")).is_some());
assert!(env.get(&Name::str("FlatDimension")).is_some());
assert!(env.get(&Name::str("WeakGlobalDimension")).is_some());
}
#[test]
fn test_galois_theory_axioms_registered() {
let env = registered_env();
assert!(env.get(&Name::str("GaloisExtension")).is_some());
assert!(env.get(&Name::str("GaloisGroup")).is_some());
assert!(env.get(&Name::str("FundamentalTheoremGalois")).is_some());
assert!(env.get(&Name::str("SolvableExtension")).is_some());
assert!(env.get(&Name::str("SeparableExtension")).is_some());
}
#[test]
fn test_brauer_group_axioms_registered() {
let env = registered_env();
assert!(env.get(&Name::str("CentralSimpleAlgebra")).is_some());
assert!(env.get(&Name::str("BrauerGroup")).is_some());
assert!(env.get(&Name::str("WedderburnTheorem")).is_some());
assert!(env.get(&Name::str("ArtinWedderburn")).is_some());
assert!(env.get(&Name::str("SchurLemma")).is_some());
}
#[test]
fn test_witt_lambda_axioms_registered() {
let env = registered_env();
assert!(env.get(&Name::str("WittVectors")).is_some());
assert!(env.get(&Name::str("LambdaRing")).is_some());
assert!(env.get(&Name::str("TeichmullerLift")).is_some());
}
#[test]
fn test_ordered_lattice_axioms_registered() {
let env = registered_env();
assert!(env.get(&Name::str("OrderedGroup")).is_some());
assert!(env.get(&Name::str("LatticeOrderedRing")).is_some());
assert!(env.get(&Name::str("ValuedField")).is_some());
}
#[test]
fn test_dga_axioms_registered() {
let env = registered_env();
assert!(env.get(&Name::str("DifferentialGradedAlgebra")).is_some());
assert!(env.get(&Name::str("AInfinityAlgebra")).is_some());
assert!(env.get(&Name::str("DGModule")).is_some());
assert!(env.get(&Name::str("QuasiIsomorphism")).is_some());
}
#[test]
fn test_operad_axioms_registered() {
let env = registered_env();
assert!(env.get(&Name::str("Operad")).is_some());
assert!(env.get(&Name::str("OperadAlgebra")).is_some());
assert!(env.get(&Name::str("CyclicOperad")).is_some());
assert!(env.get(&Name::str("Associahedron")).is_some());
}
#[test]
fn test_derived_category_koszul_axioms_registered() {
let env = registered_env();
assert!(env.get(&Name::str("BoundedDerivedCategory")).is_some());
assert!(env.get(&Name::str("TStructure")).is_some());
assert!(env.get(&Name::str("KoszulDuality")).is_some());
assert!(env.get(&Name::str("KoszulAlgebra")).is_some());
assert!(env.get(&Name::str("KoszulResolution")).is_some());
assert!(env.get(&Name::str("DerivedFunctor")).is_some());
}
#[test]
fn test_vertex_algebra_axioms_registered() {
let env = registered_env();
assert!(env.get(&Name::str("VertexAlgebra")).is_some());
assert!(env.get(&Name::str("ConformalVertex")).is_some());
}
#[test]
fn test_prime_spectrum_axioms_registered() {
let env = registered_env();
assert!(env.get(&Name::str("PrimeSpectrum")).is_some());
assert!(env.get(&Name::str("MaximalSpectrum")).is_some());
assert!(env.get(&Name::str("ZariskiTopology")).is_some());
assert!(env.get(&Name::str("StructureSheaf")).is_some());
}
#[test]
fn test_hopf_algebra_data_group_like() {
let mut h = HopfAlgebraData::new("k[Z/2]");
h.add_group_like("1", "1");
h.add_group_like("g", "g");
assert_eq!(h.dimension(), 2);
assert!(h.check_counit_group_like("1"));
assert!(h.check_counit_group_like("g"));
assert!(h.is_cocommutative());
}
#[test]
fn test_hopf_algebra_data_primitive() {
let mut h = HopfAlgebraData::new("k[x]/x^2");
h.add_group_like("1", "1");
h.add_primitive("x", "1");
assert_eq!(h.dimension(), 2);
assert_eq!(h.counit.get("x").copied(), Some(0));
assert_eq!(h.antipode.get("x").map(|s| s.as_str()), Some("-x"));
}
#[test]
fn test_galois_extension_fundamental_theorem() {
let mut ext = GaloisExtensionData::new(
"Q",
"Q(sqrt2,sqrt3)",
4,
vec!["sqrt2".to_string(), "sqrt3".to_string()],
);
ext.add_automorphism("sigma", vec!["-sqrt2".to_string(), "sqrt3".to_string()]);
ext.add_automorphism("tau", vec!["sqrt2".to_string(), "-sqrt3".to_string()]);
ext.add_automorphism(
"sigma_tau",
vec!["-sqrt2".to_string(), "-sqrt3".to_string()],
);
ext.add_automorphism("id", vec!["sqrt2".to_string(), "sqrt3".to_string()]);
assert_eq!(ext.galois_group_order(), 4);
assert!(ext.satisfies_fundamental_theorem());
}
#[test]
fn test_galois_extension_fixed_generators() {
let mut ext = GaloisExtensionData::new(
"Q",
"Q(sqrt2,sqrt3)",
4,
vec!["sqrt2".to_string(), "sqrt3".to_string()],
);
ext.add_automorphism("sigma", vec!["-sqrt2".to_string(), "sqrt3".to_string()]);
let fixed = ext.fixed_generators(&[0]);
assert_eq!(fixed, vec!["sqrt3".to_string()]);
}
#[test]
fn test_dg_algebra_boundary_zero() {
let mut dga = DGAlgebra::new("Omega*(pt)");
dga.add_basis("1", 0);
dga.set_differential("1", vec![]);
assert!(dga.check_d_squared_zero("1"));
}
#[test]
fn test_dg_algebra_boundary_nontrivial() {
let mut dga = DGAlgebra::new("Omega*(S1)");
dga.add_basis("1", 0);
dga.add_basis("dt", 1);
dga.set_differential("1", vec![]);
dga.set_differential("dt", vec![]);
assert!(dga.check_d_squared_zero("1"));
assert!(dga.check_d_squared_zero("dt"));
assert_eq!(dga.basis_in_degree(0).len(), 1);
assert_eq!(dga.basis_in_degree(1).len(), 1);
}
#[test]
fn test_koszul_complex_ranks() {
let kc =
KoszulComplex::new(vec!["x".to_string(), "y".to_string()]).with_regular_sequence(true);
assert_eq!(kc.length(), 2);
assert_eq!(kc.rank_at(0), 1);
assert_eq!(kc.rank_at(1), 2);
assert_eq!(kc.rank_at(2), 1);
assert_eq!(kc.rank_at(3), 0);
assert_eq!(kc.euler_characteristic(), 0);
}
#[test]
fn test_koszul_complex_acyclic() {
let kc = KoszulComplex::new(vec!["x".to_string(), "y".to_string(), "z".to_string()])
.with_regular_sequence(true);
assert_eq!(kc.is_acyclic(), Some(true));
assert_eq!(kc.length(), 3);
assert_eq!(kc.rank_at(1), 3);
assert_eq!(kc.rank_at(2), 3);
assert_eq!(kc.rank_at(3), 1);
assert_eq!(kc.euler_characteristic(), 0);
}
#[test]
fn test_koszul_complex_betti_numbers() {
let kc = KoszulComplex::new(vec!["f1".to_string(), "f2".to_string()]);
let betti = kc.betti_numbers();
assert_eq!(betti, vec![(0, 1), (1, 2), (2, 1)]);
}
#[test]
fn test_koszul_complex_empty() {
let kc = KoszulComplex::default();
assert_eq!(kc.length(), 0);
assert_eq!(kc.euler_characteristic(), 1);
assert_eq!(kc.rank_at(0), 1);
}
}