use oxilean_kernel::{BinderInfo, Declaration, Environment, Expr, Level, Name};
use super::types::{
DirectedSet, LimSupInf, MacNeilleCompletion, MonotoneFnChecker, Net, OrderTopologyBasis,
OrderedInterval, OrderedMetricSpace, OrdinalArithmetic, RealInterval, ScottOpenSet,
SmallOrdinal, SorgenfreyLineTopology, TychonoffSpaceData, VectorLatticeOps,
};
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 order_topology_ty() -> Expr {
impl_pi("α", type0(), app(cst("TopologicalSpace"), bvar(0)))
}
pub fn nhds_ty() -> Expr {
impl_pi("α", type0(), arrow(bvar(0), app(cst("Filter"), bvar(1))))
}
pub fn filter_at_top_ty() -> Expr {
impl_pi("α", type0(), app(cst("Filter"), bvar(0)))
}
pub fn filter_at_bot_ty() -> Expr {
impl_pi("α", type0(), app(cst("Filter"), bvar(0)))
}
pub fn tendsto_ty() -> Expr {
impl_pi(
"α",
type0(),
impl_pi(
"β",
type0(),
arrow(
arrow(bvar(1), bvar(1)),
arrow(
app(cst("Filter"), bvar(2)),
arrow(app(cst("Filter"), bvar(2)), prop()),
),
),
),
)
}
pub fn continuous_at_ty() -> Expr {
impl_pi(
"α",
type0(),
impl_pi(
"β",
type0(),
arrow(arrow(bvar(1), bvar(1)), arrow(bvar(2), prop())),
),
)
}
pub fn continuous_on_ty() -> Expr {
impl_pi(
"α",
type0(),
impl_pi(
"β",
type0(),
arrow(
arrow(bvar(1), bvar(1)),
arrow(app(cst("Set"), bvar(2)), prop()),
),
),
)
}
pub fn is_open_ioi_ty() -> Expr {
impl_pi("α", type0(), arrow(bvar(0), prop()))
}
pub fn is_open_iio_ty() -> Expr {
impl_pi("α", type0(), arrow(bvar(0), prop()))
}
pub fn order_topology_inst_ty() -> Expr {
impl_pi("α", type0(), app(cst("TopologicalSpace"), bvar(0)))
}
pub fn nhds_order_left_ty() -> Expr {
impl_pi("α", type0(), arrow(bvar(0), prop()))
}
pub fn nhds_order_right_ty() -> Expr {
impl_pi("α", type0(), arrow(bvar(0), prop()))
}
pub fn monotone_ty() -> Expr {
impl_pi(
"α",
type0(),
impl_pi("β", type0(), arrow(arrow(bvar(1), bvar(1)), prop())),
)
}
pub fn antitone_ty() -> Expr {
impl_pi(
"α",
type0(),
impl_pi("β", type0(), arrow(arrow(bvar(1), bvar(1)), prop())),
)
}
pub fn strict_mono_ty() -> Expr {
impl_pi(
"α",
type0(),
impl_pi("β", type0(), arrow(arrow(bvar(1), bvar(1)), prop())),
)
}
pub fn limsup_ty() -> Expr {
impl_pi(
"α",
type0(),
arrow(
arrow(cst("Nat"), bvar(0)),
arrow(app(cst("Filter"), cst("Nat")), bvar(1)),
),
)
}
pub fn liminf_ty() -> Expr {
impl_pi(
"α",
type0(),
arrow(
arrow(cst("Nat"), bvar(0)),
arrow(app(cst("Filter"), cst("Nat")), bvar(1)),
),
)
}
pub fn upper_semicontinuous_ty() -> Expr {
impl_pi(
"α",
type0(),
impl_pi("β", type0(), arrow(arrow(bvar(1), bvar(1)), prop())),
)
}
pub fn lower_semicontinuous_ty() -> Expr {
impl_pi(
"α",
type0(),
impl_pi("β", type0(), arrow(arrow(bvar(1), bvar(1)), prop())),
)
}
pub fn is_compact_icc_ty() -> Expr {
impl_pi("α", type0(), arrow(bvar(0), arrow(bvar(1), prop())))
}
pub fn intermediate_value_thm_ty() -> Expr {
impl_pi(
"α",
type0(),
impl_pi(
"β",
type0(),
arrow(
arrow(bvar(1), bvar(1)),
arrow(bvar(2), arrow(bvar(3), arrow(bvar(2), prop()))),
),
),
)
}
pub fn extreme_value_thm_ty() -> Expr {
impl_pi(
"α",
type0(),
impl_pi(
"β",
type0(),
arrow(
arrow(bvar(1), bvar(1)),
arrow(app(cst("Set"), bvar(2)), prop()),
),
),
)
}
pub fn dini_theorem_ty() -> Expr {
impl_pi(
"α",
type0(),
impl_pi(
"β",
type0(),
arrow(arrow(cst("Nat"), arrow(bvar(1), bvar(1))), prop()),
),
)
}
pub fn monotone_convergence_thm_ty() -> Expr {
impl_pi("α", type0(), arrow(arrow(cst("Nat"), bvar(0)), prop()))
}
pub fn dedekind_complete_ty() -> Expr {
impl_pi("α", type0(), prop())
}
pub fn order_connected_ty() -> Expr {
impl_pi("α", type0(), arrow(app(cst("Set"), bvar(0)), prop()))
}
pub fn connected_space_ty() -> Expr {
impl_pi("α", type0(), prop())
}
pub fn order_topology_connected_ty() -> Expr {
impl_pi("α", type0(), prop())
}
pub fn ordered_topological_group_ty() -> Expr {
impl_pi("α", type0(), prop())
}
pub fn topological_lattice_ty() -> Expr {
impl_pi("α", type0(), prop())
}
pub fn scott_open_ty() -> Expr {
impl_pi("α", type0(), arrow(arrow(bvar(0), prop()), prop()))
}
pub fn scott_topology_ty() -> Expr {
impl_pi("α", type0(), app(cst("TopologicalSpace"), bvar(0)))
}
pub fn lawson_topology_ty() -> Expr {
impl_pi("α", type0(), app(cst("TopologicalSpace"), bvar(0)))
}
pub fn alexandroff_topology_ty() -> Expr {
impl_pi(
"α",
type0(),
arrow(
arrow(bvar(0), arrow(bvar(1), prop())),
app(cst("TopologicalSpace"), bvar(1)),
),
)
}
pub fn specialization_order_ty() -> Expr {
impl_pi(
"α",
type0(),
arrow(
app(cst("TopologicalSpace"), bvar(0)),
arrow(bvar(1), arrow(bvar(2), prop())),
),
)
}
pub fn birkhoff_representation_ty() -> Expr {
impl_pi("L", type0(), prop())
}
pub fn priestley_duality_ty() -> Expr {
impl_pi("L", type0(), prop())
}
pub fn zorn_lemma_ty() -> Expr {
impl_pi("α", type0(), prop())
}
pub fn ordinal_topology_ty() -> Expr {
impl_pi("α", type0(), app(cst("TopologicalSpace"), bvar(0)))
}
pub fn net_convergence_ty() -> Expr {
impl_pi(
"α",
type0(),
arrow(arrow(cst("DirectedSet"), bvar(0)), arrow(bvar(1), prop())),
)
}
pub fn order_basis_ioo_ty() -> Expr {
impl_pi("α", type0(), arrow(bvar(0), arrow(bvar(1), prop())))
}
pub fn is_open_ioo_ty() -> Expr {
impl_pi("α", type0(), arrow(bvar(0), arrow(bvar(1), prop())))
}
pub fn is_closed_icc_ty() -> Expr {
impl_pi("α", type0(), arrow(bvar(0), arrow(bvar(1), prop())))
}
pub fn order_topology_t2_ty() -> Expr {
impl_pi("α", type0(), prop())
}
pub fn order_topology_regular_ty() -> Expr {
impl_pi("α", type0(), prop())
}
pub fn ordered_field_topology_ty() -> Expr {
impl_pi("α", type0(), prop())
}
pub fn filter_limsup_ty() -> Expr {
impl_pi(
"α",
type0(),
impl_pi(
"β",
type0(),
arrow(
app(cst("Filter"), bvar(1)),
arrow(arrow(bvar(2), bvar(1)), bvar(1)),
),
),
)
}
pub fn filter_liminf_ty() -> Expr {
impl_pi(
"α",
type0(),
impl_pi(
"β",
type0(),
arrow(
app(cst("Filter"), bvar(1)),
arrow(arrow(bvar(2), bvar(1)), bvar(1)),
),
),
)
}
pub fn order_iso_homeomorph_ty() -> Expr {
impl_pi("α", type0(), impl_pi("β", type0(), prop()))
}
pub fn continuous_mono_compose_ty() -> Expr {
impl_pi(
"α",
type0(),
impl_pi("β", type0(), impl_pi("γ", type0(), prop())),
)
}
pub fn macneille_completion_ty() -> Expr {
impl_pi("α", type0(), type0())
}
pub fn dedekind_cuts_ty() -> Expr {
prop()
}
pub fn sup_preserving_map_ty() -> Expr {
impl_pi(
"α",
type0(),
impl_pi("β", type0(), arrow(arrow(bvar(1), bvar(1)), prop())),
)
}
pub fn interval_topology_ty() -> Expr {
impl_pi("α", type0(), app(cst("TopologicalSpace"), bvar(0)))
}
pub fn order_eq_interval_topology_ty() -> Expr {
prop()
}
pub fn connected_ordered_space_ty() -> Expr {
impl_pi("α", type0(), prop())
}
pub fn long_line_ty() -> Expr {
type0()
}
pub fn ordinal_omega1_ty() -> Expr {
type0()
}
pub fn alexandroff_omega1_ty() -> Expr {
type0()
}
pub fn monotonically_normal_ty() -> Expr {
impl_pi("α", type0(), prop())
}
pub fn generalized_ordered_space_ty() -> Expr {
impl_pi("α", type0(), prop())
}
pub fn lots_ty() -> Expr {
impl_pi("α", type0(), prop())
}
pub fn sorgenfrey_line_ty() -> Expr {
type0()
}
pub fn michael_line_ty() -> Expr {
type0()
}
pub fn ordinal_multiplication_ty() -> Expr {
impl_pi("α", type0(), impl_pi("β", type0(), type0()))
}
pub fn ordinal_exponentiation_ty() -> Expr {
impl_pi("α", type0(), impl_pi("β", type0(), type0()))
}
pub fn cantor_normal_form_ty() -> Expr {
prop()
}
pub fn helly_order_ty() -> Expr {
prop()
}
pub fn convex_ordered_set_ty() -> Expr {
impl_pi("α", type0(), arrow(app(cst("Set"), bvar(0)), prop()))
}
pub fn compact_convex_ordered_ty() -> Expr {
impl_pi("α", type0(), arrow(app(cst("Set"), bvar(0)), prop()))
}
pub fn monotone_continuous_ty() -> Expr {
impl_pi(
"α",
type0(),
impl_pi("β", type0(), arrow(arrow(bvar(1), bvar(1)), prop())),
)
}
pub fn dini_uniform_convergence_ty() -> Expr {
prop()
}
pub fn cofinal_subnet_ty() -> Expr {
impl_pi(
"α",
type0(),
arrow(
arrow(cst("DirectedSet"), bvar(0)),
arrow(arrow(cst("DirectedSet"), bvar(1)), prop()),
),
)
}
pub fn eventual_property_ty() -> Expr {
impl_pi(
"α",
type0(),
arrow(
app(cst("Filter"), bvar(0)),
arrow(arrow(bvar(1), prop()), prop()),
),
)
}
pub fn order_topology_base_ty() -> Expr {
impl_pi("α", type0(), prop())
}
pub fn l_group_ty() -> Expr {
impl_pi("α", type0(), prop())
}
pub fn riesz_space_ty() -> Expr {
impl_pi("α", type0(), prop())
}
pub fn archimedean_riesz_space_ty() -> Expr {
impl_pi("α", type0(), prop())
}
pub fn ordered_banach_space_ty() -> Expr {
impl_pi("α", type0(), prop())
}
pub fn convex_cone_ty() -> Expr {
impl_pi("α", type0(), arrow(app(cst("Set"), bvar(0)), prop()))
}
pub fn cone_duality_ty() -> Expr {
prop()
}
pub fn boolean_space_ty() -> Expr {
impl_pi("α", type0(), prop())
}
pub fn spectral_space_ty() -> Expr {
impl_pi("α", type0(), prop())
}
pub fn patchwork_topology_ty() -> Expr {
impl_pi("α", type0(), app(cst("TopologicalSpace"), bvar(0)))
}
pub fn register_order_topology(env: &mut Environment) {
let axioms: &[(&str, Expr)] = &[
("OrderTopology", order_topology_ty()),
("Nhds", nhds_ty()),
("Filter.atTop", filter_at_top_ty()),
("Filter.atBot", filter_at_bot_ty()),
("Tendsto", tendsto_ty()),
("ContinuousAt", continuous_at_ty()),
("ContinuousOn", continuous_on_ty()),
("IsOpen_Ioi", is_open_ioi_ty()),
("IsOpen_Iio", is_open_iio_ty()),
(
"OrderTopology.instTopologicalSpace",
order_topology_inst_ty(),
),
("nhds_order_left", nhds_order_left_ty()),
("nhds_order_right", nhds_order_right_ty()),
("Monotone", monotone_ty()),
("Antitone", antitone_ty()),
("StrictMono", strict_mono_ty()),
("LimSup", limsup_ty()),
("LimInf", liminf_ty()),
("UpperSemicontinuous", upper_semicontinuous_ty()),
("LowerSemicontinuous", lower_semicontinuous_ty()),
("IsCompact_Icc", is_compact_icc_ty()),
("IntermediateValueThm", intermediate_value_thm_ty()),
("ExtremeValueThm", extreme_value_thm_ty()),
("DiniTheorem", dini_theorem_ty()),
("MonotoneConvergenceThm", monotone_convergence_thm_ty()),
("DedekindComplete", dedekind_complete_ty()),
("OrderConnected", order_connected_ty()),
("ConnectedSpace", connected_space_ty()),
("OrderTopologyConnected", order_topology_connected_ty()),
("OrderedTopologicalGroup", ordered_topological_group_ty()),
("TopologicalLattice", topological_lattice_ty()),
("ScottOpen", scott_open_ty()),
("ScottTopology", scott_topology_ty()),
("LawsonTopology", lawson_topology_ty()),
("AlexandroffTopology", alexandroff_topology_ty()),
("SpecializationOrder", specialization_order_ty()),
("BirkhoffRepresentation", birkhoff_representation_ty()),
("PriestleyDuality", priestley_duality_ty()),
("ZornLemma", zorn_lemma_ty()),
("OrdinalTopology", ordinal_topology_ty()),
("NetConvergence", net_convergence_ty()),
("OrderBasis_Ioo", order_basis_ioo_ty()),
("IsOpen_Ioo", is_open_ioo_ty()),
("IsClosed_Icc", is_closed_icc_ty()),
("OrderTopology.t2Space", order_topology_t2_ty()),
("OrderTopology.regularSpace", order_topology_regular_ty()),
("OrderedFieldTopology", ordered_field_topology_ty()),
("Filter.limsup", filter_limsup_ty()),
("Filter.liminf", filter_liminf_ty()),
("OrderIsoHomeomorph", order_iso_homeomorph_ty()),
("ContinuousMono_compose", continuous_mono_compose_ty()),
("MacNeilleCompletion", macneille_completion_ty()),
("DedekindCuts", dedekind_cuts_ty()),
("SupPreservingMap", sup_preserving_map_ty()),
("IntervalTopology", interval_topology_ty()),
("OrderEqIntervalTopology", order_eq_interval_topology_ty()),
("ConnectedOrderedSpace", connected_ordered_space_ty()),
("LongLine", long_line_ty()),
("OrdinalOmega1", ordinal_omega1_ty()),
("AlexandroffOmega1", alexandroff_omega1_ty()),
("MonotonicallyNormal", monotonically_normal_ty()),
("GeneralizedOrderedSpace", generalized_ordered_space_ty()),
("LOTS", lots_ty()),
("SorgenfreyLine", sorgenfrey_line_ty()),
("MichaelLine", michael_line_ty()),
("OrdinalMultiplication", ordinal_multiplication_ty()),
("OrdinalExponentiation", ordinal_exponentiation_ty()),
("CantorNormalForm", cantor_normal_form_ty()),
("HellyOrder", helly_order_ty()),
("ConvexOrderedSet", convex_ordered_set_ty()),
("CompactConvexOrdered", compact_convex_ordered_ty()),
("MonotoneContinuous", monotone_continuous_ty()),
("DiniUniformConvergence", dini_uniform_convergence_ty()),
("CofinalSubnet", cofinal_subnet_ty()),
("EventualProperty", eventual_property_ty()),
("OrderTopologyBase", order_topology_base_ty()),
("LGroup", l_group_ty()),
("RieszSpace", riesz_space_ty()),
("ArchimedeanRieszSpace", archimedean_riesz_space_ty()),
("OrderedBanachSpace", ordered_banach_space_ty()),
("ConvexCone", convex_cone_ty()),
("ConeDuality", cone_duality_ty()),
("BooleanSpace", boolean_space_ty()),
("SpectralSpace", spectral_space_ty()),
("PatchworkTopology", patchwork_topology_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_order_topology(&mut env);
env
}
#[test]
fn test_order_topology_registered() {
let env = registered_env();
assert!(env.get(&Name::str("OrderTopology")).is_some());
}
#[test]
fn test_nhds_registered() {
let env = registered_env();
assert!(env.get(&Name::str("Nhds")).is_some());
}
#[test]
fn test_filter_at_top_registered() {
let env = registered_env();
assert!(env.get(&Name::str("Filter.atTop")).is_some());
}
#[test]
fn test_filter_at_bot_registered() {
let env = registered_env();
assert!(env.get(&Name::str("Filter.atBot")).is_some());
}
#[test]
fn test_tendsto_registered() {
let env = registered_env();
assert!(env.get(&Name::str("Tendsto")).is_some());
}
#[test]
fn test_continuous_at_registered() {
let env = registered_env();
assert!(env.get(&Name::str("ContinuousAt")).is_some());
}
#[test]
fn test_is_open_ioi_registered() {
let env = registered_env();
assert!(env.get(&Name::str("IsOpen_Ioi")).is_some());
}
#[test]
fn test_nhds_order_left_right_registered() {
let env = registered_env();
assert!(env.get(&Name::str("nhds_order_left")).is_some());
assert!(env.get(&Name::str("nhds_order_right")).is_some());
}
#[test]
fn test_monotone_antitone_registered() {
let env = registered_env();
assert!(env.get(&Name::str("Monotone")).is_some());
assert!(env.get(&Name::str("Antitone")).is_some());
assert!(env.get(&Name::str("StrictMono")).is_some());
}
#[test]
fn test_limsup_liminf_registered() {
let env = registered_env();
assert!(env.get(&Name::str("LimSup")).is_some());
assert!(env.get(&Name::str("LimInf")).is_some());
assert!(env.get(&Name::str("Filter.limsup")).is_some());
assert!(env.get(&Name::str("Filter.liminf")).is_some());
}
#[test]
fn test_semicontinuity_registered() {
let env = registered_env();
assert!(env.get(&Name::str("UpperSemicontinuous")).is_some());
assert!(env.get(&Name::str("LowerSemicontinuous")).is_some());
}
#[test]
fn test_compactness_ivt_evt_registered() {
let env = registered_env();
assert!(env.get(&Name::str("IsCompact_Icc")).is_some());
assert!(env.get(&Name::str("IntermediateValueThm")).is_some());
assert!(env.get(&Name::str("ExtremeValueThm")).is_some());
}
#[test]
fn test_dini_mct_registered() {
let env = registered_env();
assert!(env.get(&Name::str("DiniTheorem")).is_some());
assert!(env.get(&Name::str("MonotoneConvergenceThm")).is_some());
}
#[test]
fn test_dedekind_connectedness_registered() {
let env = registered_env();
assert!(env.get(&Name::str("DedekindComplete")).is_some());
assert!(env.get(&Name::str("OrderConnected")).is_some());
assert!(env.get(&Name::str("ConnectedSpace")).is_some());
assert!(env.get(&Name::str("OrderTopologyConnected")).is_some());
}
#[test]
fn test_topological_structures_registered() {
let env = registered_env();
assert!(env.get(&Name::str("OrderedTopologicalGroup")).is_some());
assert!(env.get(&Name::str("TopologicalLattice")).is_some());
assert!(env.get(&Name::str("OrderedFieldTopology")).is_some());
}
#[test]
fn test_scott_lawson_alexandroff_registered() {
let env = registered_env();
assert!(env.get(&Name::str("ScottOpen")).is_some());
assert!(env.get(&Name::str("ScottTopology")).is_some());
assert!(env.get(&Name::str("LawsonTopology")).is_some());
assert!(env.get(&Name::str("AlexandroffTopology")).is_some());
assert!(env.get(&Name::str("SpecializationOrder")).is_some());
}
#[test]
fn test_birkhoff_priestley_zorn_registered() {
let env = registered_env();
assert!(env.get(&Name::str("BirkhoffRepresentation")).is_some());
assert!(env.get(&Name::str("PriestleyDuality")).is_some());
assert!(env.get(&Name::str("ZornLemma")).is_some());
}
#[test]
fn test_ordinal_net_registered() {
let env = registered_env();
assert!(env.get(&Name::str("OrdinalTopology")).is_some());
assert!(env.get(&Name::str("NetConvergence")).is_some());
}
#[test]
fn test_interval_axioms_registered() {
let env = registered_env();
assert!(env.get(&Name::str("OrderBasis_Ioo")).is_some());
assert!(env.get(&Name::str("IsOpen_Ioo")).is_some());
assert!(env.get(&Name::str("IsClosed_Icc")).is_some());
assert!(env.get(&Name::str("OrderTopology.t2Space")).is_some());
assert!(env.get(&Name::str("OrderTopology.regularSpace")).is_some());
}
#[test]
fn test_iso_compose_registered() {
let env = registered_env();
assert!(env.get(&Name::str("OrderIsoHomeomorph")).is_some());
assert!(env.get(&Name::str("ContinuousMono_compose")).is_some());
}
#[test]
fn test_ordered_interval_contains() {
let iv = OrderedInterval::new(1.0_f64, 5.0).expect("OrderedInterval::new should succeed");
assert!(iv.contains(&3.0));
assert!(iv.contains(&1.0));
assert!(iv.contains(&5.0));
assert!(!iv.contains(&0.0));
assert!(!iv.contains(&6.0));
}
#[test]
fn test_ordered_interval_overlaps() {
let a = OrderedInterval::new(1.0_f64, 4.0).expect("OrderedInterval::new should succeed");
let b = OrderedInterval::new(3.0_f64, 7.0).expect("OrderedInterval::new should succeed");
let c = OrderedInterval::new(5.0_f64, 9.0).expect("OrderedInterval::new should succeed");
assert!(a.overlaps(&b));
assert!(!a.overlaps(&c));
}
#[test]
fn test_ordered_interval_intersect() {
let a = OrderedInterval::new(1.0_f64, 4.0).expect("OrderedInterval::new should succeed");
let b = OrderedInterval::new(3.0_f64, 7.0).expect("OrderedInterval::new should succeed");
let inter = a.intersect(&b).expect("intersect should succeed");
assert!((inter.lo - 3.0).abs() < 1e-12);
assert!((inter.hi - 4.0).abs() < 1e-12);
}
#[test]
fn test_ordered_interval_none_when_inverted() {
assert!(OrderedInterval::new(5.0_f64, 1.0).is_none());
}
#[test]
fn test_limsup_inf_basic() {
let lsi = LimSupInf::new(vec![1.0, 3.0, 2.0, 5.0, 4.0]);
assert_eq!(lsi.limsup(), Some(5.0));
assert_eq!(lsi.liminf(), Some(1.0));
assert!(!lsi.converges());
}
#[test]
fn test_limsup_inf_constant() {
let lsi = LimSupInf::new(vec![7.0, 7.0, 7.0]);
assert_eq!(lsi.limsup(), Some(7.0));
assert_eq!(lsi.liminf(), Some(7.0));
assert!(lsi.converges());
assert_eq!(lsi.limit(), Some(7.0));
}
#[test]
fn test_limsup_inf_empty() {
let lsi = LimSupInf::new(vec![]);
assert_eq!(lsi.limsup(), None);
assert_eq!(lsi.liminf(), None);
}
#[test]
fn test_monotone_checker_increasing() {
let checker = MonotoneFnChecker::new(vec![(0.0, 0.0), (1.0, 1.0), (2.0, 4.0)]);
assert!(checker.is_monotone());
assert!(checker.is_strict_mono());
assert!(!checker.is_antitone());
}
#[test]
fn test_monotone_checker_decreasing() {
let checker = MonotoneFnChecker::new(vec![(0.0, 9.0), (1.0, 4.0), (2.0, 1.0)]);
assert!(!checker.is_monotone());
assert!(checker.is_antitone());
}
#[test]
fn test_monotone_checker_flat() {
let checker = MonotoneFnChecker::new(vec![(0.0, 3.0), (1.0, 3.0), (2.0, 3.0)]);
assert!(checker.is_monotone());
assert!(!checker.is_strict_mono());
assert!(checker.is_antitone());
}
#[test]
fn test_order_topology_basis() {
let basis = OrderTopologyBasis::new(vec![1.0, 3.0, 2.0]);
assert_eq!(basis.basis_size(), 9);
let intervals = basis.open_intervals();
assert_eq!(intervals.len(), 3);
assert!(OrderTopologyBasis::in_open_interval(1.0, 3.0, 2.0));
assert!(!OrderTopologyBasis::in_open_interval(1.0, 3.0, 1.0));
}
#[test]
fn test_scott_open_set() {
let s = ScottOpenSet::new(vec![0, 1, 2, 3], |x| x >= 2);
assert!(s.contains(2));
assert!(s.contains(3));
assert!(!s.contains(0));
assert!(s.is_upper_set());
assert_eq!(s.members(), vec![2, 3]);
}
#[test]
fn test_scott_open_set_not_upper() {
let s = ScottOpenSet::new(vec![0, 1, 2, 3], |x| x == 1);
assert!(!s.is_upper_set());
}
#[test]
fn test_total_axiom_count() {
let env = registered_env();
let expected_names = [
"OrderTopology",
"Nhds",
"Filter.atTop",
"Filter.atBot",
"Tendsto",
"ContinuousAt",
"ContinuousOn",
"IsOpen_Ioi",
"IsOpen_Iio",
"OrderTopology.instTopologicalSpace",
"nhds_order_left",
"nhds_order_right",
"Monotone",
"Antitone",
"StrictMono",
"LimSup",
"LimInf",
"UpperSemicontinuous",
"LowerSemicontinuous",
"IsCompact_Icc",
"IntermediateValueThm",
"ExtremeValueThm",
"DiniTheorem",
"MonotoneConvergenceThm",
"DedekindComplete",
"OrderConnected",
"ConnectedSpace",
"OrderTopologyConnected",
"OrderedTopologicalGroup",
"TopologicalLattice",
"ScottOpen",
"ScottTopology",
"LawsonTopology",
"AlexandroffTopology",
"SpecializationOrder",
"BirkhoffRepresentation",
"PriestleyDuality",
"ZornLemma",
"OrdinalTopology",
"NetConvergence",
"OrderBasis_Ioo",
"IsOpen_Ioo",
"IsClosed_Icc",
"OrderTopology.t2Space",
"OrderTopology.regularSpace",
"OrderedFieldTopology",
"Filter.limsup",
"Filter.liminf",
"OrderIsoHomeomorph",
"ContinuousMono_compose",
];
for name in expected_names {
assert!(env.get(&Name::str(name)).is_some(), "Missing axiom: {name}");
}
}
#[test]
fn test_new_extended_axioms_registered() {
let env = registered_env();
let expected = [
"MacNeilleCompletion",
"DedekindCuts",
"SupPreservingMap",
"IntervalTopology",
"OrderEqIntervalTopology",
"ConnectedOrderedSpace",
"LongLine",
"OrdinalOmega1",
"AlexandroffOmega1",
"MonotonicallyNormal",
"GeneralizedOrderedSpace",
"LOTS",
"SorgenfreyLine",
"MichaelLine",
"OrdinalMultiplication",
"OrdinalExponentiation",
"CantorNormalForm",
"HellyOrder",
"ConvexOrderedSet",
"CompactConvexOrdered",
"MonotoneContinuous",
"DiniUniformConvergence",
"CofinalSubnet",
"EventualProperty",
"OrderTopologyBase",
"LGroup",
"RieszSpace",
"ArchimedeanRieszSpace",
"OrderedBanachSpace",
"ConvexCone",
"ConeDuality",
"BooleanSpace",
"SpectralSpace",
"PatchworkTopology",
];
for name in expected {
assert!(
env.get(&Name::str(name)).is_some(),
"Missing new axiom: {name}"
);
}
}
#[test]
fn test_macneille_closed_empty() {
let order = vec![
vec![true, true, true],
vec![false, true, true],
vec![false, false, true],
];
let mc = MacNeilleCompletion::new(order);
assert!(mc.is_closed(&[]));
}
#[test]
fn test_macneille_closed_principal_down() {
let order = vec![
vec![true, true, true],
vec![false, true, true],
vec![false, false, true],
];
let mc = MacNeilleCompletion::new(order);
assert!(mc.is_closed(&[0, 1]));
}
#[test]
fn test_macneille_all_closed_chain() {
let order = vec![
vec![true, true, true],
vec![false, true, true],
vec![false, false, true],
];
let mc = MacNeilleCompletion::new(order);
let closed = mc.all_closed_sets();
assert_eq!(closed.len(), 4, "3-chain has 4 MacNeille closed sets");
}
#[test]
fn test_sorgenfrey_in_basis_set() {
assert!(SorgenfreyLineTopology::in_basis_set(1.0, 3.0, 1.0));
assert!(SorgenfreyLineTopology::in_basis_set(1.0, 3.0, 2.0));
assert!(!SorgenfreyLineTopology::in_basis_set(1.0, 3.0, 3.0));
assert!(!SorgenfreyLineTopology::in_basis_set(1.0, 3.0, 0.5));
}
#[test]
fn test_sorgenfrey_basis_count() {
let sorg = SorgenfreyLineTopology::new(vec![1.0, 2.0, 3.0]);
assert_eq!(sorg.basis_sets().len(), 3);
}
#[test]
fn test_sorgenfrey_intersect_basis() {
let result = SorgenfreyLineTopology::intersect_basis(1.0, 4.0, 2.0, 5.0);
assert!(result.is_some());
let (lo, hi) = result.expect("result should be valid");
assert!((lo - 2.0).abs() < 1e-12);
assert!((hi - 4.0).abs() < 1e-12);
let empty = SorgenfreyLineTopology::intersect_basis(1.0, 2.0, 3.0, 4.0);
assert!(empty.is_none());
}
#[test]
fn test_ordinal_zero() {
let zero = OrdinalArithmetic::zero();
assert!(zero.is_zero());
}
#[test]
fn test_ordinal_add_finite() {
let a = OrdinalArithmetic::new(vec![(0, 3)]);
let b = OrdinalArithmetic::new(vec![(0, 2)]);
let sum = a.add(&b);
assert_eq!(sum.cnf.len(), 1);
assert_eq!(sum.cnf[0], (0, 5));
}
#[test]
fn test_ordinal_add_omega_absorbs() {
let a = OrdinalArithmetic::new(vec![(1, 1)]);
let b = OrdinalArithmetic::new(vec![(0, 1)]);
let sum = a.add(&b);
assert_eq!(sum.cnf.len(), 2);
}
#[test]
fn test_ordinal_compare() {
let a = OrdinalArithmetic::new(vec![(1, 1)]);
let b = OrdinalArithmetic::new(vec![(0, 100)]);
assert_eq!(a.compare(&b), std::cmp::Ordering::Greater);
}
#[test]
fn test_vector_lattice_join_meet() {
let vl = VectorLatticeOps::new(3);
let x = [1.0, -2.0, 3.0];
let y = [-1.0, 4.0, 2.0];
let join = vl.join(&x, &y);
assert_eq!(join, vec![1.0, 4.0, 3.0]);
let meet = vl.meet(&x, &y);
assert_eq!(meet, vec![-1.0, -2.0, 2.0]);
}
#[test]
fn test_vector_lattice_pos_neg_abs() {
let vl = VectorLatticeOps::new(3);
let x = [1.0, -2.0, 0.0];
let xp = vl.pos_part(&x);
assert_eq!(xp, vec![1.0, 0.0, 0.0]);
let xm = vl.neg_part(&x);
assert_eq!(xm, vec![0.0, 2.0, 0.0]);
let xa = vl.abs_val(&x);
assert_eq!(xa, vec![1.0, 2.0, 0.0]);
}
#[test]
fn test_vector_lattice_riesz_decomp() {
let vl = VectorLatticeOps::new(3);
let x = [3.0, -1.5, 0.0];
assert!(vl.check_riesz_decomposition(&x));
}
#[test]
fn test_vector_lattice_le() {
let vl = VectorLatticeOps::new(2);
let x = [1.0, 2.0];
let y = [1.0, 3.0];
let z = [0.0, 2.0];
assert!(vl.le(&x, &y));
assert!(!vl.le(&y, &x));
assert!(!vl.le(&x, &z));
}
}
#[cfg(test)]
mod tests_order_topology_ext {
use super::*;
#[test]
fn test_directed_set() {
let mut ds = DirectedSet::new();
let a = ds.add_element("a");
let b = ds.add_element("b");
let c = ds.add_element("c");
ds.add_relation(a, c);
ds.add_relation(b, c);
assert!(ds.leq(a, c));
assert!(ds.leq(b, c));
assert!(ds.is_directed());
}
#[test]
fn test_net_convergence() {
let vals: Vec<f64> = (0..100).map(|i| 1.0 + 1.0 / (i as f64 + 1.0)).collect();
let mut net = Net::new(vals);
net.detect_convergence(0.05);
assert!(net.converges);
let lim = net.limit.expect("limit should be valid");
assert!(
(lim - 1.0).abs() < 0.1,
"Net should converge to ~1, got {lim}"
);
}
#[test]
fn test_tychonoff_space() {
let r = TychonoffSpaceData::new("R").with_stone_cech("βR");
assert!(!r.is_compact);
assert!(r.stone_cech.is_some());
let unit_interval = TychonoffSpaceData::new("[0,1]");
assert!(!unit_interval.is_paracompact());
assert!(r.embedding_theorem().contains("Stone"));
}
#[test]
fn test_ordered_metric_space() {
let oms = OrderedMetricSpace::from_sorted_reals(vec![1.0, 3.0, 5.0]);
assert!(oms.order_leq(0, 2));
assert!((oms.metric(0, 2).expect("metric should succeed") - 4.0).abs() < 1e-10);
assert_eq!(oms.infimum(1, 2), Some(3.0));
assert_eq!(oms.supremum(0, 2), Some(5.0));
assert!(oms.is_riesz_space());
}
#[test]
fn test_small_ordinal() {
let w = SmallOrdinal::omega();
assert!(w.is_limit());
assert!(!w.is_successor());
let n3 = SmallOrdinal::finite(3);
assert!(n3.is_successor());
assert!(!n3.is_limit());
let wplus3 = w.add(&n3);
assert_eq!(wplus3.omega_coeff, 1);
assert_eq!(wplus3.finite_part, 3);
let three_plus_w = n3.add(&w);
assert_eq!(three_plus_w.omega_coeff, 1);
assert_eq!(three_plus_w.finite_part, 0);
let n3b = SmallOrdinal::finite(3);
let w_times_3 = w.mul(&n3b);
assert_eq!(w_times_3.omega_coeff, 3);
}
}
#[cfg(test)]
mod tests_order_topology_ext2 {
use super::*;
#[test]
fn test_real_interval_closed() {
let i = RealInterval::closed(0.0, 1.0);
assert!(i.contains(0.0));
assert!(i.contains(1.0));
assert!(i.contains(0.5));
assert!(!i.contains(1.5));
assert!(i.is_compact());
assert!((i.length().expect("length should succeed") - 1.0).abs() < 1e-10);
}
#[test]
fn test_real_interval_open() {
let i = RealInterval::open(0.0, 1.0);
assert!(!i.contains(0.0));
assert!(!i.contains(1.0));
assert!(i.contains(0.5));
assert!(!i.is_compact());
}
#[test]
fn test_small_ordinal_zero() {
let z = SmallOrdinal::finite(0);
assert!(z.is_zero());
assert!(!z.is_limit());
assert!(!z.is_successor());
}
}