#![allow(clippy::items_after_test_module)]
use oxilean_kernel::{BinderInfo, Declaration, Environment, Expr, Level, Name};
use super::types::{CliffordAlgebra, ExteriorAlgebra};
pub(super) fn app(f: Expr, a: Expr) -> Expr {
Expr::App(Box::new(f), Box::new(a))
}
pub(super) 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 app4(f: Expr, a: Expr, b: Expr, c: Expr, d: Expr) -> Expr {
app(app3(f, a, b, c), d)
}
pub(super) fn cst(s: &str) -> Expr {
Expr::Const(Name::str(s), vec![])
}
pub(super) fn prop() -> Expr {
Expr::Sort(Level::zero())
}
pub(super) fn type0() -> Expr {
Expr::Sort(Level::succ(Level::zero()))
}
pub fn type1() -> Expr {
Expr::Sort(Level::succ(Level::succ(Level::zero())))
}
pub(super) fn pi(bi: BinderInfo, name: &str, dom: Expr, body: Expr) -> Expr {
Expr::Pi(bi, Name::str(name), Box::new(dom), Box::new(body))
}
pub(super) 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(super) fn bvar(n: u32) -> Expr {
Expr::BVar(n)
}
pub(super) fn nat_ty() -> Expr {
cst("Nat")
}
pub fn bool_ty() -> Expr {
cst("Bool")
}
pub fn field_ty() -> Expr {
arrow(type0(), prop())
}
pub fn field_extension_ty() -> Expr {
arrow(type0(), arrow(type0(), prop()))
}
pub fn extension_degree_ty() -> Expr {
pi(
BinderInfo::Default,
"K",
type0(),
pi(
BinderInfo::Default,
"L",
type0(),
arrow(app2(cst("FieldExtension"), bvar(1), bvar(0)), nat_ty()),
),
)
}
pub fn algebraic_element_ty() -> Expr {
pi(
BinderInfo::Default,
"K",
type0(),
pi(BinderInfo::Default, "L", type0(), arrow(bvar(0), prop())),
)
}
pub fn algebraic_extension_ty() -> Expr {
pi(
BinderInfo::Default,
"K",
type0(),
pi(
BinderInfo::Default,
"L",
type0(),
arrow(app2(cst("FieldExtension"), bvar(1), bvar(0)), prop()),
),
)
}
pub fn separable_extension_ty() -> Expr {
pi(
BinderInfo::Default,
"K",
type0(),
pi(
BinderInfo::Default,
"L",
type0(),
arrow(app2(cst("FieldExtension"), bvar(1), bvar(0)), prop()),
),
)
}
pub fn normal_extension_ty() -> Expr {
pi(
BinderInfo::Default,
"K",
type0(),
pi(
BinderInfo::Default,
"L",
type0(),
arrow(app2(cst("FieldExtension"), bvar(1), bvar(0)), prop()),
),
)
}
pub fn galois_extension_ty() -> Expr {
pi(
BinderInfo::Default,
"K",
type0(),
pi(
BinderInfo::Default,
"L",
type0(),
arrow(app2(cst("FieldExtension"), bvar(1), bvar(0)), prop()),
),
)
}
pub fn polynomial_ty() -> Expr {
arrow(type0(), type0())
}
pub fn splitting_field_ty() -> Expr {
pi(
BinderInfo::Default,
"K",
type0(),
arrow(app(cst("Polynomial"), bvar(0)), type0()),
)
}
pub fn splitting_field_universal_ty() -> Expr {
pi(
BinderInfo::Default,
"K",
type0(),
pi(
BinderInfo::Default,
"p",
app(cst("Polynomial"), bvar(0)),
app2(
cst("FieldExtension"),
bvar(1),
app2(cst("SplittingField"), bvar(2), bvar(0)),
),
),
)
}
pub fn polynomial_splits_ty() -> Expr {
pi(
BinderInfo::Default,
"K",
type0(),
pi(
BinderInfo::Default,
"L",
type0(),
arrow(app(cst("Polynomial"), bvar(1)), prop()),
),
)
}
pub fn minimal_polynomial_ty() -> Expr {
pi(
BinderInfo::Default,
"K",
type0(),
pi(
BinderInfo::Default,
"L",
type0(),
arrow(bvar(0), app(cst("Polynomial"), bvar(1))),
),
)
}
pub fn field_aut_ty() -> Expr {
arrow(type0(), arrow(type0(), type0()))
}
pub fn galois_group_ty() -> Expr {
pi(
BinderInfo::Default,
"K",
type0(),
pi(
BinderInfo::Default,
"L",
type0(),
arrow(app2(cst("FieldExtension"), bvar(1), bvar(0)), type0()),
),
)
}
pub fn galois_group_order_ty() -> Expr {
pi(
BinderInfo::Default,
"K",
type0(),
pi(
BinderInfo::Default,
"L",
type0(),
arrow(app2(cst("GaloisExtension"), bvar(1), bvar(0)), prop()),
),
)
}
pub fn fixed_field_ty() -> Expr {
pi(
BinderInfo::Default,
"K",
type0(),
pi(BinderInfo::Default, "L", type0(), arrow(type0(), type0())),
)
}
pub fn fundamental_theorem_galois_ty() -> Expr {
pi(
BinderInfo::Default,
"K",
type0(),
pi(
BinderInfo::Default,
"L",
type0(),
arrow(app2(cst("GaloisExtension"), bvar(1), bvar(0)), prop()),
),
)
}
pub fn galois_correspondence_ty() -> Expr {
pi(
BinderInfo::Default,
"K",
type0(),
pi(
BinderInfo::Default,
"L",
type0(),
arrow(app2(cst("GaloisExtension"), bvar(1), bvar(0)), type0()),
),
)
}
pub fn solvable_by_radicals_ty() -> Expr {
pi(
BinderInfo::Default,
"K",
type0(),
arrow(app(cst("Polynomial"), bvar(0)), prop()),
)
}
pub fn abel_extension_ty() -> Expr {
pi(
BinderInfo::Default,
"K",
type0(),
pi(
BinderInfo::Default,
"L",
type0(),
arrow(app2(cst("FieldExtension"), bvar(1), bvar(0)), prop()),
),
)
}
pub fn sylow_subgroup_ty() -> Expr {
arrow(type0(), arrow(nat_ty(), type0()))
}
pub fn sylow_existence_ty() -> Expr {
pi(
BinderInfo::Default,
"G",
type0(),
pi(
BinderInfo::Default,
"p",
nat_ty(),
arrow(
app(cst("IsGroup"), bvar(1)),
arrow(app(cst("IsPrime"), bvar(1)), prop()),
),
),
)
}
pub fn sylow_conjugacy_ty() -> Expr {
pi(
BinderInfo::Default,
"G",
type0(),
pi(
BinderInfo::Default,
"p",
nat_ty(),
pi(
BinderInfo::Default,
"P",
app2(cst("SylowSubgroup"), bvar(1), bvar(0)),
pi(
BinderInfo::Default,
"Q",
app2(cst("SylowSubgroup"), bvar(2), bvar(1)),
prop(),
),
),
),
)
}
pub fn sylow_count_ty() -> Expr {
arrow(type0(), arrow(nat_ty(), nat_ty()))
}
pub fn sylow_third_theorem_ty() -> Expr {
pi(
BinderInfo::Default,
"G",
type0(),
pi(BinderInfo::Default, "p", nat_ty(), prop()),
)
}
pub fn sylow_normal_ty() -> Expr {
arrow(type0(), arrow(nat_ty(), prop()))
}
pub fn composition_series_ty() -> Expr {
arrow(type0(), type0())
}
pub fn composition_factors_ty() -> Expr {
pi(
BinderInfo::Default,
"G",
type0(),
arrow(
app(cst("CompositionSeries"), bvar(0)),
app(cst("List"), type0()),
),
)
}
pub fn jordan_holder_ty() -> Expr {
pi(
BinderInfo::Default,
"G",
type0(),
pi(
BinderInfo::Default,
"s1",
app(cst("CompositionSeries"), bvar(0)),
pi(
BinderInfo::Default,
"s2",
app(cst("CompositionSeries"), bvar(1)),
prop(),
),
),
)
}
pub fn simple_group_ty() -> Expr {
arrow(type0(), prop())
}
pub fn solvable_ty() -> Expr {
arrow(type0(), prop())
}
pub fn nilpotent_ty() -> Expr {
arrow(type0(), prop())
}
pub fn derived_series_ty() -> Expr {
arrow(type0(), app(cst("List"), type0()))
}
pub fn lower_central_series_ty() -> Expr {
arrow(type0(), app(cst("List"), type0()))
}
pub fn free_group_ty() -> Expr {
arrow(type0(), type0())
}
pub fn free_group_hom_ty() -> Expr {
impl_pi(
"S",
type0(),
impl_pi(
"G",
type0(),
arrow(
app(cst("IsGroup"), bvar(0)),
arrow(
arrow(bvar(1), bvar(1)),
arrow(app(cst("FreeGroup"), bvar(2)), bvar(2)),
),
),
),
)
}
pub fn free_group_universal_ty() -> Expr {
pi(
BinderInfo::Default,
"S",
type0(),
pi(
BinderInfo::Default,
"G",
type0(),
arrow(
app(cst("IsGroup"), bvar(0)),
arrow(arrow(bvar(1), bvar(1)), prop()),
),
),
)
}
pub fn group_presentation_ty() -> Expr {
arrow(type0(), arrow(type0(), type0()))
}
pub fn relator_set_ty() -> Expr {
arrow(type0(), arrow(type0(), type0()))
}
pub fn word_problem_ty() -> Expr {
pi(
BinderInfo::Default,
"S",
type0(),
pi(
BinderInfo::Default,
"R",
type0(),
arrow(app2(cst("GroupPresentation"), bvar(1), bvar(0)), type0()),
),
)
}
pub fn normal_closure_ty() -> Expr {
pi(
BinderInfo::Default,
"G",
type0(),
arrow(app(cst("Set"), bvar(0)), type0()),
)
}
pub fn amalgamated_product_ty() -> Expr {
arrow(type0(), arrow(type0(), arrow(type0(), type0())))
}
pub fn hnn_extension_ty() -> Expr {
arrow(type0(), arrow(type0(), type0()))
}
pub fn finitely_generated_abelian_group_ty() -> Expr {
arrow(type0(), prop())
}
pub fn abelian_group_invariant_factors_ty() -> Expr {
arrow(type0(), app(cst("List"), nat_ty()))
}
pub fn abelian_group_elementary_divisors_ty() -> Expr {
arrow(type0(), app(cst("List"), nat_ty()))
}
pub fn abelian_group_rank_ty() -> Expr {
arrow(type0(), nat_ty())
}
pub fn classification_fg_ag_ty() -> Expr {
pi(
BinderInfo::Default,
"G",
type0(),
arrow(app(cst("FinitelyGeneratedAbelianGroup"), bvar(0)), prop()),
)
}
pub fn torsion_subgroup_ty() -> Expr {
arrow(type0(), type0())
}
pub fn primary_component_ty() -> Expr {
arrow(type0(), arrow(nat_ty(), type0()))
}
pub fn pid_ty() -> Expr {
arrow(type0(), prop())
}
pub fn integral_domain_ty() -> Expr {
arrow(type0(), prop())
}
pub fn fin_gen_module_pid_ty() -> Expr {
arrow(type0(), type0())
}
pub fn structure_theorem_pid_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
pi(
BinderInfo::Default,
"M",
type0(),
arrow(
app(cst("PID"), bvar(1)),
arrow(app2(cst("FinGenModulePID"), bvar(2), bvar(1)), prop()),
),
),
)
}
pub fn invariant_factors_ty() -> Expr {
arrow(type0(), arrow(type0(), app(cst("List"), bvar(1))))
}
pub fn free_rank_ty() -> Expr {
arrow(type0(), arrow(type0(), nat_ty()))
}
pub fn torsion_module_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
arrow(app(cst("FinGenModulePID"), bvar(0)), prop()),
)
}
pub fn elementary_divisors_ty() -> Expr {
arrow(type0(), arrow(type0(), app(cst("List"), bvar(1))))
}
pub fn snf_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
pi(
BinderInfo::Default,
"m",
nat_ty(),
pi(
BinderInfo::Default,
"n",
nat_ty(),
arrow(
app3(cst("Matrix"), bvar(2), bvar(1), bvar(0)),
app3(cst("Matrix"), bvar(3), bvar(2), bvar(1)),
),
),
),
)
}
pub fn euclidean_domain_ty() -> Expr {
arrow(type0(), prop())
}
pub fn ufd_ty() -> Expr {
arrow(type0(), prop())
}
pub fn gcd_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
arrow(bvar(0), arrow(bvar(1), bvar(1))),
)
}
pub fn bezout_domain_ty() -> Expr {
arrow(type0(), prop())
}
pub fn dedekind_domain_ty() -> Expr {
arrow(type0(), prop())
}
pub fn ideal_class_group_ty() -> Expr {
arrow(type0(), type0())
}
#[allow(clippy::too_many_arguments)]
pub fn register_abstract_algebra_advanced(env: &mut Environment) {
let axioms: &[(&str, Expr)] = &[
("Field", field_ty()),
("FieldExtension", field_extension_ty()),
("ExtensionDegree", extension_degree_ty()),
("AlgebraicElement", algebraic_element_ty()),
("AlgebraicExtension", algebraic_extension_ty()),
("SeparableExtension", separable_extension_ty()),
("NormalExtension", normal_extension_ty()),
("GaloisExtension", galois_extension_ty()),
("Polynomial", polynomial_ty()),
("SplittingField", splitting_field_ty()),
("SplittingFieldUniversal", splitting_field_universal_ty()),
("PolynomialSplits", polynomial_splits_ty()),
("MinimalPolynomial", minimal_polynomial_ty()),
("FieldAut", field_aut_ty()),
("GaloisGroup", galois_group_ty()),
("GaloisGroupOrder", galois_group_order_ty()),
("FixedField", fixed_field_ty()),
("FundamentalTheoremGalois", fundamental_theorem_galois_ty()),
("GaloisCorrespondence", galois_correspondence_ty()),
("SolvableByRadicals", solvable_by_radicals_ty()),
("AbelExtension", abel_extension_ty()),
("SylowSubgroup", sylow_subgroup_ty()),
("SylowExistence", sylow_existence_ty()),
("SylowConjugacy", sylow_conjugacy_ty()),
("SylowCount", sylow_count_ty()),
("SylowThirdTheorem", sylow_third_theorem_ty()),
("SylowNormal", sylow_normal_ty()),
("CompositionSeries", composition_series_ty()),
("CompositionFactors", composition_factors_ty()),
("JordanHolder", jordan_holder_ty()),
("SimpleGroup", simple_group_ty()),
("Solvable", solvable_ty()),
("Nilpotent", nilpotent_ty()),
("DerivedSeries", derived_series_ty()),
("LowerCentralSeries", lower_central_series_ty()),
("FreeGroup", free_group_ty()),
("FreeGroupHom", free_group_hom_ty()),
("FreeGroupUniversal", free_group_universal_ty()),
("GroupPresentation", group_presentation_ty()),
("RelatorSet", relator_set_ty()),
("WordProblem", word_problem_ty()),
("NormalClosure", normal_closure_ty()),
("AmalgramatedProduct", amalgamated_product_ty()),
("HNNExtension", hnn_extension_ty()),
(
"FinitelyGeneratedAbelianGroup",
finitely_generated_abelian_group_ty(),
),
(
"AbelianGroupInvariantFactors",
abelian_group_invariant_factors_ty(),
),
(
"AbelianGroupElementaryDivisors",
abelian_group_elementary_divisors_ty(),
),
("AbelianGroupRank", abelian_group_rank_ty()),
("ClassificationFGAG", classification_fg_ag_ty()),
("TorsionSubgroup", torsion_subgroup_ty()),
("PrimaryComponent", primary_component_ty()),
("PID", pid_ty()),
("IntegralDomain", integral_domain_ty()),
("FinGenModulePID", fin_gen_module_pid_ty()),
("StructureTheoremPID", structure_theorem_pid_ty()),
("InvariantFactors", invariant_factors_ty()),
("FreeRank", free_rank_ty()),
("TorsionModule", torsion_module_ty()),
("ElementaryDivisors", elementary_divisors_ty()),
("SNF", snf_ty()),
("EuclideanDomain", euclidean_domain_ty()),
("UFD", ufd_ty()),
("GCD", gcd_ty()),
("BezoutDomain", bezout_domain_ty()),
("DedekindDomain", dedekind_domain_ty()),
("IdealClassGroup", ideal_class_group_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_advanced(&mut env);
env
}
#[test]
fn test_galois_theory_registered() {
let env = registered_env();
assert!(env.get(&Name::str("FieldExtension")).is_some());
assert!(env.get(&Name::str("GaloisGroup")).is_some());
assert!(env.get(&Name::str("FundamentalTheoremGalois")).is_some());
assert!(env.get(&Name::str("GaloisCorrespondence")).is_some());
assert!(env.get(&Name::str("SolvableByRadicals")).is_some());
}
#[test]
fn test_splitting_field_registered() {
let env = registered_env();
assert!(env.get(&Name::str("Polynomial")).is_some());
assert!(env.get(&Name::str("SplittingField")).is_some());
assert!(env.get(&Name::str("SplittingFieldUniversal")).is_some());
assert!(env.get(&Name::str("MinimalPolynomial")).is_some());
}
#[test]
fn test_sylow_theorems_registered() {
let env = registered_env();
assert!(env.get(&Name::str("SylowSubgroup")).is_some());
assert!(env.get(&Name::str("SylowExistence")).is_some());
assert!(env.get(&Name::str("SylowConjugacy")).is_some());
assert!(env.get(&Name::str("SylowCount")).is_some());
assert!(env.get(&Name::str("SylowThirdTheorem")).is_some());
assert!(env.get(&Name::str("SylowNormal")).is_some());
}
#[test]
fn test_jordan_holder_registered() {
let env = registered_env();
assert!(env.get(&Name::str("CompositionSeries")).is_some());
assert!(env.get(&Name::str("CompositionFactors")).is_some());
assert!(env.get(&Name::str("JordanHolder")).is_some());
assert!(env.get(&Name::str("SimpleGroup")).is_some());
assert!(env.get(&Name::str("Solvable")).is_some());
assert!(env.get(&Name::str("Nilpotent")).is_some());
}
#[test]
fn test_free_groups_registered() {
let env = registered_env();
assert!(env.get(&Name::str("FreeGroup")).is_some());
assert!(env.get(&Name::str("FreeGroupHom")).is_some());
assert!(env.get(&Name::str("FreeGroupUniversal")).is_some());
assert!(env.get(&Name::str("GroupPresentation")).is_some());
assert!(env.get(&Name::str("WordProblem")).is_some());
assert!(env.get(&Name::str("NormalClosure")).is_some());
}
#[test]
fn test_abelian_group_structure_registered() {
let env = registered_env();
assert!(env
.get(&Name::str("FinitelyGeneratedAbelianGroup"))
.is_some());
assert!(env
.get(&Name::str("AbelianGroupInvariantFactors"))
.is_some());
assert!(env
.get(&Name::str("AbelianGroupElementaryDivisors"))
.is_some());
assert!(env.get(&Name::str("AbelianGroupRank")).is_some());
assert!(env.get(&Name::str("ClassificationFGAG")).is_some());
assert!(env.get(&Name::str("TorsionSubgroup")).is_some());
assert!(env.get(&Name::str("PrimaryComponent")).is_some());
}
#[test]
fn test_pid_modules_registered() {
let env = registered_env();
assert!(env.get(&Name::str("PID")).is_some());
assert!(env.get(&Name::str("IntegralDomain")).is_some());
assert!(env.get(&Name::str("FinGenModulePID")).is_some());
assert!(env.get(&Name::str("StructureTheoremPID")).is_some());
assert!(env.get(&Name::str("InvariantFactors")).is_some());
assert!(env.get(&Name::str("TorsionModule")).is_some());
assert!(env.get(&Name::str("SNF")).is_some());
}
#[test]
fn test_domain_hierarchy_registered() {
let env = registered_env();
assert!(env.get(&Name::str("EuclideanDomain")).is_some());
assert!(env.get(&Name::str("UFD")).is_some());
assert!(env.get(&Name::str("GCD")).is_some());
assert!(env.get(&Name::str("BezoutDomain")).is_some());
assert!(env.get(&Name::str("DedekindDomain")).is_some());
assert!(env.get(&Name::str("IdealClassGroup")).is_some());
}
}
pub fn build_env() -> Environment {
let mut env = Environment::new();
let axioms: &[(&str, fn() -> Expr)] = &[
("GaloisFieldExists", galois_field_exists_ty),
("GaloisFieldUnique", galois_field_unique_ty),
("GaloisFieldCyclic", galois_field_cyclic_ty),
("CoherentRingAxiom", coherent_ring_axiom_ty),
("NoetherianACCAx", noetherian_acc_ty),
("HilbertBasisAx", hilbert_basis_ty),
("WedderburnArtinAx", wedderburn_artin_ty),
("ArtinMapAx", artin_map_ty),
("GlobalDimAx", global_dim_ty),
("LocalizationExact", localization_exact_ty),
];
for (name, ty_fn) in axioms {
let _ = env.add(Declaration::Axiom {
name: Name::str(*name),
univ_params: vec![],
ty: ty_fn(),
});
}
register_abstract_algebra_advanced(&mut env);
env
}
pub fn galois_field_exists_ty() -> Expr {
arrow(nat_ty(), arrow(nat_ty(), cst("GaloisFieldType")))
}
pub fn galois_field_unique_ty() -> Expr {
arrow(nat_ty(), arrow(nat_ty(), cst("Prop")))
}
pub fn galois_field_cyclic_ty() -> Expr {
arrow(cst("GaloisFieldType"), cst("CyclicGroup"))
}
pub fn coherent_ring_axiom_ty() -> Expr {
arrow(cst("Ring"), cst("Prop"))
}
pub fn noetherian_acc_ty() -> Expr {
arrow(cst("Ring"), cst("Prop"))
}
pub fn hilbert_basis_ty() -> Expr {
arrow(cst("Ring"), cst("Ring"))
}
pub fn wedderburn_artin_ty() -> Expr {
arrow(cst("Ring"), cst("Prop"))
}
pub fn artin_map_ty() -> Expr {
arrow(cst("NumberField"), cst("Prop"))
}
pub fn global_dim_ty() -> Expr {
arrow(cst("Ring"), nat_ty())
}
pub fn localization_exact_ty() -> Expr {
arrow(cst("Ring"), arrow(cst("MultiplicativeSet"), cst("Prop")))
}
pub fn tensor_algebra_ty() -> Expr {
arrow(type0(), type0())
}
pub fn tensor_algebra_universal_ty() -> Expr {
pi(
BinderInfo::Default,
"V",
type0(),
pi(
BinderInfo::Default,
"A",
type0(),
arrow(
app(cst("IsAlgebra"), bvar(0)),
arrow(
arrow(bvar(1), bvar(1)),
arrow(app(cst("TensorAlgebra"), bvar(2)), bvar(2)),
),
),
),
)
}
pub fn symmetric_algebra_ty() -> Expr {
arrow(type0(), type0())
}
pub fn symmetric_algebra_universal_ty() -> Expr {
pi(
BinderInfo::Default,
"V",
type0(),
pi(
BinderInfo::Default,
"A",
type0(),
arrow(
app(cst("IsCommAlgebra"), bvar(0)),
arrow(
arrow(bvar(1), bvar(1)),
arrow(app(cst("SymmetricAlgebra"), bvar(2)), bvar(2)),
),
),
),
)
}
pub fn exterior_algebra_ty() -> Expr {
arrow(type0(), type0())
}
pub fn exterior_algebra_universal_ty() -> Expr {
pi(
BinderInfo::Default,
"V",
type0(),
pi(
BinderInfo::Default,
"A",
type0(),
arrow(
app(cst("IsAlgebra"), bvar(0)),
arrow(
app(cst("IsAlternating"), bvar(1)),
arrow(
arrow(bvar(2), bvar(2)),
arrow(app(cst("ExteriorAlgebra"), bvar(3)), bvar(3)),
),
),
),
),
)
}
pub fn wedge_product_ty() -> Expr {
pi(
BinderInfo::Default,
"V",
type0(),
pi(
BinderInfo::Default,
"k",
nat_ty(),
pi(
BinderInfo::Default,
"l",
nat_ty(),
arrow(
app2(cst("ExteriorPower"), bvar(2), bvar(1)),
arrow(
app2(cst("ExteriorPower"), bvar(3), bvar(1)),
app2(
cst("ExteriorPower"),
bvar(4),
app2(cst("NatAdd"), bvar(2), bvar(1)),
),
),
),
),
),
)
}
pub fn clifford_algebra_ty() -> Expr {
pi(
BinderInfo::Default,
"V",
type0(),
arrow(app(cst("QuadraticForm"), bvar(0)), type0()),
)
}
pub fn clifford_algebra_universal_ty() -> Expr {
pi(
BinderInfo::Default,
"V",
type0(),
pi(
BinderInfo::Default,
"Q",
app(cst("QuadraticForm"), bvar(0)),
pi(
BinderInfo::Default,
"A",
type0(),
arrow(
app(cst("IsAlgebra"), bvar(0)),
arrow(
app3(cst("CliffordMap"), bvar(3), bvar(2), bvar(1)),
arrow(app2(cst("CliffordAlgebra"), bvar(4), bvar(3)), bvar(3)),
),
),
),
),
)
}
pub fn spin_group_ty() -> Expr {
pi(
BinderInfo::Default,
"V",
type0(),
arrow(app(cst("QuadraticForm"), bvar(0)), type0()),
)
}
pub fn hopf_algebra_ty() -> Expr {
arrow(type0(), prop())
}
pub fn comultiplication_ty() -> Expr {
pi(
BinderInfo::Default,
"H",
type0(),
arrow(
app(cst("HopfAlgebra"), bvar(0)),
arrow(bvar(1), app2(cst("TensorProduct"), bvar(2), bvar(2))),
),
)
}
pub fn counit_ty() -> Expr {
pi(
BinderInfo::Default,
"H",
type0(),
arrow(
app(cst("HopfAlgebra"), bvar(0)),
arrow(bvar(1), cst("BaseField")),
),
)
}
pub fn antipode_ty() -> Expr {
pi(
BinderInfo::Default,
"H",
type0(),
arrow(app(cst("HopfAlgebra"), bvar(0)), arrow(bvar(1), bvar(2))),
)
}
pub fn hopf_antipode_anti_hom_ty() -> Expr {
pi(
BinderInfo::Default,
"H",
type0(),
arrow(app(cst("HopfAlgebra"), bvar(0)), prop()),
)
}
pub fn hopf_antipode_involutive_ty() -> Expr {
pi(
BinderInfo::Default,
"H",
type0(),
arrow(app(cst("CommHopfAlgebra"), bvar(0)), prop()),
)
}
pub fn c_star_algebra_ty() -> Expr {
arrow(type0(), prop())
}
pub fn spectrum_ty() -> Expr {
pi(
BinderInfo::Default,
"A",
type0(),
arrow(app(cst("CStarAlgebra"), bvar(0)), arrow(bvar(1), type0())),
)
}
pub fn gelfand_naimark_ty() -> Expr {
pi(
BinderInfo::Default,
"A",
type0(),
arrow(app(cst("CommCStarAlgebra"), bvar(0)), prop()),
)
}
pub fn gns_construction_ty() -> Expr {
pi(
BinderInfo::Default,
"A",
type0(),
arrow(
app(cst("CStarAlgebra"), bvar(0)),
arrow(app(cst("State"), bvar(1)), type0()),
),
)
}
pub fn von_neumann_algebra_ty() -> Expr {
arrow(type0(), prop())
}
pub fn double_commutant_ty() -> Expr {
pi(
BinderInfo::Default,
"M",
type0(),
arrow(app(cst("VonNeumannAlgebra"), bvar(0)), prop()),
)
}
pub fn type_classification_vna_ty() -> Expr {
pi(
BinderInfo::Default,
"M",
type0(),
arrow(app(cst("VonNeumannAlgebra"), bvar(0)), cst("VNAType")),
)
}
pub fn lie_algebra_ty() -> Expr {
arrow(type0(), prop())
}
pub fn universal_enveloping_algebra_ty() -> Expr {
pi(
BinderInfo::Default,
"g",
type0(),
arrow(app(cst("LieAlgebra"), bvar(0)), type0()),
)
}
pub fn pbw_theorem_ty() -> Expr {
pi(
BinderInfo::Default,
"g",
type0(),
arrow(app(cst("LieAlgebra"), bvar(0)), prop()),
)
}
pub fn uea_universal_property_ty() -> Expr {
pi(
BinderInfo::Default,
"g",
type0(),
pi(
BinderInfo::Default,
"A",
type0(),
arrow(
app(cst("LieAlgebra"), bvar(1)),
arrow(
app(cst("IsAlgebra"), bvar(1)),
arrow(
app2(cst("LieAlgHom"), bvar(3), bvar(2)),
app2(cst("AlgHom"), app2(cst("UEA"), bvar(4), bvar(3)), bvar(2)),
),
),
),
),
)
}
pub fn weyl_algebra_ty() -> Expr {
arrow(nat_ty(), type0())
}
pub fn weyl_simple_ty() -> Expr {
pi(
BinderInfo::Default,
"n",
nat_ty(),
app(cst("IsSimpleAlgebra"), app(cst("WeylAlgebra"), bvar(0))),
)
}
pub fn ore_extension_ty() -> Expr {
arrow(type0(), arrow(type0(), type0()))
}
pub fn ore_condition_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
arrow(app(cst("IntegralDomain"), bvar(0)), prop()),
)
}
pub fn skew_polynomial_ring_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
arrow(arrow(bvar(0), bvar(1)), type0()),
)
}
pub fn morita_equivalent_ty() -> Expr {
arrow(type0(), arrow(type0(), prop()))
}
pub fn morita_context_ty() -> Expr {
arrow(type0(), arrow(type0(), type0()))
}
pub fn matrix_morita_equiv_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
pi(
BinderInfo::Default,
"n",
nat_ty(),
app2(
cst("MoritaEquivalent"),
bvar(1),
app2(cst("MatrixRing"), bvar(2), bvar(1)),
),
),
)
}
pub fn morita_invariant_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
pi(
BinderInfo::Default,
"S",
type0(),
arrow(app2(cst("MoritaEquivalent"), bvar(1), bvar(0)), prop()),
),
)
}
pub fn group_algebra_ty() -> Expr {
arrow(type0(), arrow(type0(), type0()))
}
pub fn group_representation_ty() -> Expr {
pi(
BinderInfo::Default,
"G",
type0(),
pi(
BinderInfo::Default,
"k",
type0(),
pi(
BinderInfo::Default,
"V",
type0(),
arrow(
app(cst("IsGroup"), bvar(2)),
arrow(
app(cst("IsField"), bvar(2)),
arrow(app2(cst("IsVectorSpace"), bvar(3), bvar(1)), prop()),
),
),
),
),
)
}
pub fn maschke_theorem_ty() -> Expr {
pi(
BinderInfo::Default,
"G",
type0(),
pi(
BinderInfo::Default,
"k",
type0(),
arrow(
app(cst("IsFiniteGroup"), bvar(1)),
arrow(app(cst("IsField"), bvar(1)), prop()),
),
),
)
}
pub fn character_theory_ty() -> Expr {
pi(
BinderInfo::Default,
"G",
type0(),
arrow(app(cst("IsFiniteGroup"), bvar(0)), type0()),
)
}
pub fn koszul_algebra_ty() -> Expr {
arrow(type0(), prop())
}
pub fn koszul_dual_ty() -> Expr {
arrow(type0(), type0())
}
pub fn associated_graded_algebra_ty() -> Expr {
pi(
BinderInfo::Default,
"A",
type0(),
arrow(app(cst("FilteredAlgebraStr"), bvar(0)), type0()),
)
}
pub fn graded_commutativity_ty() -> Expr {
pi(
BinderInfo::Default,
"A",
type0(),
arrow(app(cst("GradedAlgebraStr"), bvar(0)), prop()),
)
}
pub fn azumaya_algebra_ty() -> Expr {
arrow(type0(), type0())
}
pub fn brauer_group_ty() -> Expr {
arrow(type0(), type0())
}
pub fn central_simple_algebra_ty() -> Expr {
pi(
BinderInfo::Default,
"k",
type0(),
arrow(app(cst("IsField"), bvar(0)), type0()),
)
}
pub fn brauer_period_ty() -> Expr {
pi(
BinderInfo::Default,
"k",
type0(),
arrow(app(cst("IsField"), bvar(0)), nat_ty()),
)
}
pub fn dg_algebra_ty() -> Expr {
arrow(type0(), prop())
}
pub fn dg_algebra_morphism_ty() -> Expr {
pi(
BinderInfo::Default,
"A",
type0(),
pi(
BinderInfo::Default,
"B",
type0(),
arrow(
app(cst("DGAlgebra"), bvar(1)),
arrow(app(cst("DGAlgebra"), bvar(1)), type0()),
),
),
)
}
pub fn a_infinity_algebra_ty() -> Expr {
arrow(type0(), prop())
}
pub fn operad_ty() -> Expr {
arrow(type0(), prop())
}
pub fn operad_algebra_ty() -> Expr {
pi(
BinderInfo::Default,
"P",
type0(),
pi(
BinderInfo::Default,
"A",
type0(),
arrow(app(cst("Operad"), bvar(1)), type0()),
),
)
}
pub fn bar_construction_ty() -> Expr {
pi(
BinderInfo::Default,
"P",
type0(),
arrow(app(cst("Operad"), bvar(0)), type0()),
)
}
pub fn cobar_construction_ty() -> Expr {
pi(
BinderInfo::Default,
"C",
type0(),
arrow(app(cst("Cooperad"), bvar(0)), type0()),
)
}
pub fn enriched_category_ty() -> Expr {
arrow(type0(), arrow(type0(), prop()))
}
pub fn infinity_category_ty() -> Expr {
arrow(type0(), prop())
}
pub fn stable_infinity_category_ty() -> Expr {
arrow(type0(), prop())
}
pub fn symmetric_monoidal_infty_cat_ty() -> Expr {
arrow(type0(), prop())
}
pub fn e_infinity_algebra_ty() -> Expr {
pi(
BinderInfo::Default,
"C",
type0(),
pi(
BinderInfo::Default,
"A",
type0(),
arrow(app(cst("SymmetricMonoidalInftyCategory"), bvar(1)), prop()),
),
)
}
pub fn symplectic_form_ty() -> Expr {
pi(
BinderInfo::Default,
"V",
type0(),
arrow(app(cst("IsVectorSpace"), bvar(0)), prop()),
)
}
pub fn symplectic_module_ty() -> Expr {
arrow(type0(), prop())
}
pub fn symplectic_group_ty() -> Expr {
pi(
BinderInfo::Default,
"V",
type0(),
arrow(app(cst("SymplecticModule"), bvar(0)), type0()),
)
}
pub fn witt_group_ty() -> Expr {
arrow(type0(), type0())
}