use oxilean_kernel::{BinderInfo, Declaration, Environment, Expr, Level, Name};
use super::types::{
AInfAlgebra, AtiyahHirzebruchSS, ConvergenceCriteria, CotangentComplex, DAGTStructure,
DGAlgebra, DGCategory, DeformationFunctor, DerivedBlowup, DerivedCategory, DerivedFunctor,
DerivedIntersection, DerivedScheme, EInftyRing, ExactTriangle, FormalModuliProb,
FormalModuliProblem, HochschildComplexSS, KanFibration, LieAlgebraInfty, MaySpectralSequence,
ModuleSpectrum, NerveFunctor, ObstructionTheory, QuasiCategory, QuasiIsomorphism,
ShiftedSymplecticStructure, SimplicialObject, SpectralSchemeData, SpectralSequence,
SquareZeroExtension, StableInftyCategory, TStructure, TanakaDuality, TensorProduct,
VirtualFundamentalClass,
};
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 bvar(n: u32) -> Expr {
Expr::BVar(n)
}
pub fn nat_ty() -> Expr {
cst("Nat")
}
pub fn int_ty() -> Expr {
cst("Int")
}
pub fn bool_ty() -> Expr {
cst("Bool")
}
pub fn derived_category_ty() -> Expr {
type1()
}
pub fn t_structure_ty() -> Expr {
arrow(cst("DerivedCategory"), type0())
}
pub fn exact_triangle_ty() -> Expr {
arrow(cst("DerivedCategory"), type0())
}
pub fn derived_functor_ty() -> Expr {
arrow(
cst("DerivedCategory"),
arrow(cst("DerivedCategory"), type0()),
)
}
pub fn rotate_triangle_ty() -> Expr {
arrow(
app(cst("ExactTriangle"), cst("DerivedCategory")),
app(cst("ExactTriangle"), cst("DerivedCategory")),
)
}
pub fn octahedral_axiom_ty() -> Expr {
arrow(cst("DerivedCategory"), prop())
}
pub fn truncation_functor_ty() -> Expr {
arrow(
cst("TStructure"),
arrow(
int_ty(),
arrow(cst("DerivedCategory"), cst("DerivedCategory")),
),
)
}
pub fn dg_category_ty() -> Expr {
type1()
}
pub fn dg_algebra_ty() -> Expr {
type0()
}
pub fn a_inf_algebra_ty() -> Expr {
type0()
}
pub fn quasi_isomorphism_ty() -> Expr {
arrow(cst("DGAlgebra"), arrow(cst("DGAlgebra"), type0()))
}
pub fn formally_smooth_dga_ty() -> Expr {
arrow(cst("DGAlgebra"), prop())
}
pub fn koszul_dual_ty() -> Expr {
arrow(cst("DGAlgebra"), cst("DGAlgebra"))
}
pub fn dg_functor_ty() -> Expr {
arrow(cst("DGCategory"), arrow(cst("DGCategory"), type0()))
}
pub fn simplicial_object_ty() -> Expr {
arrow(type0(), type1())
}
pub fn nerve_functor_ty() -> Expr {
arrow(cst("Cat"), cst("SimplicialSet"))
}
pub fn kan_fibration_ty() -> Expr {
arrow(cst("SimplicialSet"), arrow(cst("SimplicialSet"), prop()))
}
pub fn quasi_category_ty() -> Expr {
arrow(cst("SimplicialSet"), prop())
}
pub fn face_map_ty() -> Expr {
arrow(
cst("SimplicialObject"),
arrow(nat_ty(), arrow(nat_ty(), type0())),
)
}
pub fn degeneracy_map_ty() -> Expr {
arrow(
cst("SimplicialObject"),
arrow(nat_ty(), arrow(nat_ty(), type0())),
)
}
pub fn derived_scheme_ty() -> Expr {
type1()
}
pub fn derived_stack_ty() -> Expr {
type1()
}
pub fn cotangent_complex_ty() -> Expr {
arrow(cst("DerivedScheme"), arrow(cst("DerivedScheme"), type0()))
}
pub fn obstruction_theory_ty() -> Expr {
arrow(cst("DerivedScheme"), type0())
}
pub fn virtual_fundamental_class_ty() -> Expr {
arrow(cst("ObstructionTheory"), type0())
}
pub fn perfect_obstruction_theory_ty() -> Expr {
arrow(cst("DerivedScheme"), prop())
}
pub fn spectral_sequence_ty() -> Expr {
type0()
}
pub fn spectral_page_ty() -> Expr {
arrow(
cst("SpectralSequence"),
arrow(nat_ty(), arrow(int_ty(), arrow(int_ty(), type0()))),
)
}
pub fn hochschild_complex_ss_ty() -> Expr {
type0()
}
pub fn atiyah_hirzebruch_ss_ty() -> Expr {
type0()
}
pub fn converges_to_ty() -> Expr {
arrow(cst("SpectralSequence"), arrow(type0(), prop()))
}
pub fn frobenius_reciprocity_ty() -> Expr {
arrow(cst("SpectralSequence"), prop())
}
pub fn e_infty_ring_ty() -> Expr {
type1()
}
pub fn module_spectrum_ty() -> Expr {
arrow(cst("EInftyRing"), type1())
}
pub fn derived_tensor_product_ty() -> Expr {
arrow(
cst("EInftyRing"),
arrow(
cst("ModuleSpectrum"),
arrow(cst("ModuleSpectrum"), cst("ModuleSpectrum")),
),
)
}
pub fn may_spectral_sequence_ty() -> Expr {
type0()
}
pub fn adams_spectral_sequence_ty() -> Expr {
arrow(cst("EInftyRing"), arrow(cst("EInftyRing"), type0()))
}
pub fn sphere_spectrum_ty() -> Expr {
cst("EInftyRing")
}
pub fn formal_moduli_problem_ty() -> Expr {
type1()
}
pub fn lie_algebra_infty_ty() -> Expr {
type0()
}
pub fn deformation_functor_ty() -> Expr {
arrow(cst("FormalModuliProblem"), arrow(cst("CommRing"), type0()))
}
pub fn tanaka_duality_ty() -> Expr {
arrow(
cst("LieAlgebraInfty"),
arrow(cst("FormalModuliProblem"), prop()),
)
}
pub fn maurer_cartan_space_ty() -> Expr {
arrow(cst("LieAlgebraInfty"), type0())
}
pub fn koszul_duality_fmp_ty() -> Expr {
arrow(
cst("FormalModuliProblem"),
arrow(cst("LieAlgebraInfty"), prop()),
)
}
pub fn build_derived_algebraic_geometry_env(env: &mut Environment) {
let base_types: &[(&str, Expr)] = &[
("DerivedCategory", type1()),
("TStructure", t_structure_ty()),
("ExactTriangle", exact_triangle_ty()),
("DerivedFunctor", derived_functor_ty()),
("DGCategory", type1()),
("DGAlgebra", type0()),
("AInfAlgebra", type0()),
("QuasiIsomorphism", quasi_isomorphism_ty()),
("SimplicialSet", type1()),
("SimplicialObject", arrow(type0(), type1())),
("Cat", type1()),
("DerivedScheme", type1()),
("DerivedStack", type1()),
("ObstructionTheory", arrow(cst("DerivedScheme"), type0())),
("SpectralSequence", type0()),
("EInftyRing", type1()),
("ModuleSpectrum", arrow(cst("EInftyRing"), type1())),
("FormalModuliProblem", type1()),
("LieAlgebraInfty", type0()),
("CommRing", type0()),
];
for (name, ty) in base_types {
env.add(Declaration::Axiom {
name: Name::str(*name),
univ_params: vec![],
ty: ty.clone(),
})
.ok();
}
let type_axioms: &[(&str, fn() -> Expr)] = &[
("derived_category", derived_category_ty),
("t_structure", t_structure_ty),
("exact_triangle", exact_triangle_ty),
("derived_functor", derived_functor_ty),
("rotate_triangle", rotate_triangle_ty),
("octahedral_axiom", octahedral_axiom_ty),
("truncation_functor", truncation_functor_ty),
("dg_category", dg_category_ty),
("dg_algebra", dg_algebra_ty),
("a_inf_algebra", a_inf_algebra_ty),
("quasi_isomorphism", quasi_isomorphism_ty),
("formally_smooth_dga", formally_smooth_dga_ty),
("koszul_dual", koszul_dual_ty),
("dg_functor", dg_functor_ty),
("simplicial_object", simplicial_object_ty),
("nerve_functor", nerve_functor_ty),
("kan_fibration", kan_fibration_ty),
("quasi_category", quasi_category_ty),
("face_map", face_map_ty),
("degeneracy_map", degeneracy_map_ty),
("derived_scheme", derived_scheme_ty),
("derived_stack", derived_stack_ty),
("cotangent_complex", cotangent_complex_ty),
("obstruction_theory", obstruction_theory_ty),
("virtual_fundamental_class", virtual_fundamental_class_ty),
("perfect_obstruction_theory", perfect_obstruction_theory_ty),
("spectral_sequence", spectral_sequence_ty),
("spectral_page", spectral_page_ty),
("hochschild_complex_ss", hochschild_complex_ss_ty),
("atiyah_hirzebruch_ss", atiyah_hirzebruch_ss_ty),
("converges_to", converges_to_ty),
("frobenius_reciprocity", frobenius_reciprocity_ty),
("e_infty_ring", e_infty_ring_ty),
("module_spectrum", module_spectrum_ty),
("derived_tensor_product", derived_tensor_product_ty),
("may_spectral_sequence", may_spectral_sequence_ty),
("adams_spectral_sequence", adams_spectral_sequence_ty),
("sphere_spectrum", sphere_spectrum_ty),
("formal_moduli_problem", formal_moduli_problem_ty),
("lie_algebra_infty", lie_algebra_infty_ty),
("deformation_functor", deformation_functor_ty),
("tanaka_duality", tanaka_duality_ty),
("maurer_cartan_space", maurer_cartan_space_ty),
("koszul_duality_fmp", koszul_duality_fmp_ty),
];
for (name, mk_ty) in type_axioms {
env.add(Declaration::Axiom {
name: Name::str(*name),
univ_params: vec![],
ty: mk_ty(),
})
.ok();
}
}
pub fn virtual_dimension(rank_t1: i32, rank_t2: i32) -> i32 {
rank_t1 - rank_t2
}
pub fn differential_bidegree(r: i32) -> (i32, i32) {
(r, 1 - r)
}
pub fn simplicial_face_identity(i: usize, j: usize) -> bool {
i <= j
}
pub fn a_inf_relation_terms(n: usize) -> usize {
n
}
#[cfg(test)]
mod tests {
use super::*;
use oxilean_kernel::{Environment, Name};
#[test]
fn test_build_derived_algebraic_geometry_env() {
let mut env = Environment::new();
build_derived_algebraic_geometry_env(&mut env);
assert!(env.get(&Name::str("DerivedCategory")).is_some());
assert!(env.get(&Name::str("DGAlgebra")).is_some());
assert!(env.get(&Name::str("SimplicialSet")).is_some());
assert!(env.get(&Name::str("EInftyRing")).is_some());
assert!(env.get(&Name::str("FormalModuliProblem")).is_some());
assert!(env.get(&Name::str("cotangent_complex")).is_some());
assert!(env.get(&Name::str("tanaka_duality")).is_some());
assert!(env.get(&Name::str("octahedral_axiom")).is_some());
assert!(env.get(&Name::str("quasi_category")).is_some());
assert!(env.get(&Name::str("virtual_fundamental_class")).is_some());
}
#[test]
fn test_exact_triangle_rotate() {
let t = ExactTriangle::new("A", "B", "C");
assert!(t.is_distinguished_triangle());
assert!(t.octahedral_axiom_holds());
let t2 = t.rotate();
assert_eq!(t2.vertex_a, "B");
assert_eq!(t2.vertex_b, "C");
assert_eq!(t2.vertex_c, "A[1]");
let t3 = t2.rotate();
assert_eq!(t3.vertex_a, "C");
assert_eq!(t3.vertex_b, "A[1]");
assert_eq!(t3.vertex_c, "B[1]");
}
#[test]
fn test_derived_category_display() {
let db = DerivedCategory::bounded("Coh(X)");
assert!(db.is_bounded());
assert!(db.has_t_structure);
let s = format!("{}", db);
assert!(s.contains("bounded"));
let d = DerivedCategory::unbounded("Mod(R)");
assert!(!d.is_bounded());
let s2 = format!("{}", d);
assert!(s2.contains("unbounded"));
}
#[test]
fn test_dg_algebra_de_rham() {
let omega = DGAlgebra::de_rham("M");
assert_eq!(omega.grading, "cohomological");
assert!(omega.differential_squares_zero);
let s = format!("{}", omega);
assert!(s.contains("DGA"));
}
#[test]
fn test_a_inf_from_dga() {
let dga = DGAlgebra::cohomological("A", "k");
let ainf = AInfAlgebra::from_dga(&dga);
assert_eq!(ainf.max_composition_order, 2);
assert!(ainf.relations_verified);
let s = format!("{}", ainf);
assert!(s.contains("A∞"));
}
#[test]
fn test_spectral_sequence_serre() {
let ss = SpectralSequence::serre("F", "E", "B");
assert_eq!(ss.start_page, 2);
assert_eq!(ss.differential_bidegree, (2, -1));
assert_eq!(ss.convergence, ConvergenceCriteria::Strong);
let s = format!("{}", ss);
assert!(s.contains("SS"));
}
#[test]
fn test_hochschild_serre_e2() {
let hs = HochschildComplexSS::new("N", "G", "Q", "M");
let e2 = hs.e2_page();
assert!(e2.contains("H^p"));
let s = format!("{}", hs);
assert!(s.contains("HS-SS"));
}
#[test]
fn test_atiyah_hirzebruch_e2() {
let ahss = AtiyahHirzebruchSS::new("X", "KU");
let e2 = ahss.e2_page();
assert!(e2.contains("KU"));
let s = format!("{}", ahss);
assert!(s.contains("AHSS"));
}
#[test]
fn test_e_infty_ring_sphere() {
let s = EInftyRing::sphere();
assert!(s.is_sphere_spectrum);
let disp = format!("{}", s);
assert!(disp.contains("sphere"));
let hq = EInftyRing::eilenberg_maclane("ℚ");
assert!(!hq.is_sphere_spectrum);
}
#[test]
fn test_module_spectrum_display() {
let r = EInftyRing::new("R");
let m = ModuleSpectrum::new("M", &r);
let s = format!("{}", m);
assert!(s.contains("R"));
assert!(s.contains("M"));
}
#[test]
fn test_tanaka_duality() {
let lie = LieAlgebraInfty::dg_lie("g");
let fmp = FormalModuliProblem::new("Def_G", "G-torsors").with_tangent_lie("g");
let td = TanakaDuality::new(lie, fmp);
assert!(td.verify_equivalence());
let s = format!("{}", td);
assert!(s.contains("Tanaka"));
}
#[test]
fn test_deformation_functor() {
let def = DeformationFunctor::new("X", "T_X[-1]");
let desc = def.deformations_over("k[ε]/ε²");
assert!(desc.contains("Def_X"));
let s = format!("{}", def);
assert!(s.contains("Def_X"));
}
#[test]
fn test_quasi_category() {
let qc = QuasiCategory::new("C");
assert!(qc.inner_horns_fill);
assert!(!qc.is_kan_complex(false));
assert!(qc.is_kan_complex(true));
}
#[test]
fn test_simplicial_object_level() {
let so: SimplicialObject<u32> = SimplicialObject::new(vec![1, 2, 3, 4]);
assert_eq!(so.level(0), Some(&1));
assert_eq!(so.level(3), Some(&4));
assert_eq!(so.level(4), None);
}
#[test]
fn test_cotangent_complex() {
let lxy = CotangentComplex::new("X", "Y");
assert!(!lxy.is_formally_smooth());
let s = format!("{}", lxy);
assert!(s.contains("L_"));
}
#[test]
fn test_virtual_fundamental_class() {
let vfc = VirtualFundamentalClass::new("M", 3);
assert_eq!(vfc.virtual_dim, 3);
let s = format!("{}", vfc);
assert!(s.contains("[M]^vir"));
}
#[test]
fn test_virtual_dimension() {
assert_eq!(virtual_dimension(5, 3), 2);
assert_eq!(virtual_dimension(0, 0), 0);
}
#[test]
fn test_differential_bidegree() {
assert_eq!(differential_bidegree(2), (2, -1));
assert_eq!(differential_bidegree(3), (3, -2));
assert_eq!(differential_bidegree(1), (1, 0));
}
#[test]
fn test_may_spectral_sequence() {
let may = MaySpectralSequence::at_prime(2);
let e2 = may.e2_description();
assert!(e2.contains("E_2"));
let s = format!("{}", may);
assert!(s.contains("p=2"));
}
#[test]
fn test_convergence_display() {
assert_eq!(format!("{}", ConvergenceCriteria::Weak), "weakly converges");
assert_eq!(
format!("{}", ConvergenceCriteria::Strong),
"strongly converges"
);
assert_eq!(
format!("{}", ConvergenceCriteria::Conditional),
"conditionally converges"
);
}
#[test]
fn test_derived_scheme_affine() {
let x = DerivedScheme::affine("A");
assert!(x.is_affine);
assert!(x.classical().contains("H^0"));
let s = format!("{}", x);
assert!(s.contains("DerivedScheme"));
}
#[test]
fn test_nerve_functor() {
let n = NerveFunctor::of("C");
let desc = n.n_simplices_description(2);
assert!(desc.contains("2-tuple"));
let s = format!("{}", n);
assert!(s.contains("N(C)"));
}
#[test]
fn test_kan_fibration() {
let fib = KanFibration::new("E", "B");
assert!(fib.is_kan);
let s = format!("{}", fib);
assert!(s.contains("KanFib"));
}
#[test]
fn test_t_structure_heart() {
let ts = TStructure::standard("D^b(Coh(X))");
let h = ts.heart_description();
assert!(h.contains("Heart"));
let s = format!("{}", ts);
assert!(s.contains("t-structure"));
}
#[test]
fn test_derived_functor_display() {
let lf = DerivedFunctor::left("F", "D(A)", "D(B)");
assert!(lf.is_left);
assert!(lf.name.starts_with('L'));
let s = format!("{}", lf);
assert!(s.contains("left"));
let rf = DerivedFunctor::right("G", "D(A)", "D(B)");
assert!(!rf.is_left);
let s2 = format!("{}", rf);
assert!(s2.contains("right"));
}
#[test]
fn test_dg_category() {
let dgcat = DGCategory::dg_modules("A");
assert!(dgcat.is_pre_triangulated);
let s = format!("{}", dgcat);
assert!(s.contains("dgCat"));
}
#[test]
fn test_quasi_isomorphism() {
let qis = QuasiIsomorphism::new("A", "B");
assert!(qis.cohomology_iso_desc.contains('≅'));
let s = format!("{}", qis);
assert!(s.contains("qis"));
}
#[test]
fn test_obstruction_theory() {
let ot = ObstructionTheory::new("M", "T^1", "T^2", 3);
assert_eq!(ot.virtual_dim, 3);
let s = format!("{}", ot);
assert!(s.contains("ObstrThy"));
}
#[test]
fn test_formal_moduli_problem() {
let fmp = FormalModuliProblem::new("Def_A", "A∞-algebras").with_tangent_lie("L");
assert!(fmp.tangent_lie.is_some());
let s = format!("{}", fmp);
assert!(s.contains("FMP"));
}
#[test]
fn test_lie_algebra_infty() {
let l = LieAlgebraInfty::new("L");
let mc = l.maurer_cartan_description();
assert!(mc.contains("MC"));
let s = format!("{}", l);
assert!(s.contains("L∞"));
}
#[test]
fn test_tensor_product() {
let tp = TensorProduct::new("M", "N", "R");
let s = format!("{}", tp);
assert!(s.contains("⊗"));
}
#[test]
fn test_a_inf_relation_terms() {
assert_eq!(a_inf_relation_terms(3), 3);
}
#[test]
fn test_simplicial_face_identity() {
assert!(simplicial_face_identity(0, 1));
assert!(simplicial_face_identity(2, 2));
assert!(!simplicial_face_identity(3, 1));
}
}
#[cfg(test)]
mod tests_dag_ext {
use super::*;
#[test]
fn test_stable_infty_category() {
let sp = StableInftyCategory::spectra();
assert!(sp.is_stable);
assert!(sp.fiber_cofiber_sequence_coincide());
let oct = sp.octahedral_axiom();
assert!(oct.contains("stable"));
let dc = StableInftyCategory::derived_category("Z");
assert!(dc.triangulated_structure);
}
#[test]
fn test_t_structure() {
let ts = DAGTStructure::standard("D(Ab)");
assert!(ts.is_abelian_heart());
let desc = ts.bbd_description();
assert!(desc.contains("Standard"));
let pts = DAGTStructure::perverse("D(X)", "middle");
let bdesc = pts.bbd_description();
assert!(bdesc.contains("perverse"));
}
#[test]
fn test_formal_moduli_problem() {
let fmp = FormalModuliProb::new("DefX", "TX[-1]", "TX[-2]").with_dg_lie("gX");
assert!(fmp.is_representable);
let desc = fmp.lurie_pridham_theorem();
assert!(desc.contains("Lurie-Pridham"));
}
#[test]
fn test_square_zero_extension() {
let sqz = SquareZeroExtension::new("A", "M");
let cotangent = sqz.cotangent_complex_description();
assert!(cotangent.contains("cotangent"));
let obs = sqz.obstruction_class();
assert!(obs.contains("Ext"));
}
#[test]
fn test_shifted_symplectic() {
let ss = ShiftedSymplecticStructure::new("Perf(X)", -2);
assert!(!ss.is_classical_symplectic());
let dt = ss.donaldson_thomas_connection();
assert!(dt.contains("DT"));
let ms = ShiftedSymplecticStructure::mapping_stack("T*[1]X", "BG", 2);
assert!(ms.stack_name.contains("Map"));
}
#[test]
fn test_derived_intersection() {
let di = DerivedIntersection::new("X", "L1", "L2", -1);
assert_eq!(di.virtual_dimension(), -1);
let bf = di.behrend_fantechi_obstruction_theory();
assert!(bf.contains("BF"));
}
#[test]
fn test_spectral_scheme() {
let ss = SpectralSchemeData::sphere_spectrum();
assert!(ss.e_infty_ring);
assert!(ss.is_affine);
let loc = ss.chromatic_localization(2, 1);
assert!(loc.contains("chromatic"));
let ref_str = ss.lurie_sag_reference();
assert!(ref_str.contains("Lurie"));
}
}
#[cfg(test)]
mod tests_dag_ext2 {
use super::*;
#[test]
fn test_derived_blowup() {
let db = DerivedBlowup::new("X", "Z");
assert!(db.rees_algebra_description().contains("Rees"));
assert_eq!(db.derived_correction, -1);
}
}