use oxilean_kernel::{BinderInfo, Declaration, Environment, Expr, Level, Name};
use super::types::{
AnalyticSet, AnalyticSetData, BaireCategory, BorelHierarchy, BorelHierarchyChecker, BorelLevel,
DescriptiveTree, DeterminacyGameSolver, DetermincyStrength, EffectiveBorelSet, FiniteTopSpace,
ForcingPoset, InfiniteGame, LargeCardinal, LipschitzFunction, MartinsAxiom,
OrbitEquivalenceRelation, PerfectSet, PolishSpace, PolishSpaceExample, ProjectiveHierarchy,
ProjectiveLevel, ProjectiveLevelData, ProperForcingAxiom, ScottRank, UniversallyMeasurable,
WadgeDegree, WadgeDegreesComputer, WadgeHierarchy, WellfoundedRelation,
};
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 bool_ty() -> Expr {
cst("Bool")
}
pub fn real_ty() -> Expr {
cst("Real")
}
pub fn polish_space_ty() -> Expr {
arrow(type0(), prop())
}
pub fn borel_set_ty() -> Expr {
impl_pi("X", type0(), arrow(app(cst("Set"), bvar(0)), prop()))
}
pub fn sigma_class_ty() -> Expr {
impl_pi(
"X",
type0(),
arrow(cst("Ordinal"), arrow(app(cst("Set"), bvar(1)), prop())),
)
}
pub fn pi_class_ty() -> Expr {
impl_pi(
"X",
type0(),
arrow(cst("Ordinal"), arrow(app(cst("Set"), bvar(1)), prop())),
)
}
pub fn delta_class_ty() -> Expr {
impl_pi(
"X",
type0(),
arrow(cst("Ordinal"), arrow(app(cst("Set"), bvar(1)), prop())),
)
}
pub fn open_set_ty() -> Expr {
impl_pi("X", type0(), arrow(app(cst("Set"), bvar(0)), prop()))
}
pub fn closed_set_ty() -> Expr {
impl_pi("X", type0(), arrow(app(cst("Set"), bvar(0)), prop()))
}
pub fn f_sigma_set_ty() -> Expr {
impl_pi("X", type0(), arrow(app(cst("Set"), bvar(0)), prop()))
}
pub fn g_delta_set_ty() -> Expr {
impl_pi("X", type0(), arrow(app(cst("Set"), bvar(0)), prop()))
}
pub fn analytic_set_ty() -> Expr {
impl_pi("X", type0(), arrow(app(cst("Set"), bvar(0)), prop()))
}
pub fn coanalytic_set_ty() -> Expr {
impl_pi("X", type0(), arrow(app(cst("Set"), bvar(0)), prop()))
}
pub fn suslin_scheme_ty() -> Expr {
arrow(type0(), type0())
}
pub fn suslin_operation_ty() -> Expr {
impl_pi(
"X",
type0(),
arrow(app(cst("SuslinScheme"), bvar(0)), app(cst("Set"), bvar(1))),
)
}
pub fn projective_class_ty() -> Expr {
impl_pi(
"X",
type0(),
arrow(
nat_ty(),
arrow(nat_ty(), arrow(app(cst("Set"), bvar(2)), prop())),
),
)
}
pub fn sigma11_set_ty() -> Expr {
impl_pi("X", type0(), arrow(app(cst("Set"), bvar(0)), prop()))
}
pub fn pi11_set_ty() -> Expr {
impl_pi("X", type0(), arrow(app(cst("Set"), bvar(0)), prop()))
}
pub fn sigma12_set_ty() -> Expr {
impl_pi("X", type0(), arrow(app(cst("Set"), bvar(0)), prop()))
}
pub fn perfect_set_ty() -> Expr {
impl_pi("X", type0(), arrow(app(cst("Set"), bvar(0)), prop()))
}
pub fn scattered_set_ty() -> Expr {
impl_pi("X", type0(), arrow(app(cst("Set"), bvar(0)), prop()))
}
pub fn cb_rank_ty() -> Expr {
impl_pi("X", type0(), arrow(bvar(0), cst("Ordinal")))
}
pub fn cb_derivative_ty() -> Expr {
impl_pi(
"X",
type0(),
arrow(app(cst("Set"), bvar(0)), app(cst("Set"), bvar(1))),
)
}
pub fn cb_theorem_ty() -> Expr {
impl_pi(
"X",
type0(),
arrow(
app(cst("PolishSpace"), bvar(0)),
arrow(
app(cst("Set"), bvar(1)),
arrow(
app2(cst("ClosedSet"), bvar(2), bvar(0)),
app2(cst("CBDecomposition"), bvar(3), bvar(1)),
),
),
),
)
}
pub fn separable_space_ty() -> Expr {
arrow(type0(), prop())
}
pub fn complete_metric_space_ty() -> Expr {
arrow(type0(), prop())
}
pub fn baire_space_ty() -> Expr {
type0()
}
pub fn cantor_space_ty() -> Expr {
type0()
}
pub fn polish_embedding_ty() -> Expr {
impl_pi(
"X",
type0(),
arrow(
app(cst("PolishSpace"), bvar(0)),
arrow(bvar(1), arrow(cst("BaireSpace"), prop())),
),
)
}
pub fn zero_dimensional_ty() -> Expr {
arrow(type0(), prop())
}
pub fn luzin_separation_ty() -> Expr {
impl_pi(
"X",
type0(),
arrow(
app(cst("PolishSpace"), bvar(0)),
arrow(
app(cst("Set"), bvar(1)),
arrow(
app(cst("Set"), bvar(2)),
arrow(
app2(cst("AnalyticSet"), bvar(3), bvar(1)),
arrow(
app2(cst("AnalyticSet"), bvar(4), bvar(1)),
arrow(
app2(cst("Disjoint"), bvar(2), bvar(1)),
app3(cst("BorelSeparator"), bvar(5), bvar(3), bvar(2)),
),
),
),
),
),
),
)
}
pub fn suslin_theorem_ty() -> Expr {
impl_pi(
"X",
type0(),
arrow(
app(cst("PolishSpace"), bvar(0)),
arrow(
app(cst("Set"), bvar(1)),
app2(
cst("Iff"),
app2(cst("Delta11Set"), bvar(2), bvar(0)),
app2(cst("BorelSet"), bvar(3), bvar(0)),
),
),
),
)
}
pub fn suslin_representation_ty() -> Expr {
impl_pi(
"X",
type0(),
arrow(
app(cst("PolishSpace"), bvar(0)),
arrow(
app(cst("Set"), bvar(1)),
arrow(
app2(cst("AnalyticSet"), bvar(2), bvar(0)),
app2(cst("HasSuslinRepresentation"), bvar(3), bvar(1)),
),
),
),
)
}
pub fn game_tree_ty() -> Expr {
arrow(type0(), type0())
}
pub fn strategy_ty() -> Expr {
impl_pi("A", type0(), arrow(app(cst("GameTree"), bvar(0)), type0()))
}
pub fn winning_strategy_ty() -> Expr {
impl_pi(
"A",
type0(),
arrow(
app(cst("GameTree"), bvar(0)),
arrow(app2(cst("Strategy"), bvar(1), bvar(0)), prop()),
),
)
}
pub fn determined_ty() -> Expr {
arrow(app(cst("Set"), app(cst("GameTree"), nat_ty())), prop())
}
pub fn open_determinacy_ty() -> Expr {
arrow(
app2(cst("OpenSet"), app(cst("GameTree"), nat_ty()), bvar(0)),
app(cst("Determined"), bvar(0)),
)
}
pub fn borel_determinacy_ty() -> Expr {
arrow(
app2(cst("BorelSet"), app(cst("GameTree"), nat_ty()), bvar(0)),
app(cst("Determined"), bvar(0)),
)
}
pub fn analytic_determinacy_ty() -> Expr {
arrow(
app(cst("MeasurableCardinal"), cst("kappa")),
arrow(
app2(cst("AnalyticSet"), app(cst("GameTree"), nat_ty()), bvar(1)),
app(cst("Determined"), bvar(1)),
),
)
}
pub fn axiom_of_determinacy_ty() -> Expr {
prop()
}
pub fn projective_determinacy_ty() -> Expr {
prop()
}
pub fn measurable_cardinal_ty() -> Expr {
arrow(cst("Ordinal"), prop())
}
pub fn woodin_cardinal_ty() -> Expr {
arrow(cst("Ordinal"), prop())
}
pub fn strong_cardinal_ty() -> Expr {
arrow(cst("Ordinal"), prop())
}
pub fn measurable_implies_analytic_det_ty() -> Expr {
arrow(
app(cst("MeasurableCardinal"), cst("kappa")),
cst("AnalyticDeterminacy"),
)
}
pub fn woodin_implies_projective_det_ty() -> Expr {
arrow(
app(cst("OmegaManyWoodinCardinals"), cst("delta")),
cst("ProjectiveDeterminacy"),
)
}
pub fn universal_borel_set_ty() -> Expr {
impl_pi(
"X",
type0(),
arrow(
nat_ty(),
arrow(
app(cst("Set"), app2(cst("Prod"), nat_ty(), bvar(1))),
prop(),
),
),
)
}
pub fn complete_borel_set_ty() -> Expr {
impl_pi(
"X",
type0(),
arrow(nat_ty(), arrow(app(cst("Set"), bvar(1)), prop())),
)
}
pub fn borel_isomorphism_ty() -> Expr {
impl_pi(
"X",
type0(),
impl_pi("Y", type0(), arrow(arrow(bvar(1), bvar(1)), prop())),
)
}
pub fn standard_borel_space_ty() -> Expr {
arrow(type0(), prop())
}
pub fn pi11_norm_ty() -> Expr {
impl_pi(
"X",
type0(),
arrow(
app(cst("Set"), bvar(0)),
arrow(arrow(bvar(1), cst("Ordinal")), prop()),
),
)
}
pub fn pi12_set_ty() -> Expr {
impl_pi("X", type0(), arrow(app(cst("Set"), bvar(0)), prop()))
}
pub fn delta12_set_ty() -> Expr {
impl_pi("X", type0(), arrow(app(cst("Set"), bvar(0)), prop()))
}
pub fn pd_axiom_ty() -> Expr {
arrow(nat_ty(), prop())
}
pub fn wadge_degree_ty() -> Expr {
impl_pi("X", type0(), arrow(app(cst("Set"), bvar(0)), type0()))
}
pub fn wadge_lemma_ty() -> Expr {
impl_pi(
"X",
type0(),
arrow(
app(cst("Set"), bvar(0)),
arrow(app(cst("Set"), bvar(1)), prop()),
),
)
}
pub fn weihrauch_reducibility_ty() -> Expr {
impl_pi(
"A",
type0(),
impl_pi(
"B",
type0(),
arrow(
arrow(bvar(1), bvar(1)),
arrow(arrow(bvar(2), bvar(2)), prop()),
),
),
)
}
pub fn steel_wadge_ty() -> Expr {
prop()
}
pub fn orbit_equiv_relation_ty() -> Expr {
impl_pi(
"G",
type0(),
impl_pi(
"X",
type0(),
arrow(
arrow(bvar(1), arrow(bvar(1), bvar(1))),
arrow(app(cst("Set"), app2(cst("Prod"), bvar(2), bvar(2))), prop()),
),
),
)
}
pub fn borel_reducibility_ty() -> Expr {
impl_pi(
"X",
type0(),
impl_pi(
"Y",
type0(),
arrow(
app(cst("Set"), app2(cst("Prod"), bvar(1), bvar(1))),
arrow(app(cst("Set"), app2(cst("Prod"), bvar(2), bvar(2))), prop()),
),
),
)
}
pub fn hyperfinite_equiv_relation_ty() -> Expr {
impl_pi(
"X",
type0(),
arrow(app(cst("Set"), app2(cst("Prod"), bvar(0), bvar(0))), prop()),
)
}
pub fn borel_embedding_ty() -> Expr {
impl_pi(
"X",
type0(),
impl_pi("Y", type0(), arrow(arrow(bvar(1), bvar(1)), prop())),
)
}
pub fn lebesgue_measurable_ty() -> Expr {
arrow(app(cst("Set"), real_ty()), prop())
}
pub fn luzin_n_set_ty() -> Expr {
arrow(app(cst("Set"), real_ty()), prop())
}
pub fn uniformly_measurable_family_ty() -> Expr {
impl_pi(
"X",
type0(),
arrow(arrow(bvar(0), app(cst("Set"), real_ty())), prop()),
)
}
pub fn regular_borel_measure_ty() -> Expr {
arrow(type0(), prop())
}
pub fn meager_set_ty() -> Expr {
impl_pi("X", type0(), arrow(app(cst("Set"), bvar(0)), prop()))
}
pub fn comeager_set_ty() -> Expr {
impl_pi("X", type0(), arrow(app(cst("Set"), bvar(0)), prop()))
}
pub fn nowhere_dense_set_ty() -> Expr {
impl_pi("X", type0(), arrow(app(cst("Set"), bvar(0)), prop()))
}
pub fn kuratowski_ulam_ty() -> Expr {
impl_pi(
"X",
type0(),
impl_pi(
"Y",
type0(),
arrow(
app(cst("PolishSpace"), bvar(1)),
arrow(
app(cst("PolishSpace"), bvar(1)),
arrow(app(cst("Set"), app2(cst("Prod"), bvar(3), bvar(2))), prop()),
),
),
),
)
}
pub fn baire_category_theorem_ty() -> Expr {
impl_pi(
"X",
type0(),
arrow(app(cst("CompleteMetricSpace"), bvar(0)), prop()),
)
}
pub fn pi11_complete_ty() -> Expr {
arrow(app(cst("Set"), nat_ty()), prop())
}
pub fn hyperarithmetic_set_ty() -> Expr {
arrow(app(cst("Set"), nat_ty()), prop())
}
pub fn recursive_ordinal_ty() -> Expr {
arrow(cst("Ordinal"), prop())
}
pub fn church_kleene_ordinal_ty() -> Expr {
cst("Ordinal")
}
pub fn coanalytic_rank_ty() -> Expr {
impl_pi(
"X",
type0(),
arrow(
app(cst("Set"), bvar(0)),
arrow(arrow(bvar(1), cst("Ordinal")), prop()),
),
)
}
pub fn boundedness_theorem_ty() -> Expr {
arrow(app(cst("Set"), cst("Ordinal")), prop())
}
pub fn scott_rank_ty() -> Expr {
arrow(type0(), cst("Ordinal"))
}
pub fn vaught_conjecture_ty() -> Expr {
prop()
}
pub fn lopez_escobar_theorem_ty() -> Expr {
prop()
}
pub fn choquet_game_ty() -> Expr {
arrow(type0(), type0())
}
pub fn choquet_complete_ty() -> Expr {
arrow(type0(), prop())
}
pub fn choquet_complete_implies_polish_ty() -> Expr {
impl_pi(
"X",
type0(),
arrow(
app(cst("ChoquetComplete"), bvar(0)),
app(cst("PolishSpace"), bvar(1)),
),
)
}
pub fn build_descriptive_set_theory_env() -> Environment {
let mut env = Environment::new();
let axioms: &[(&str, Expr)] = &[
("PolishSpace", polish_space_ty()),
("SeparableSpace", separable_space_ty()),
("CompleteMetricSpace", complete_metric_space_ty()),
("BaireSpace", baire_space_ty()),
("CantorSpace", cantor_space_ty()),
("ZeroDimensional", zero_dimensional_ty()),
("PolishEmbedding", polish_embedding_ty()),
("BorelSet", borel_set_ty()),
("SigmaClass", sigma_class_ty()),
("PiClass", pi_class_ty()),
("DeltaClass", delta_class_ty()),
("OpenSet", open_set_ty()),
("ClosedSet", closed_set_ty()),
("FSigmaSet", f_sigma_set_ty()),
("GDeltaSet", g_delta_set_ty()),
("AnalyticSet", analytic_set_ty()),
("CoanalyticSet", coanalytic_set_ty()),
("SuslinScheme", suslin_scheme_ty()),
("SuslinOperation", suslin_operation_ty()),
("ProjectiveClass", projective_class_ty()),
("Sigma11Set", sigma11_set_ty()),
("Pi11Set", pi11_set_ty()),
("Sigma12Set", sigma12_set_ty()),
("PerfectSet", perfect_set_ty()),
("ScatteredSet", scattered_set_ty()),
("CBRank", cb_rank_ty()),
("CBDerivative", cb_derivative_ty()),
("CantorBendixsonTheorem", cb_theorem_ty()),
("LuzinSeparation", luzin_separation_ty()),
("SuslinTheorem", suslin_theorem_ty()),
("SuslinRepresentation", suslin_representation_ty()),
("GameTree", game_tree_ty()),
("Strategy", strategy_ty()),
("WinningStrategy", winning_strategy_ty()),
("Determined", determined_ty()),
("OpenDeterminacy", open_determinacy_ty()),
("BorelDeterminacy", borel_determinacy_ty()),
("AnalyticDeterminacy", analytic_determinacy_ty()),
("AxiomOfDeterminacy", axiom_of_determinacy_ty()),
("ProjectiveDeterminacy", projective_determinacy_ty()),
("MeasurableCardinal", measurable_cardinal_ty()),
("WoodinCardinal", woodin_cardinal_ty()),
("StrongCardinal", strong_cardinal_ty()),
(
"MeasurableImpliesAnalyticDet",
measurable_implies_analytic_det_ty(),
),
(
"WoodinImpliesProjectiveDet",
woodin_implies_projective_det_ty(),
),
("Ordinal", type0()),
("Disjoint", arrow(type0(), arrow(type0(), prop()))),
("Set", arrow(type0(), type0())),
(
"Delta11Set",
impl_pi("X", type0(), arrow(app(cst("Set"), bvar(0)), prop())),
),
(
"CBDecomposition",
impl_pi(
"X",
type0(),
arrow(
app(cst("Set"), bvar(0)),
arrow(app(cst("Set"), bvar(1)), prop()),
),
),
),
(
"HasSuslinRepresentation",
impl_pi("X", type0(), arrow(app(cst("Set"), bvar(0)), prop())),
),
(
"BorelSeparator",
impl_pi(
"X",
type0(),
arrow(
app(cst("Set"), bvar(0)),
arrow(app(cst("Set"), bvar(1)), prop()),
),
),
),
("OmegaManyWoodinCardinals", arrow(cst("Ordinal"), prop())),
("UniversalBorelSet", universal_borel_set_ty()),
("CompleteBorelSet", complete_borel_set_ty()),
("BorelIsomorphism", borel_isomorphism_ty()),
("StandardBorelSpace", standard_borel_space_ty()),
("Prod", arrow(type0(), arrow(type0(), type0()))),
("Pi12Set", pi12_set_ty()),
("Delta12Set", delta12_set_ty()),
("PDAxiom", pd_axiom_ty()),
("Pi11Norm", pi11_norm_ty()),
("WadgeDegree", wadge_degree_ty()),
("WadgeLemma", wadge_lemma_ty()),
("WeihrauchReducibility", weihrauch_reducibility_ty()),
("SteelWadge", steel_wadge_ty()),
("OrbitEquivRelation", orbit_equiv_relation_ty()),
("BorelReducibility", borel_reducibility_ty()),
("HyperfiniteEquivRelation", hyperfinite_equiv_relation_ty()),
("BorelEmbedding", borel_embedding_ty()),
("LebesgueMeasurable", lebesgue_measurable_ty()),
("LuzinNSet", luzin_n_set_ty()),
(
"UniformlyMeasurableFamily",
uniformly_measurable_family_ty(),
),
("RegularBorelMeasure", regular_borel_measure_ty()),
("MeagerSet", meager_set_ty()),
("ComeagerSet", comeager_set_ty()),
("NowhereDenseSet", nowhere_dense_set_ty()),
("KuratowskiUlam", kuratowski_ulam_ty()),
("BaireCategoryTheorem", baire_category_theorem_ty()),
("Pi11Complete", pi11_complete_ty()),
("HyperarithmeticSet", hyperarithmetic_set_ty()),
("RecursiveOrdinal", recursive_ordinal_ty()),
("ChurchKleeneOrdinal", church_kleene_ordinal_ty()),
("CoanalyticRank", coanalytic_rank_ty()),
("BoundednessTheorem", boundedness_theorem_ty()),
("ScottRank", scott_rank_ty()),
("VaughtConjecture", vaught_conjecture_ty()),
("LopezEscobarTheorem", lopez_escobar_theorem_ty()),
("ChoquetGame", choquet_game_ty()),
("ChoquetComplete", choquet_complete_ty()),
(
"ChoquetCompleteImpliesPolish",
choquet_complete_implies_polish_ty(),
),
];
for (name, ty) in axioms {
let _ = env.add(Declaration::Axiom {
name: Name::str(*name),
univ_params: vec![],
ty: ty.clone(),
});
}
env
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_build_descriptive_set_theory_env() {
let env = build_descriptive_set_theory_env();
assert!(env.get(&Name::str("PolishSpace")).is_some());
assert!(env.get(&Name::str("BorelSet")).is_some());
assert!(env.get(&Name::str("AnalyticSet")).is_some());
assert!(env.get(&Name::str("PerfectSet")).is_some());
assert!(env.get(&Name::str("CantorBendixsonTheorem")).is_some());
assert!(env.get(&Name::str("LuzinSeparation")).is_some());
assert!(env.get(&Name::str("SuslinTheorem")).is_some());
assert!(env.get(&Name::str("BorelDeterminacy")).is_some());
assert!(env.get(&Name::str("MeasurableCardinal")).is_some());
assert!(env.get(&Name::str("WoodinCardinal")).is_some());
}
#[test]
fn test_borel_level_dual() {
assert_eq!(BorelLevel::Sigma(1).dual(), BorelLevel::Pi(1));
assert_eq!(BorelLevel::Pi(2).dual(), BorelLevel::Sigma(2));
assert_eq!(BorelLevel::Delta(3).dual(), BorelLevel::Delta(3));
}
#[test]
fn test_borel_level_properties() {
assert!(BorelLevel::Sigma(1).is_open());
assert!(BorelLevel::Pi(1).is_closed());
assert!(!BorelLevel::Sigma(2).is_open());
assert_eq!(BorelLevel::Sigma(3).rank(), 3);
assert_eq!(BorelLevel::Delta(5).rank(), 5);
}
#[test]
fn test_projective_level() {
assert!(ProjectiveLevel::Sigma(1).is_analytic());
assert!(ProjectiveLevel::Pi(1).is_coanalytic());
assert!(ProjectiveLevel::Delta(1).is_borel());
assert_eq!(ProjectiveLevel::Sigma(2).dual(), ProjectiveLevel::Pi(2));
}
#[test]
fn test_cantor_bendixson_scattered() {
let mut space = FiniteTopSpace::new(3);
space.mark_isolated(0);
space.mark_isolated(1);
space.mark_isolated(2);
assert!(space.is_scattered());
assert_eq!(space.cb_rank(), 1);
}
#[test]
fn test_cantor_bendixson_perfect_candidate() {
let space = FiniteTopSpace::new(4);
assert!(!space.is_scattered());
assert_eq!(space.cb_rank(), u32::MAX);
}
#[test]
fn test_polish_space_examples() {
let r = PolishSpaceExample::real_line();
assert!(!r.compact);
assert!(r.locally_compact);
let bs = PolishSpaceExample::baire_space();
assert!(bs.is_baire_space);
assert!(bs.zero_dimensional);
let cs = PolishSpaceExample::cantor_space();
assert!(cs.compact);
assert!(cs.zero_dimensional);
}
#[test]
fn test_determinacy_strength_ordering() {
assert!(DetermincyStrength::Open < DetermincyStrength::Borel);
assert!(DetermincyStrength::Borel < DetermincyStrength::Analytic);
assert!(DetermincyStrength::Analytic < DetermincyStrength::Full);
assert!(DetermincyStrength::Borel.provable_in_zfc());
assert!(!DetermincyStrength::Analytic.provable_in_zfc());
assert!(DetermincyStrength::Projective.requires_large_cardinal());
assert!(!DetermincyStrength::Open.requires_large_cardinal());
}
}
#[cfg(test)]
mod spec_wrapper_tests {
use super::*;
#[test]
fn test_polish_space() {
let ps = PolishSpace::new(true, true);
assert!(ps.is_polish());
assert!(ps.is_zero_dimensional());
assert_eq!(ps.topological_classification(), "Polish");
let ns = PolishSpace::new(false, true);
assert!(!ns.is_polish());
assert_eq!(ns.topological_classification(), "non-separable");
}
#[test]
fn test_borel_hierarchy() {
let s1 = BorelHierarchy::sigma(1);
assert!(s1.closed_under_unions());
assert!(!s1.closed_under_intersections());
assert!(!s1.closed_under_complements());
assert_eq!(s1.dual(), BorelHierarchy::pi(1));
let p2 = BorelHierarchy::pi(2);
assert!(!p2.closed_under_unions());
assert!(p2.closed_under_intersections());
}
#[test]
fn test_analytic_set() {
let a = AnalyticSet::new("reals");
assert!(a.is_continuous_image_of_borel());
assert!(a.is_souslin());
let b = AnalyticSet::new("reals");
assert!(a.luzin_separation(&b));
}
#[test]
fn test_universally_measurable() {
let um = UniversallyMeasurable::new("A");
assert!(um.is_universally_measurable());
assert!(um.inner_regularity());
}
#[test]
fn test_projective_hierarchy() {
let p1 = ProjectiveHierarchy::new(1);
assert!(p1.sigma_1_1_is_analytic());
assert!(p1.pi_1_1_is_coanalytic());
assert!(p1.determinacy());
let p2 = ProjectiveHierarchy::new(2);
assert!(!p2.sigma_1_1_is_analytic());
assert!(!p2.determinacy());
}
#[test]
fn test_perfect_set() {
let ps = PerfectSet::new("Cantor space");
assert!(ps.has_continuum_many_points());
let (has_perfect, has_scattered) = ps.cantor_bendixson();
assert!(has_perfect);
assert!(has_scattered);
assert!(ps.perfect_set_thm());
}
#[test]
fn test_lipschitz_function() {
let f = LipschitzFunction::new(2.0, "R");
assert!(f.is_uniformly_continuous());
assert!(f.is_measurable());
assert!(f.rademacher_theorem());
}
#[test]
fn test_wadge_hierarchy() {
let wh = WadgeHierarchy::new();
assert!(wh.wadge_reducibility());
assert!(wh.martin_steel_theorem());
}
#[test]
fn test_infinite_game() {
let g = InfiniteGame::new("Player I", "Borel set");
assert!(g.is_determined());
assert!(g.borel_determinacy());
}
}
#[cfg(test)]
mod new_impl_tests {
use super::*;
#[test]
fn test_borel_hierarchy_checker() {
let mut checker = BorelHierarchyChecker::new(1, true);
checker.register("open_set_A");
checker.register("open_set_B");
assert!(checker.contains("open_set_A"));
assert!(!checker.contains("closed_set_C"));
assert_eq!(checker.class_name(), "Σ⁰_1");
assert!(checker.closed_under_unions());
assert!(!checker.closed_under_intersections());
let dual = checker.dual();
assert_eq!(dual.class_name(), "Π⁰_1");
let succ = checker.successor();
assert_eq!(succ.class_name(), "Π⁰_1");
let succ2 = dual.successor();
assert_eq!(succ2.class_name(), "Σ⁰_2");
}
#[test]
fn test_wadge_degrees_computer() {
let mut wdc = WadgeDegreesComputer::new();
wdc.assign("clopen", 1);
wdc.assign("open", 2);
wdc.assign("closed", 2);
wdc.assign("f_sigma", 3);
assert!(wdc.wadge_le("clopen", "open"));
assert!(wdc.wadge_le("open", "f_sigma"));
assert!(!wdc.wadge_le("f_sigma", "clopen"));
assert!(wdc.wadge_equiv("open", "closed"));
let min = wdc.minimal();
assert_eq!(min, Some("clopen"));
let red = wdc.reducible_to("open");
assert!(red.contains(&"clopen"));
}
#[test]
fn test_determinacy_game_solver_trivial() {
let mut solver = DeterminacyGameSolver::new(1);
solver.set_payoff(0, true);
assert!(solver.is_determined());
assert_eq!(solver.winner(), Some(true));
}
#[test]
fn test_determinacy_game_solver_tree() {
let mut solver = DeterminacyGameSolver::new(3);
solver.set_player(0, true);
solver.add_move(0, 1);
solver.add_move(0, 2);
solver.set_payoff(1, false);
solver.set_payoff(2, true);
assert!(solver.is_determined());
assert_eq!(solver.winner(), Some(true));
}
#[test]
fn test_orbit_equivalence_relation() {
let mut rel = OrbitEquivalenceRelation::new(5);
rel.union(0, 1);
rel.union(1, 2);
rel.union(3, 4);
assert!(rel.same_orbit(0, 2));
assert!(rel.same_orbit(3, 4));
assert!(!rel.same_orbit(0, 3));
assert_eq!(rel.num_orbits(), 2);
assert!(rel.is_smooth());
assert!(rel.is_hyperfinite());
}
#[test]
fn test_dst_env_new_axioms() {
let env = build_descriptive_set_theory_env();
assert!(env.get(&Name::str("UniversalBorelSet")).is_some());
assert!(env.get(&Name::str("StandardBorelSpace")).is_some());
assert!(env.get(&Name::str("Pi12Set")).is_some());
assert!(env.get(&Name::str("PDAxiom")).is_some());
assert!(env.get(&Name::str("WadgeLemma")).is_some());
assert!(env.get(&Name::str("SteelWadge")).is_some());
assert!(env.get(&Name::str("BorelReducibility")).is_some());
assert!(env.get(&Name::str("HyperfiniteEquivRelation")).is_some());
assert!(env.get(&Name::str("LebesgueMeasurable")).is_some());
assert!(env.get(&Name::str("RegularBorelMeasure")).is_some());
assert!(env.get(&Name::str("MeagerSet")).is_some());
assert!(env.get(&Name::str("BaireCategoryTheorem")).is_some());
assert!(env.get(&Name::str("Pi11Complete")).is_some());
assert!(env.get(&Name::str("HyperarithmeticSet")).is_some());
assert!(env.get(&Name::str("CoanalyticRank")).is_some());
assert!(env.get(&Name::str("BoundednessTheorem")).is_some());
assert!(env.get(&Name::str("VaughtConjecture")).is_some());
assert!(env.get(&Name::str("LopezEscobarTheorem")).is_some());
assert!(env.get(&Name::str("ChoquetComplete")).is_some());
assert!(env
.get(&Name::str("ChoquetCompleteImpliesPolish"))
.is_some());
}
}
#[cfg(test)]
mod extended_dst_tests {
use super::*;
#[test]
fn test_analytic_set() {
let a = AnalyticSetData::new("A", false);
assert!(!a.is_borel);
assert_eq!(
AnalyticSetData::separation_description(),
"Disjoint analytic sets are Borel-separated"
);
}
#[test]
fn test_projective_level() {
let l1 = ProjectiveLevelData::level(1);
assert!(l1.is_analytic());
assert!(l1.closed_under_continuous_preimage());
}
#[test]
fn test_descriptive_tree() {
let t = DescriptiveTree::well_founded(vec!["0".to_string(), "1".to_string()]);
assert!(t.is_well_founded);
assert!(!t.has_infinite_branch());
assert!(t.kleene_brouwer_applies());
}
#[test]
fn test_baire_category() {
let m = BaireCategory::meager("R");
assert!(m.is_meager);
assert!(!m.is_comeager);
}
#[test]
fn test_wadge() {
let w = WadgeDegree::new("A", 3, false);
assert!(w.has_complement_pair());
assert!(WadgeDegree::wadge_lemma_description().contains("Wadge"));
}
#[test]
fn test_scott_rank() {
let sr = ScottRank::new("(Q, <)", 2);
assert!(sr.scott_sentence_description().contains("Scott"));
}
}
#[cfg(test)]
mod tests_dst_ext {
use super::*;
#[test]
fn test_effective_borel_set() {
let rec = EffectiveBorelSet::recursive_set("K");
assert!(rec.is_recursive);
let corr = rec.lightface_boldface_correspondence();
assert!(corr.contains("oracle"));
let charac = rec.characterization();
assert!(charac.contains("Δ"));
let re_set = EffectiveBorelSet::re_set("W_e");
assert!(!re_set.is_recursive);
let mosc = re_set.moschovakis_theorem();
assert!(mosc.contains("Moschovakis"));
}
#[test]
fn test_wellfounded_relation() {
let nat = WellfoundedRelation::natural_numbers();
assert!(nat.is_linear);
assert_eq!(nat.order_type, "ω");
let kb = nat.kleene_brouwer_ordering();
assert!(kb.contains("KB"));
let pi11 = nat.rank_pi11_characterization();
assert!(pi11.contains("Π^1_1"));
}
#[test]
fn test_large_cardinal() {
let meas = LargeCardinal::measurable_cardinal();
assert!(meas.is_measurable);
let pd = meas.projective_determinacy_connection();
assert!(pd.contains("Martin"));
let sharp = meas.silver_indiscernibles();
assert!(sharp.contains("0#"));
let woodin = LargeCardinal::woodin_cardinal();
let wd = woodin.projective_determinacy_connection();
assert!(wd.contains("Woodin"));
}
#[test]
fn test_forcing_poset() {
let cohen = ForcingPoset::cohen_forcing();
assert!(!cohen.collapses_cardinals);
assert!(cohen.adds_real);
let ind = cohen.independence_of_ch();
assert!(ind.contains("Cohen"));
let abs = cohen.generic_absoluteness();
assert!(abs.contains("Shoenfield"));
let col = ForcingPoset::collapsing_forcing("κ");
assert!(col.collapses_cardinals);
}
#[test]
fn test_martins_axiom() {
let ma = MartinsAxiom::ma_not_ch();
assert!(ma.ccc_forcing);
assert!(ma.consequence_count() > 0);
let cons = ma.consistency();
assert!(cons.contains("Solovay"));
}
#[test]
fn test_pfa() {
let pfa = ProperForcingAxiom::pfa();
assert!(pfa.implies_not_ch);
assert!(pfa.implies_ma);
let woodin = pfa.woodin_provable_consequences();
assert!(woodin.contains("Woodin"));
}
}