use oxilean_kernel::{BinderInfo, Declaration, Environment, Expr, Level, Name};
use super::types::{
AccessibleCategory, AssociativeOperad, CartesianFibration, CoCartesianFibration,
CommutativeOperad, CompactlyGenerated, ComputadData, EnAlgebra, EnrichedCategory,
EtaleMorphism, ExcisiveFunctor, FactorizationAlgebra, GlobularSetData,
GrothendieckConstruction, HomogeneousFunctor, HypercoverDescent, InfinityNCatData,
InfinityNCategory, InftyColimit, InftyFunctor, InftyLimit, InftyNaturalTransformation,
InftyOperad, InftyTopos, InnerHorn, KanExtension, LocalizationFunctor, MonoidalFunctor,
ObjectClassifier, OmegaCategory, OperadNew, OperadV2, PresentableInftyCategory, QuasiCategory,
QuasiCategoryNew, SegalSpaceData, StraighteningEquivalence, TaylorTower, TwoCategoryData,
};
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 type1() -> Expr {
Expr::Sort(Level::succ(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 add_axiom(
env: &mut Environment,
name: &str,
univ_params: Vec<Name>,
ty: Expr,
) -> Result<(), String> {
env.add(Declaration::Axiom {
name: Name::str(name),
univ_params,
ty,
})
.map_err(|e| format!("add_axiom({name}): {e:?}"))
}
pub fn quasi_category_ty() -> Expr {
type0()
}
pub fn inner_horn_ty() -> Expr {
arrow(
nat_ty(),
arrow(nat_ty(), arrow(cst("QuasiCategory"), type0())),
)
}
pub fn inner_horn_filler_ty() -> Expr {
arrow(
nat_ty(),
arrow(
nat_ty(),
arrow(
cst("QuasiCategory"),
arrow(app3(cst("InnerHorn"), bvar(2), bvar(1), bvar(0)), type0()),
),
),
)
}
pub fn infty_functor_ty() -> Expr {
arrow(cst("QuasiCategory"), arrow(cst("QuasiCategory"), type0()))
}
pub fn infty_natural_transformation_ty() -> Expr {
impl_pi(
"C",
cst("QuasiCategory"),
impl_pi(
"D",
cst("QuasiCategory"),
arrow(
app2(cst("InftyFunctor"), bvar(1), bvar(0)),
arrow(app2(cst("InftyFunctor"), bvar(2), bvar(1)), type0()),
),
),
)
}
pub fn has_inner_horn_fillings_ty() -> Expr {
arrow(cst("QuasiCategory"), prop())
}
pub fn is_kan_complex_ty() -> Expr {
arrow(cst("QuasiCategory"), prop())
}
pub fn is_equivalence_ty() -> Expr {
impl_pi(
"C",
cst("QuasiCategory"),
impl_pi(
"D",
cst("QuasiCategory"),
arrow(app2(cst("InftyFunctor"), bvar(1), bvar(0)), prop()),
),
)
}
pub fn infty_limit_ty() -> Expr {
impl_pi(
"C",
cst("QuasiCategory"),
impl_pi(
"D",
cst("QuasiCategory"),
arrow(app2(cst("InftyFunctor"), bvar(1), bvar(0)), type0()),
),
)
}
pub fn infty_colimit_ty() -> Expr {
impl_pi(
"C",
cst("QuasiCategory"),
impl_pi(
"D",
cst("QuasiCategory"),
arrow(app2(cst("InftyFunctor"), bvar(1), bvar(0)), type0()),
),
)
}
pub fn infty_adjunction_ty() -> Expr {
impl_pi(
"C",
cst("QuasiCategory"),
impl_pi(
"D",
cst("QuasiCategory"),
arrow(
app2(cst("InftyFunctor"), bvar(1), bvar(0)),
arrow(app2(cst("InftyFunctor"), bvar(1), bvar(2)), prop()),
),
),
)
}
pub fn kan_extension_ty() -> Expr {
impl_pi(
"C",
cst("QuasiCategory"),
impl_pi(
"D",
cst("QuasiCategory"),
impl_pi(
"E",
cst("QuasiCategory"),
arrow(
app2(cst("InftyFunctor"), bvar(2), bvar(1)),
arrow(app2(cst("InftyFunctor"), bvar(3), bvar(1)), type0()),
),
),
),
)
}
pub fn presentable_infty_category_ty() -> Expr {
type0()
}
pub fn accessible_category_ty() -> Expr {
arrow(nat_ty(), arrow(cst("QuasiCategory"), prop()))
}
pub fn localization_functor_ty() -> Expr {
impl_pi(
"C",
cst("QuasiCategory"),
arrow(type0(), app2(cst("InftyFunctor"), bvar(0), bvar(0))),
)
}
pub fn compactly_generated_ty() -> Expr {
arrow(cst("QuasiCategory"), prop())
}
pub fn infty_topos_ty() -> Expr {
type0()
}
pub fn object_classifier_ty() -> Expr {
arrow(cst("InftyTopos"), type0())
}
pub fn etale_morphism_ty() -> Expr {
impl_pi(
"T",
cst("InftyTopos"),
arrow(type0(), arrow(type0(), prop())),
)
}
pub fn hypercover_descent_ty() -> Expr {
arrow(cst("InftyTopos"), prop())
}
pub fn cartesian_fibration_ty() -> Expr {
impl_pi(
"S",
cst("QuasiCategory"),
impl_pi(
"T",
cst("QuasiCategory"),
arrow(app2(cst("InftyFunctor"), bvar(1), bvar(0)), prop()),
),
)
}
pub fn cocartesian_fibration_ty() -> Expr {
impl_pi(
"S",
cst("QuasiCategory"),
impl_pi(
"T",
cst("QuasiCategory"),
arrow(app2(cst("InftyFunctor"), bvar(1), bvar(0)), prop()),
),
)
}
pub fn straightening_equivalence_ty() -> Expr {
impl_pi("S", cst("QuasiCategory"), prop())
}
pub fn grothendieck_construction_ty() -> Expr {
impl_pi(
"S",
cst("QuasiCategory"),
arrow(
app2(cst("InftyFunctor"), bvar(0), cst("InftyCat")),
cst("QuasiCategory"),
),
)
}
pub fn infty_operad_ty() -> Expr {
type0()
}
pub fn associative_operad_ty() -> Expr {
cst("InftyOperad")
}
pub fn commutative_operad_ty() -> Expr {
cst("InftyOperad")
}
pub fn en_algebra_ty() -> Expr {
arrow(nat_ty(), arrow(cst("InftyOperad"), arrow(type0(), type0())))
}
pub fn excisive_functor_ty() -> Expr {
arrow(
nat_ty(),
arrow(arrow(cst("QuasiCategory"), cst("QuasiCategory")), prop()),
)
}
pub fn taylor_tower_ty() -> Expr {
arrow(
arrow(cst("QuasiCategory"), cst("QuasiCategory")),
arrow(nat_ty(), arrow(cst("QuasiCategory"), cst("QuasiCategory"))),
)
}
pub fn homogeneous_functor_ty() -> Expr {
arrow(
nat_ty(),
arrow(arrow(cst("QuasiCategory"), cst("QuasiCategory")), prop()),
)
}
pub fn spanier_whitehead_ty() -> Expr {
arrow(cst("QuasiCategory"), prop())
}
pub fn build_env(env: &mut Environment) -> Result<(), String> {
add_axiom(env, "QuasiCategory", vec![], quasi_category_ty())?;
add_axiom(env, "InnerHorn", vec![], inner_horn_ty())?;
add_axiom(env, "InnerHornFiller", vec![], inner_horn_filler_ty())?;
add_axiom(env, "InftyFunctor", vec![], infty_functor_ty())?;
add_axiom(
env,
"InftyNaturalTransformation",
vec![],
infty_natural_transformation_ty(),
)?;
add_axiom(
env,
"HasInnerHornFillings",
vec![],
has_inner_horn_fillings_ty(),
)?;
add_axiom(env, "IsKanComplex", vec![], is_kan_complex_ty())?;
add_axiom(env, "IsEquivalence", vec![], is_equivalence_ty())?;
add_axiom(env, "InftyLimit", vec![], infty_limit_ty())?;
add_axiom(env, "InftyColimit", vec![], infty_colimit_ty())?;
add_axiom(env, "InftyAdjunction", vec![], infty_adjunction_ty())?;
add_axiom(env, "KanExtension", vec![], kan_extension_ty())?;
add_axiom(
env,
"PresentableInftyCategory",
vec![],
presentable_infty_category_ty(),
)?;
add_axiom(env, "AccessibleCategory", vec![], accessible_category_ty())?;
add_axiom(
env,
"LocalizationFunctor",
vec![],
localization_functor_ty(),
)?;
add_axiom(env, "CompactlyGenerated", vec![], compactly_generated_ty())?;
add_axiom(env, "InftyTopos", vec![], infty_topos_ty())?;
add_axiom(env, "ObjectClassifier", vec![], object_classifier_ty())?;
add_axiom(env, "EtaleMorphism", vec![], etale_morphism_ty())?;
add_axiom(env, "HypercoverDescent", vec![], hypercover_descent_ty())?;
add_axiom(env, "CartesianFibration", vec![], cartesian_fibration_ty())?;
add_axiom(
env,
"CoCartesianFibration",
vec![],
cocartesian_fibration_ty(),
)?;
add_axiom(
env,
"StraighteningEquivalence",
vec![],
straightening_equivalence_ty(),
)?;
add_axiom(env, "InftyCat", vec![], type1())?;
add_axiom(
env,
"GrothendieckConstruction",
vec![],
grothendieck_construction_ty(),
)?;
add_axiom(env, "InftyOperad", vec![], infty_operad_ty())?;
add_axiom(env, "AssociativeOperad", vec![], associative_operad_ty())?;
add_axiom(env, "CommutativeOperad", vec![], commutative_operad_ty())?;
add_axiom(env, "EnAlgebra", vec![], en_algebra_ty())?;
add_axiom(env, "ExcisiveFunctor", vec![], excisive_functor_ty())?;
add_axiom(env, "TaylorTower", vec![], taylor_tower_ty())?;
add_axiom(env, "HomogeneousFunctor", vec![], homogeneous_functor_ty())?;
add_axiom(
env,
"SpanierWhiteheadDuality",
vec![],
spanier_whitehead_ty(),
)?;
Ok(())
}
pub fn build_env_all(env: &mut Environment) -> Result<(), String> {
build_env(env)?;
build_env_extended(env)?;
Ok(())
}
pub fn infinity_n_cat_ty() -> Expr {
arrow(nat_ty(), type0())
}
pub fn segal_space_ty() -> Expr {
type0()
}
pub fn segal_condition_ty() -> Expr {
arrow(cst("SegalSpace"), prop())
}
pub fn complete_segal_space_ty() -> Expr {
type0()
}
pub fn completeness_condition_ty() -> Expr {
arrow(cst("SegalSpace"), prop())
}
pub fn rezk_completion_ty() -> Expr {
arrow(cst("SegalSpace"), cst("CompleteSegalSpace"))
}
pub fn globular_set_ty() -> Expr {
type0()
}
pub fn globular_cell_ty() -> Expr {
arrow(cst("GlobularSet"), arrow(nat_ty(), type0()))
}
pub fn theta_n_category_ty() -> Expr {
arrow(nat_ty(), type0())
}
pub fn theta_n_functor_ty() -> Expr {
impl_pi(
"n",
nat_ty(),
arrow(
app(cst("ThetaNCategory"), bvar(0)),
arrow(app(cst("ThetaNCategory"), bvar(1)), type0()),
),
)
}
pub fn globular_composition_ty() -> Expr {
arrow(cst("GlobularSet"), prop())
}
pub fn two_category_ty() -> Expr {
type0()
}
pub fn two_category_functor_ty() -> Expr {
arrow(cst("TwoCategory"), arrow(cst("TwoCategory"), type0()))
}
pub fn gray_tensor_product_ty() -> Expr {
arrow(
cst("TwoCategory"),
arrow(cst("TwoCategory"), cst("TwoCategory")),
)
}
pub fn pseudo_functor_ty() -> Expr {
arrow(cst("TwoCategory"), arrow(cst("TwoCategory"), type0()))
}
pub fn tricategory_ty() -> Expr {
type0()
}
pub fn tricategory_coherence_ty() -> Expr {
arrow(cst("Tricategory"), prop())
}
pub fn oriental_ty() -> Expr {
arrow(nat_ty(), type0())
}
pub fn globular_complex_ty() -> Expr {
type0()
}
pub fn computad_ty() -> Expr {
type0()
}
pub fn polygraph_ty() -> Expr {
type0()
}
pub fn free_omega_category_ty() -> Expr {
arrow(cst("Computad"), type0())
}
pub fn pasting_diagram_ty() -> Expr {
arrow(nat_ty(), arrow(cst("GlobularSet"), type0()))
}
pub fn bilimit_ty() -> Expr {
impl_pi(
"C",
cst("TwoCategory"),
impl_pi(
"D",
cst("TwoCategory"),
arrow(app2(cst("TwoCategoryFunctor"), bvar(1), bvar(0)), type0()),
),
)
}
pub fn pseudolimit_ty() -> Expr {
impl_pi(
"C",
cst("TwoCategory"),
impl_pi(
"D",
cst("TwoCategory"),
arrow(app2(cst("TwoCategoryFunctor"), bvar(1), bvar(0)), type0()),
),
)
}
pub fn strict_2_limit_ty() -> Expr {
impl_pi(
"C",
cst("TwoCategory"),
impl_pi(
"D",
cst("TwoCategory"),
arrow(app2(cst("TwoCategoryFunctor"), bvar(1), bvar(0)), type0()),
),
)
}
pub fn bicolimit_ty() -> Expr {
impl_pi(
"C",
cst("TwoCategory"),
impl_pi(
"D",
cst("TwoCategory"),
arrow(app2(cst("TwoCategoryFunctor"), bvar(1), bvar(0)), type0()),
),
)
}
pub fn enriched_category_ty() -> Expr {
arrow(cst("TwoCategory"), type0())
}
pub fn enriched_functor_ty() -> Expr {
impl_pi(
"V",
cst("TwoCategory"),
arrow(
app(cst("EnrichedCategory"), bvar(0)),
arrow(app(cst("EnrichedCategory"), bvar(1)), type0()),
),
)
}
pub fn lax_natural_transformation_ty() -> Expr {
impl_pi(
"C",
cst("TwoCategory"),
impl_pi(
"D",
cst("TwoCategory"),
arrow(
app2(cst("PseudoFunctor"), bvar(1), bvar(0)),
arrow(app2(cst("PseudoFunctor"), bvar(2), bvar(1)), type0()),
),
),
)
}
pub fn modification_ty() -> Expr {
impl_pi(
"C",
cst("TwoCategory"),
impl_pi(
"D",
cst("TwoCategory"),
arrow(
app2(cst("PseudoFunctor"), bvar(1), bvar(0)),
arrow(
app2(cst("PseudoFunctor"), bvar(2), bvar(1)),
arrow(
app2(cst("LaxNaturalTransformation"), bvar(1), bvar(0)),
arrow(
app2(cst("LaxNaturalTransformation"), bvar(2), bvar(1)),
type0(),
),
),
),
),
),
)
}
pub fn oplax_natural_transformation_ty() -> Expr {
impl_pi(
"C",
cst("TwoCategory"),
impl_pi(
"D",
cst("TwoCategory"),
arrow(
app2(cst("PseudoFunctor"), bvar(1), bvar(0)),
arrow(app2(cst("PseudoFunctor"), bvar(2), bvar(1)), type0()),
),
),
)
}
pub fn strict_omega_category_ty() -> Expr {
type0()
}
pub fn weak_omega_category_ty() -> Expr {
type0()
}
pub fn batanin_operad_ty() -> Expr {
type0()
}
pub fn batanin_algebra_ty() -> Expr {
arrow(cst("BataninOperad"), arrow(cst("GlobularSet"), prop()))
}
pub fn contractible_globular_collection_ty() -> Expr {
arrow(cst("GlobularSet"), prop())
}
pub fn tamsamani_weak_n_cat_ty() -> Expr {
arrow(nat_ty(), type0())
}
pub fn simpson_conjecture_ty() -> Expr {
prop()
}
pub fn nerve_functor_ty() -> Expr {
arrow(cst("StrictOmegaCategory"), cst("SegalSpace"))
}
pub fn omega_category_equivalence_ty() -> Expr {
arrow(
cst("StrictOmegaCategory"),
arrow(cst("StrictOmegaCategory"), prop()),
)
}
pub fn formal_category_theory_ty() -> Expr {
arrow(cst("TwoCategory"), prop())
}
pub fn build_env_extended(env: &mut Environment) -> Result<(), String> {
add_axiom(env, "InfinityNCat", vec![], infinity_n_cat_ty())?;
add_axiom(env, "SegalSpace", vec![], segal_space_ty())?;
add_axiom(env, "SegalCondition", vec![], segal_condition_ty())?;
add_axiom(env, "CompleteSegalSpace", vec![], complete_segal_space_ty())?;
add_axiom(
env,
"CompletenessCondition",
vec![],
completeness_condition_ty(),
)?;
add_axiom(env, "RezkCompletion", vec![], rezk_completion_ty())?;
add_axiom(env, "GlobularSet", vec![], globular_set_ty())?;
add_axiom(env, "GlobularCell", vec![], globular_cell_ty())?;
add_axiom(env, "ThetaNCategory", vec![], theta_n_category_ty())?;
add_axiom(env, "ThetaNFunctor", vec![], theta_n_functor_ty())?;
add_axiom(
env,
"GlobularComposition",
vec![],
globular_composition_ty(),
)?;
add_axiom(env, "TwoCategory", vec![], two_category_ty())?;
add_axiom(env, "TwoCategoryFunctor", vec![], two_category_functor_ty())?;
add_axiom(env, "GrayTensorProduct", vec![], gray_tensor_product_ty())?;
add_axiom(env, "PseudoFunctor", vec![], pseudo_functor_ty())?;
add_axiom(env, "Tricategory", vec![], tricategory_ty())?;
add_axiom(
env,
"TricategoryCoherence",
vec![],
tricategory_coherence_ty(),
)?;
add_axiom(env, "Oriental", vec![], oriental_ty())?;
add_axiom(env, "GlobularComplex", vec![], globular_complex_ty())?;
add_axiom(env, "Computad", vec![], computad_ty())?;
add_axiom(env, "Polygraph", vec![], polygraph_ty())?;
add_axiom(env, "FreeOmegaCategory", vec![], free_omega_category_ty())?;
add_axiom(env, "PastingDiagram", vec![], pasting_diagram_ty())?;
add_axiom(env, "Bilimit", vec![], bilimit_ty())?;
add_axiom(env, "Pseudolimit", vec![], pseudolimit_ty())?;
add_axiom(env, "Strict2Limit", vec![], strict_2_limit_ty())?;
add_axiom(env, "Bicolimit", vec![], bicolimit_ty())?;
add_axiom(env, "EnrichedCategory", vec![], enriched_category_ty())?;
add_axiom(env, "EnrichedFunctor", vec![], enriched_functor_ty())?;
add_axiom(
env,
"LaxNaturalTransformation",
vec![],
lax_natural_transformation_ty(),
)?;
add_axiom(env, "Modification", vec![], modification_ty())?;
add_axiom(
env,
"OplaxNaturalTransformation",
vec![],
oplax_natural_transformation_ty(),
)?;
add_axiom(
env,
"StrictOmegaCategory",
vec![],
strict_omega_category_ty(),
)?;
add_axiom(env, "WeakOmegaCategory", vec![], weak_omega_category_ty())?;
add_axiom(env, "BataninOperad", vec![], batanin_operad_ty())?;
add_axiom(env, "BataninAlgebra", vec![], batanin_algebra_ty())?;
add_axiom(
env,
"ContractibleGlobularCollection",
vec![],
contractible_globular_collection_ty(),
)?;
add_axiom(env, "TamsamaniWeakNCat", vec![], tamsamani_weak_n_cat_ty())?;
add_axiom(env, "SimpsonConjecture", vec![], simpson_conjecture_ty())?;
add_axiom(env, "NerveFunctor", vec![], nerve_functor_ty())?;
add_axiom(
env,
"OmegaCategoryEquivalence",
vec![],
omega_category_equivalence_ty(),
)?;
add_axiom(
env,
"FormalCategoryTheory",
vec![],
formal_category_theory_ty(),
)?;
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
fn test_env() -> Environment {
let mut env = Environment::new();
build_env(&mut env).expect("build_env failed");
env
}
#[test]
fn test_quasi_category_registered() {
let env = test_env();
assert!(env.get(&Name::str("QuasiCategory")).is_some());
assert!(env.get(&Name::str("InnerHorn")).is_some());
assert!(env.get(&Name::str("InftyFunctor")).is_some());
}
#[test]
fn test_natural_transformation_registered() {
let env = test_env();
assert!(env.get(&Name::str("InftyNaturalTransformation")).is_some());
assert!(env.get(&Name::str("HasInnerHornFillings")).is_some());
assert!(env.get(&Name::str("IsKanComplex")).is_some());
assert!(env.get(&Name::str("IsEquivalence")).is_some());
}
#[test]
fn test_limits_colimits_registered() {
let env = test_env();
assert!(env.get(&Name::str("InftyLimit")).is_some());
assert!(env.get(&Name::str("InftyColimit")).is_some());
assert!(env.get(&Name::str("InftyAdjunction")).is_some());
assert!(env.get(&Name::str("KanExtension")).is_some());
}
#[test]
fn test_presentable_registered() {
let env = test_env();
assert!(env.get(&Name::str("PresentableInftyCategory")).is_some());
assert!(env.get(&Name::str("AccessibleCategory")).is_some());
assert!(env.get(&Name::str("LocalizationFunctor")).is_some());
assert!(env.get(&Name::str("CompactlyGenerated")).is_some());
}
#[test]
fn test_topos_registered() {
let env = test_env();
assert!(env.get(&Name::str("InftyTopos")).is_some());
assert!(env.get(&Name::str("ObjectClassifier")).is_some());
assert!(env.get(&Name::str("EtaleMorphism")).is_some());
assert!(env.get(&Name::str("HypercoverDescent")).is_some());
}
#[test]
fn test_fibrations_registered() {
let env = test_env();
assert!(env.get(&Name::str("CartesianFibration")).is_some());
assert!(env.get(&Name::str("CoCartesianFibration")).is_some());
assert!(env.get(&Name::str("StraighteningEquivalence")).is_some());
assert!(env.get(&Name::str("GrothendieckConstruction")).is_some());
}
#[test]
fn test_operads_registered() {
let env = test_env();
assert!(env.get(&Name::str("InftyOperad")).is_some());
assert!(env.get(&Name::str("AssociativeOperad")).is_some());
assert!(env.get(&Name::str("CommutativeOperad")).is_some());
assert!(env.get(&Name::str("EnAlgebra")).is_some());
}
#[test]
fn test_goodwillie_registered() {
let env = test_env();
assert!(env.get(&Name::str("ExcisiveFunctor")).is_some());
assert!(env.get(&Name::str("TaylorTower")).is_some());
assert!(env.get(&Name::str("HomogeneousFunctor")).is_some());
assert!(env.get(&Name::str("SpanierWhiteheadDuality")).is_some());
}
#[test]
fn test_inner_horn_validity() {
let h = InnerHorn::new(3, 1);
assert!(h.is_valid());
assert_eq!(h.present_faces, vec![0, 2, 3]);
}
#[test]
fn test_en_algebra() {
let a = EnAlgebra::new(3, "R");
assert!(a.is_at_least_e_m(2));
assert!(a.is_at_least_e_m(3));
assert!(!a.is_at_least_e_m(4));
}
#[test]
fn test_taylor_tower() {
let tower = TaylorTower {
approximations: vec![
ExcisiveFunctor {
degree: 0,
verified: true,
},
ExcisiveFunctor {
degree: 1,
verified: true,
},
ExcisiveFunctor {
degree: 2,
verified: true,
},
],
};
assert!(tower.converges_at(2));
assert!(tower.get(1).is_some_and(|f| f.is_n_excisive(1)));
}
#[test]
fn test_infty_functor_equivalence() {
let f = InftyFunctor {
obj_map: vec![0, 1, 2],
mor_map: vec![0, 1, 2],
};
assert!(f.is_equivalence());
let g = InftyFunctor {
obj_map: vec![0, 0, 1],
mor_map: vec![0, 1, 2],
};
assert!(!g.is_equivalence());
}
fn test_env_extended() -> Environment {
let mut env = Environment::new();
build_env_all(&mut env).expect("build_env_all failed");
env
}
#[test]
fn test_segal_spaces_registered() {
let env = test_env_extended();
assert!(env.get(&Name::str("SegalSpace")).is_some());
assert!(env.get(&Name::str("SegalCondition")).is_some());
assert!(env.get(&Name::str("CompleteSegalSpace")).is_some());
assert!(env.get(&Name::str("CompletenessCondition")).is_some());
assert!(env.get(&Name::str("RezkCompletion")).is_some());
}
#[test]
fn test_infinity_n_cat_registered() {
let env = test_env_extended();
assert!(env.get(&Name::str("InfinityNCat")).is_some());
}
#[test]
fn test_globular_registered() {
let env = test_env_extended();
assert!(env.get(&Name::str("GlobularSet")).is_some());
assert!(env.get(&Name::str("GlobularCell")).is_some());
assert!(env.get(&Name::str("ThetaNCategory")).is_some());
assert!(env.get(&Name::str("ThetaNFunctor")).is_some());
assert!(env.get(&Name::str("GlobularComposition")).is_some());
}
#[test]
fn test_two_category_registered() {
let env = test_env_extended();
assert!(env.get(&Name::str("TwoCategory")).is_some());
assert!(env.get(&Name::str("TwoCategoryFunctor")).is_some());
assert!(env.get(&Name::str("GrayTensorProduct")).is_some());
assert!(env.get(&Name::str("PseudoFunctor")).is_some());
assert!(env.get(&Name::str("Tricategory")).is_some());
assert!(env.get(&Name::str("TricategoryCoherence")).is_some());
}
#[test]
fn test_computads_registered() {
let env = test_env_extended();
assert!(env.get(&Name::str("Oriental")).is_some());
assert!(env.get(&Name::str("GlobularComplex")).is_some());
assert!(env.get(&Name::str("Computad")).is_some());
assert!(env.get(&Name::str("Polygraph")).is_some());
assert!(env.get(&Name::str("FreeOmegaCategory")).is_some());
assert!(env.get(&Name::str("PastingDiagram")).is_some());
}
#[test]
fn test_two_limits_registered() {
let env = test_env_extended();
assert!(env.get(&Name::str("Bilimit")).is_some());
assert!(env.get(&Name::str("Pseudolimit")).is_some());
assert!(env.get(&Name::str("Strict2Limit")).is_some());
assert!(env.get(&Name::str("Bicolimit")).is_some());
}
#[test]
fn test_enriched_lax_registered() {
let env = test_env_extended();
assert!(env.get(&Name::str("EnrichedCategory")).is_some());
assert!(env.get(&Name::str("EnrichedFunctor")).is_some());
assert!(env.get(&Name::str("LaxNaturalTransformation")).is_some());
assert!(env.get(&Name::str("Modification")).is_some());
assert!(env.get(&Name::str("OplaxNaturalTransformation")).is_some());
}
#[test]
fn test_omega_categories_registered() {
let env = test_env_extended();
assert!(env.get(&Name::str("StrictOmegaCategory")).is_some());
assert!(env.get(&Name::str("WeakOmegaCategory")).is_some());
assert!(env.get(&Name::str("BataninOperad")).is_some());
assert!(env.get(&Name::str("BataninAlgebra")).is_some());
assert!(env
.get(&Name::str("ContractibleGlobularCollection"))
.is_some());
assert!(env.get(&Name::str("TamsamaniWeakNCat")).is_some());
assert!(env.get(&Name::str("SimpsonConjecture")).is_some());
assert!(env.get(&Name::str("NerveFunctor")).is_some());
assert!(env.get(&Name::str("OmegaCategoryEquivalence")).is_some());
assert!(env.get(&Name::str("FormalCategoryTheory")).is_some());
}
#[test]
fn test_globular_set_data() {
let gs = GlobularSetData::new(vec![
vec!["x".into(), "y".into()],
vec!["f".into(), "g".into()],
vec!["alpha".into()],
]);
assert_eq!(gs.cell_count(0), 2);
assert_eq!(gs.cell_count(1), 2);
assert_eq!(gs.cell_count(2), 1);
assert!(gs.source(1, 0).is_some());
assert!(gs.target(1, 0).is_some());
assert!(gs.source(0, 0).is_none());
assert!(gs.satisfies_globularity());
}
#[test]
fn test_segal_space_data() {
let ss = SegalSpaceData::new(vec![
vec!["pt".into()],
vec!["pt".into()],
vec!["pt".into()],
]);
assert!(ss.check_segal_condition(2));
assert_eq!(ss.equivalences_count(), 1);
}
#[test]
fn test_two_category_data() {
let mut cat = TwoCategoryData::new();
let a = cat.add_object("A");
let b = cat.add_object("B");
let c = cat.add_object("C");
let f = cat.add_one_morphism(a, b, "f");
let g = cat.add_one_morphism(b, c, "g");
let _alpha = cat.add_two_morphism(f, f, "id_f");
assert_eq!(cat.objects.len(), 3);
assert_eq!(cat.one_morphisms.len(), 2);
assert_eq!(cat.two_morphisms.len(), 1);
assert!(cat.compose_1morph(f, g).is_some());
assert!(cat.compose_1morph(g, f).is_none());
}
#[test]
fn test_computad_data() {
let mut c = ComputadData::new();
let _x = c.add_generator(0, vec![], vec![], "x");
let _y = c.add_generator(0, vec![], vec![], "y");
let _f = c.add_generator(1, vec![0], vec![1], "f");
assert_eq!(c.generator_count(0), 2);
assert_eq!(c.generator_count(1), 1);
assert!(c.is_well_typed());
}
#[test]
fn test_infinity_n_cat_data() {
let ss = SegalSpaceData::new(vec![vec!["a".into(), "b".into()], vec!["f".into()]]);
let mut cat = InfinityNCatData::new(1, ss);
assert!(cat.is_quasi_category());
assert!(!cat.is_infinity_groupoid());
assert!(!cat.invertibility_verified);
cat.verify_invertibility();
assert!(cat.invertibility_verified);
}
#[test]
fn test_omega_category_nerve() {
let c = OmegaCategory::new(Some(2));
assert!(c.is_strict());
let nerve = c.street_roberts_nerve();
assert!(nerve.contains("2"));
let inf_c = OmegaCategory::new(None);
let inf_nerve = inf_c.street_roberts_nerve();
assert!(inf_nerve.contains("ω"));
}
}
#[cfg(test)]
mod tests_higher_cat_extended {
use super::*;
#[test]
fn test_infinity_n_category_basic() {
let cat = InfinityNCategory::new(1, "Spaces");
assert!(cat.is_infinity_one_category());
assert!(!cat.is_infinity_groupoid());
assert!(cat.is_cobordism_hypothesis_target());
}
#[test]
fn test_infinity_zero_is_groupoid() {
let cat = InfinityNCategory::new(0, "Groupoid");
assert!(cat.is_infinity_groupoid());
}
#[test]
fn test_truncation() {
let cat = InfinityNCategory::new(3, "3-category");
let trunc = cat.truncate_to(2);
assert_eq!(trunc.n, 2);
}
#[test]
fn test_operad_koszul() {
let lie = OperadNew::lie();
assert!(lie.is_koszul());
assert!(lie.koszul_dual.is_some());
}
#[test]
fn test_little_disks_operad() {
let e2 = OperadNew::little_disks(2);
assert_eq!(e2.name, "E_2");
}
#[test]
fn test_factorization_algebra_en() {
let mut fa = FactorizationAlgebra::new(3, "ChernSimons");
fa.is_locally_constant = true;
let desc = fa.corresponding_en_algebra();
assert!(desc.contains("E_3"));
}
#[test]
fn test_factorization_algebra_vertex() {
let mut fa = FactorizationAlgebra::new(1, "VirasAlgebra");
fa.is_holomorphic = true;
let va = fa.corresponding_vertex_algebra();
assert!(va.is_some());
}
#[test]
fn test_factorization_homology() {
let fa = FactorizationAlgebra::new(2, "E2-algebra");
let fh = fa.factorization_homology("Torus");
assert!(fh.contains("Torus"));
}
}
#[cfg(test)]
mod tests_hct_extra {
use super::*;
#[test]
fn test_enriched_category() {
let ab_cat = EnrichedCategory::ab_enriched("Mod_R");
assert!(ab_cat.is_preadditive());
assert!(ab_cat.is_symmetric);
}
#[test]
fn test_monoidal_functor() {
let f = MonoidalFunctor::strict("C", "D");
assert!(f.is_strict && f.is_lax && f.is_strong);
let g = MonoidalFunctor::new("C", "D");
assert!(!g.is_strict);
}
#[test]
fn test_operad() {
let assoc = OperadV2::assoc();
assert!(!assoc.is_symmetric);
let comm = OperadV2::comm();
assert!(comm.is_symmetric);
}
#[test]
fn test_quasi_category() {
let kan = QuasiCategoryNew::infinity_groupoid("Spaces");
assert!(kan.all_morphisms_invertible());
let nerve = QuasiCategoryNew::nerve_of_ordinary_cat("C");
assert!(!nerve.is_kan_complex);
}
}