#![allow(clippy::items_after_test_module)]
use oxilean_kernel::{BinderInfo, Declaration, Environment, Expr, Level, Name};
use super::types::{
HyperfiniteProb, HyperfiniteSet, Hyperreal, HyperrealApprox, InternalSet, LoebMeasure,
PrincipalUltrafilter, TransferPrinciple,
};
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 lam(bi: BinderInfo, name: &str, dom: Expr, body: Expr) -> Expr {
Expr::Lam(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 real_ty() -> Expr {
cst("Real")
}
pub fn bool_ty() -> Expr {
cst("Bool")
}
pub fn set_ty() -> Expr {
cst("Set")
}
pub fn and(p: Expr, q: Expr) -> Expr {
app2(cst("And"), p, q)
}
pub fn or(p: Expr, q: Expr) -> Expr {
app2(cst("Or"), p, q)
}
pub fn not(p: Expr) -> Expr {
app(cst("Not"), p)
}
pub fn iff(p: Expr, q: Expr) -> Expr {
app2(cst("Iff"), p, q)
}
pub fn forall_hyper(name: &str, body: Expr) -> Expr {
pi(BinderInfo::Default, name, hyperreal_ty(), body)
}
pub fn forall_real(name: &str, body: Expr) -> Expr {
pi(BinderInfo::Default, name, real_ty(), body)
}
pub fn exists_hyper(name: &str, body: Expr) -> Expr {
app(
cst("Exists"),
lam(BinderInfo::Default, name, hyperreal_ty(), body),
)
}
pub fn exists_nat(name: &str, body: Expr) -> Expr {
app(
cst("Exists"),
lam(BinderInfo::Default, name, nat_ty(), body),
)
}
pub fn eq_hyper(x: Expr, y: Expr) -> Expr {
app3(cst("Eq"), hyperreal_ty(), x, y)
}
pub fn eq_real(x: Expr, y: Expr) -> Expr {
app3(cst("Eq"), real_ty(), x, y)
}
pub fn hyperreal_ty() -> Expr {
type0()
}
pub fn ultrafilter_ty() -> Expr {
arrow(arrow(nat_ty(), bool_ty()), bool_ty())
}
pub fn internal_set_ty() -> Expr {
arrow(hyperreal_ty(), prop())
}
pub fn internal_fun_ty() -> Expr {
arrow(hyperreal_ty(), hyperreal_ty())
}
pub fn loeb_measure_ty() -> Expr {
arrow(internal_set_ty(), real_ty())
}
pub fn hyper_add_ty() -> Expr {
arrow(hyperreal_ty(), arrow(hyperreal_ty(), hyperreal_ty()))
}
pub fn hyper_mul_ty() -> Expr {
arrow(hyperreal_ty(), arrow(hyperreal_ty(), hyperreal_ty()))
}
pub fn hyper_neg_ty() -> Expr {
arrow(hyperreal_ty(), hyperreal_ty())
}
pub fn hyper_inv_ty() -> Expr {
arrow(hyperreal_ty(), hyperreal_ty())
}
pub fn hyper_le_ty() -> Expr {
arrow(hyperreal_ty(), arrow(hyperreal_ty(), prop()))
}
pub fn hyper_lt_ty() -> Expr {
arrow(hyperreal_ty(), arrow(hyperreal_ty(), prop()))
}
pub fn embed_real_ty() -> Expr {
arrow(real_ty(), hyperreal_ty())
}
pub fn hyperreal_ordered_field_ty() -> Expr {
app(cst("OrderedField"), hyperreal_ty())
}
pub fn embed_real_hom_add_ty() -> Expr {
forall_real(
"r",
forall_real(
"s",
eq_hyper(
app2(
cst("HyperAdd"),
app(cst("EmbedReal"), bvar(1)),
app(cst("EmbedReal"), bvar(0)),
),
app(cst("EmbedReal"), app2(cst("RealAdd"), bvar(1), bvar(0))),
),
),
)
}
pub fn is_infinitesimal_ty() -> Expr {
arrow(hyperreal_ty(), prop())
}
pub fn is_unlimited_ty() -> Expr {
arrow(hyperreal_ty(), prop())
}
pub fn is_finite_ty() -> Expr {
arrow(hyperreal_ty(), prop())
}
pub fn hyper_abs_ty() -> Expr {
arrow(hyperreal_ty(), hyperreal_ty())
}
pub fn monad_ty() -> Expr {
arrow(hyperreal_ty(), internal_set_ty())
}
pub fn galaxy_ty() -> Expr {
arrow(hyperreal_ty(), internal_set_ty())
}
pub fn infinitesimal_exists_ty() -> Expr {
exists_hyper(
"eps",
and(
app(cst("IsInfinitesimal"), bvar(0)),
not(eq_hyper(bvar(0), cst("HyperZero"))),
),
)
}
pub fn unlimited_exists_ty() -> Expr {
exists_hyper("omega", app(cst("IsUnlimited"), bvar(0)))
}
pub fn infinitesimal_sum_ty() -> Expr {
forall_hyper(
"eps",
forall_hyper(
"delta",
arrow(
app(cst("IsInfinitesimal"), bvar(1)),
arrow(
app(cst("IsInfinitesimal"), bvar(0)),
app(
cst("IsInfinitesimal"),
app2(cst("HyperAdd"), bvar(1), bvar(0)),
),
),
),
),
)
}
pub fn infinitesimal_product_finite_ty() -> Expr {
forall_hyper(
"eps",
forall_hyper(
"x",
arrow(
app(cst("IsInfinitesimal"), bvar(1)),
arrow(
app(cst("IsFinite"), bvar(0)),
app(
cst("IsInfinitesimal"),
app2(cst("HyperMul"), bvar(1), bvar(0)),
),
),
),
),
)
}
pub fn transfer_principle_ty() -> Expr {
arrow(cst("FOSentence"), prop())
}
pub fn transfer_fwd_ty() -> Expr {
pi(
BinderInfo::Default,
"phi",
cst("FOSentence"),
arrow(
app(cst("HoldsInReal"), bvar(0)),
app(cst("HoldsInHyperreal"), bvar(0)),
),
)
}
pub fn transfer_bwd_ty() -> Expr {
pi(
BinderInfo::Default,
"phi",
cst("FOSentence"),
arrow(
app(cst("HoldsInHyperreal"), bvar(0)),
app(cst("HoldsInReal"), bvar(0)),
),
)
}
pub fn transfer_iff_ty() -> Expr {
pi(
BinderInfo::Default,
"phi",
cst("FOSentence"),
iff(
app(cst("HoldsInReal"), bvar(0)),
app(cst("HoldsInHyperreal"), bvar(0)),
),
)
}
pub fn internal_algebra_ty() -> Expr {
prop()
}
pub fn internal_inter_ty() -> Expr {
arrow(
internal_set_ty(),
arrow(internal_set_ty(), internal_set_ty()),
)
}
pub fn internal_union_ty() -> Expr {
arrow(
internal_set_ty(),
arrow(internal_set_ty(), internal_set_ty()),
)
}
pub fn internal_complement_ty() -> Expr {
arrow(internal_set_ty(), internal_set_ty())
}
pub fn star_of_set_ty() -> Expr {
arrow(set_ty(), internal_set_ty())
}
pub fn star_of_fun_ty() -> Expr {
arrow(arrow(real_ty(), real_ty()), internal_fun_ty())
}
pub fn overflow_principle_ty() -> Expr {
pi(
BinderInfo::Default,
"A",
internal_set_ty(),
arrow(
arrow(
nat_ty(),
app(bvar(0), app(cst("EmbedReal"), app(cst("OfNat"), bvar(0)))),
),
exists_hyper(
"omega",
and(app(cst("IsUnlimited"), bvar(0)), app(bvar(1), bvar(0))),
),
),
)
}
pub fn underflow_principle_ty() -> Expr {
pi(
BinderInfo::Default,
"A",
internal_set_ty(),
arrow(
forall_hyper(
"eps",
arrow(
app(cst("IsInfinitesimal"), bvar(0)),
arrow(
app2(cst("HyperLt"), cst("HyperZero"), bvar(0)),
app(bvar(1), bvar(0)),
),
),
),
prop(),
),
)
}
pub fn st_part_ty() -> Expr {
arrow(hyperreal_ty(), real_ty())
}
pub fn st_approx_ty() -> Expr {
forall_hyper(
"x",
arrow(
app(cst("IsFinite"), bvar(0)),
app(
cst("IsInfinitesimal"),
app2(
cst("HyperAdd"),
bvar(0),
app(
cst("HyperNeg"),
app(cst("EmbedReal"), app(cst("StPart"), bvar(0))),
),
),
),
),
)
}
pub fn st_unique_ty() -> Expr {
forall_hyper(
"x",
forall_real(
"r",
forall_real(
"s",
arrow(
app(
cst("IsInfinitesimal"),
app2(
cst("HyperAdd"),
bvar(2),
app(cst("HyperNeg"), app(cst("EmbedReal"), bvar(1))),
),
),
arrow(
app(
cst("IsInfinitesimal"),
app2(
cst("HyperAdd"),
bvar(2),
app(cst("HyperNeg"), app(cst("EmbedReal"), bvar(0))),
),
),
eq_real(bvar(1), bvar(0)),
),
),
),
),
)
}
pub fn st_add_ty() -> Expr {
forall_hyper(
"x",
forall_hyper(
"y",
arrow(
app(cst("IsFinite"), bvar(1)),
arrow(
app(cst("IsFinite"), bvar(0)),
eq_real(
app(cst("StPart"), app2(cst("HyperAdd"), bvar(1), bvar(0))),
app2(
cst("RealAdd"),
app(cst("StPart"), bvar(1)),
app(cst("StPart"), bvar(0)),
),
),
),
),
),
)
}
pub fn st_mul_ty() -> Expr {
forall_hyper(
"x",
forall_hyper(
"y",
arrow(
app(cst("IsFinite"), bvar(1)),
arrow(
app(cst("IsFinite"), bvar(0)),
eq_real(
app(cst("StPart"), app2(cst("HyperMul"), bvar(1), bvar(0))),
app2(
cst("RealMul"),
app(cst("StPart"), bvar(1)),
app(cst("StPart"), bvar(0)),
),
),
),
),
),
)
}
pub fn ultrapower_seq_ty() -> Expr {
arrow(nat_ty(), real_ty())
}
pub fn ultrapower_equiv_ty() -> Expr {
arrow(ultrapower_seq_ty(), arrow(ultrapower_seq_ty(), prop()))
}
pub fn ultrapower_constant_ty() -> Expr {
arrow(real_ty(), ultrapower_seq_ty())
}
pub fn ultrapower_is_hyperreal_ty() -> Expr {
pi(
BinderInfo::Default,
"U",
ultrafilter_ty(),
app(cst("IsHyperreal"), app(cst("UltrapowerQuotient"), bvar(0))),
)
}
pub fn los_theorem_ty() -> Expr {
pi(
BinderInfo::Default,
"U",
ultrafilter_ty(),
pi(
BinderInfo::Default,
"phi",
cst("FOSentence"),
iff(
app(cst("HoldsInReal"), bvar(0)),
app2(cst("HoldsInUltrapower"), bvar(1), bvar(0)),
),
),
)
}
pub fn free_ultrafilter_ty() -> Expr {
arrow(ultrafilter_ty(), prop())
}
pub fn is_filter_ty() -> Expr {
arrow(ultrafilter_ty(), prop())
}
pub fn is_ultrafilter_ty() -> Expr {
arrow(ultrafilter_ty(), prop())
}
pub fn free_ultrafilter_exists_ty() -> Expr {
app(
cst("Exists"),
lam(
BinderInfo::Default,
"U",
ultrafilter_ty(),
app(cst("FreeUltrafilter"), bvar(0)),
),
)
}
pub fn ultrafilter_dichotomy_ty() -> Expr {
pi(
BinderInfo::Default,
"U",
ultrafilter_ty(),
arrow(app(cst("IsUltrafilter"), bvar(0)), prop()),
)
}
pub fn ultrafilter_closed_inter_ty() -> Expr {
pi(
BinderInfo::Default,
"U",
ultrafilter_ty(),
arrow(app(cst("IsUltrafilter"), bvar(0)), prop()),
)
}
pub fn internal_measure_ty() -> Expr {
arrow(internal_set_ty(), hyperreal_ty())
}
pub fn loeb_measure_fn_ty() -> Expr {
arrow(internal_set_ty(), real_ty())
}
pub fn loeb_is_measure_ty() -> Expr {
app(cst("IsMeasure"), cst("LoebMeasure"))
}
pub fn loeb_countably_additive_ty() -> Expr {
pi(
BinderInfo::Default,
"A",
arrow(nat_ty(), internal_set_ty()),
arrow(
app(cst("PairwiseDisjoint"), bvar(0)),
eq_real(
app(
cst("LoebMeasure"),
app(cst("InternalUnionCountable"), bvar(0)),
),
app(
cst("SumSeq"),
lam(
BinderInfo::Default,
"n",
nat_ty(),
app(cst("LoebMeasure"), app(bvar(1), bvar(0))),
),
),
),
),
)
}
pub fn loeb_approx_lebesgue_ty() -> Expr {
prop()
}
pub fn nearstandard_ty() -> Expr {
arrow(hyperreal_ty(), prop())
}
pub fn star_open_ty() -> Expr {
arrow(internal_set_ty(), prop())
}
pub fn star_closed_ty() -> Expr {
arrow(internal_set_ty(), prop())
}
pub fn ns_continuity_ty() -> Expr {
arrow(
arrow(real_ty(), real_ty()),
arrow(
real_ty(),
iff(
app2(cst("ContinuousAt"), bvar(1), bvar(0)),
forall_hyper(
"x",
arrow(
app2(cst("Approx"), bvar(0), app(cst("EmbedReal"), bvar(1))),
app2(
cst("Approx"),
app(cst("StarFun"), app2(cst("StarFun"), bvar(2), bvar(0))),
app(cst("EmbedReal"), app(bvar(2), bvar(1))),
),
),
),
),
),
)
}
pub fn ns_compactness_ty() -> Expr {
pi(
BinderInfo::Default,
"K",
set_ty(),
iff(
app(cst("CompactStd"), bvar(0)),
forall_hyper(
"x",
arrow(
app(app(cst("StarOfSet"), bvar(1)), bvar(0)),
and(
app(cst("Nearstandard"), bvar(0)),
app(bvar(1), app(cst("StPart"), bvar(0))),
),
),
),
),
)
}
pub fn ns_uniform_continuity_ty() -> Expr {
arrow(arrow(real_ty(), real_ty()), arrow(set_ty(), prop()))
}
pub fn internal_prob_ty() -> Expr {
arrow(internal_set_ty(), hyperreal_ty())
}
pub fn loeb_prob_ty() -> Expr {
arrow(internal_set_ty(), real_ty())
}
pub fn loeb_prob_is_prob_measure_ty() -> Expr {
pi(
BinderInfo::Default,
"Pstar",
internal_prob_ty(),
app(cst("IsProbMeasure"), app(cst("LoebProbOf"), bvar(0))),
)
}
pub fn ns_independence_ty() -> Expr {
pi(
BinderInfo::Default,
"A",
internal_set_ty(),
pi(
BinderInfo::Default,
"B",
internal_set_ty(),
arrow(
app2(cst("InternallyIndep"), bvar(1), bvar(0)),
app2(cst("LoebIndep"), bvar(1), bvar(0)),
),
),
)
}
pub fn anderson_theorem_ty() -> Expr {
pi(
BinderInfo::Default,
"X",
internal_fun_ty(),
arrow(
app(cst("InternalMartingale"), bvar(0)),
app(cst("StandardMartingale"), app(cst("StLift"), bvar(0))),
),
)
}
pub fn kappa_saturated_ty() -> Expr {
arrow(nat_ty(), prop())
}
pub fn enlargement_principle_ty() -> Expr {
pi(
BinderInfo::Default,
"A",
set_ty(),
pi(
BinderInfo::Default,
"x",
set_ty(),
arrow(
app2(cst("Mem"), bvar(0), bvar(1)),
app(
app(cst("StarOfSet"), bvar(1)),
app(cst("EmbedSet"), bvar(0)),
),
),
),
)
}
pub fn saturation_implies_transfer_ty() -> Expr {
prop()
}
pub fn concurrent_relation_realized_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
arrow(hyperreal_ty(), arrow(hyperreal_ty(), prop())),
arrow(
app(cst("InternalRelation"), bvar(0)),
arrow(
app(cst("Concurrent"), bvar(0)),
exists_hyper(
"y",
forall_hyper(
"x",
arrow(
app(cst("StdElem"), bvar(0)),
app2(bvar(2), bvar(0), bvar(1)),
),
),
),
),
),
)
}
pub fn ns_limit_ty() -> Expr {
arrow(
arrow(real_ty(), real_ty()),
arrow(real_ty(), arrow(real_ty(), prop())),
)
}
pub fn ns_derivative_ty() -> Expr {
arrow(
arrow(real_ty(), real_ty()),
arrow(real_ty(), arrow(real_ty(), prop())),
)
}
pub fn ns_integral_ty() -> Expr {
arrow(
arrow(real_ty(), real_ty()),
arrow(real_ty(), arrow(real_ty(), arrow(real_ty(), prop()))),
)
}
pub fn build_nonstandard_analysis_env(env: &mut Environment) {
let axioms: &[(&str, Expr)] = &[
("Hyperreal", hyperreal_ty()),
("Ultrafilter", ultrafilter_ty()),
("InternalSet", internal_set_ty()),
("InternalFun", internal_fun_ty()),
("LoebMeasure", loeb_measure_ty()),
("FOSentence", type0()),
("HyperZero", hyperreal_ty()),
("HyperOne", hyperreal_ty()),
("HyperAdd", hyper_add_ty()),
("HyperMul", hyper_mul_ty()),
("HyperNeg", hyper_neg_ty()),
("HyperInv", hyper_inv_ty()),
("HyperLe", hyper_le_ty()),
("HyperLt", hyper_lt_ty()),
("HyperAbs", hyper_abs_ty()),
("EmbedReal", embed_real_ty()),
("RealAdd", arrow(real_ty(), arrow(real_ty(), real_ty()))),
("RealMul", arrow(real_ty(), arrow(real_ty(), real_ty()))),
("OrderedField", arrow(type0(), prop())),
("hyperreal_ordered_field", hyperreal_ordered_field_ty()),
("embed_real_hom_add", embed_real_hom_add_ty()),
("IsInfinitesimal", is_infinitesimal_ty()),
("IsUnlimited", is_unlimited_ty()),
("IsFinite", is_finite_ty()),
("Monad", monad_ty()),
("Galaxy", galaxy_ty()),
(
"Approx",
arrow(hyperreal_ty(), arrow(hyperreal_ty(), prop())),
),
("infinitesimal_exists", infinitesimal_exists_ty()),
("unlimited_exists", unlimited_exists_ty()),
("infinitesimal_sum", infinitesimal_sum_ty()),
(
"infinitesimal_product_finite",
infinitesimal_product_finite_ty(),
),
("HoldsInReal", arrow(cst("FOSentence"), prop())),
("HoldsInHyperreal", arrow(cst("FOSentence"), prop())),
(
"HoldsInUltrapower",
arrow(ultrafilter_ty(), arrow(cst("FOSentence"), prop())),
),
("transfer_fwd", transfer_fwd_ty()),
("transfer_bwd", transfer_bwd_ty()),
("transfer_iff", transfer_iff_ty()),
("InternalInter", internal_inter_ty()),
("InternalUnion", internal_union_ty()),
("InternalComplement", internal_complement_ty()),
("StarOfSet", star_of_set_ty()),
("StarOfFun", star_of_fun_ty()),
(
"StarFun",
arrow(
arrow(real_ty(), real_ty()),
arrow(hyperreal_ty(), hyperreal_ty()),
),
),
(
"InternalRelation",
arrow(arrow(hyperreal_ty(), arrow(hyperreal_ty(), prop())), prop()),
),
(
"Concurrent",
arrow(arrow(hyperreal_ty(), arrow(hyperreal_ty(), prop())), prop()),
),
("StdElem", arrow(hyperreal_ty(), prop())),
("overflow_principle", overflow_principle_ty()),
("OfNat", arrow(nat_ty(), real_ty())),
("StPart", st_part_ty()),
("st_approx", st_approx_ty()),
("st_unique", st_unique_ty()),
("st_add", st_add_ty()),
("st_mul", st_mul_ty()),
(
"UltrapowerQuotient",
arrow(ultrafilter_ty(), hyperreal_ty()),
),
("IsHyperreal", arrow(hyperreal_ty(), prop())),
("ultrapower_is_hyperreal", ultrapower_is_hyperreal_ty()),
("los_theorem", los_theorem_ty()),
("FreeUltrafilter", free_ultrafilter_ty()),
("IsFilter", is_filter_ty()),
("IsUltrafilter", is_ultrafilter_ty()),
("free_ultrafilter_exists", free_ultrafilter_exists_ty()),
("ultrafilter_dichotomy", ultrafilter_dichotomy_ty()),
("ultrafilter_closed_inter", ultrafilter_closed_inter_ty()),
("InternalMeasure", internal_measure_ty()),
("LoebMeasureFn", loeb_measure_fn_ty()),
(
"IsMeasure",
arrow(arrow(internal_set_ty(), real_ty()), prop()),
),
("loeb_is_measure", loeb_is_measure_ty()),
(
"PairwiseDisjoint",
arrow(arrow(nat_ty(), internal_set_ty()), prop()),
),
(
"InternalUnionCountable",
arrow(arrow(nat_ty(), internal_set_ty()), internal_set_ty()),
),
("SumSeq", arrow(arrow(nat_ty(), real_ty()), real_ty())),
("loeb_countably_additive", loeb_countably_additive_ty()),
("Nearstandard", nearstandard_ty()),
("StarOpen", star_open_ty()),
("StarClosed", star_closed_ty()),
("CompactStd", arrow(set_ty(), prop())),
(
"ContinuousAt",
arrow(arrow(real_ty(), real_ty()), arrow(real_ty(), prop())),
),
(
"ContinuousOnStd",
arrow(arrow(real_ty(), real_ty()), arrow(set_ty(), prop())),
),
(
"UniformContinuousOnStd",
arrow(arrow(real_ty(), real_ty()), arrow(set_ty(), prop())),
),
("EmbedSet", arrow(set_ty(), hyperreal_ty())),
("ns_continuity", ns_continuity_ty()),
("ns_compactness", ns_compactness_ty()),
("InternalProb", internal_prob_ty()),
(
"LoebProbOf",
arrow(internal_prob_ty(), arrow(internal_set_ty(), real_ty())),
),
(
"IsProbMeasure",
arrow(arrow(internal_set_ty(), real_ty()), prop()),
),
(
"InternallyIndep",
arrow(internal_set_ty(), arrow(internal_set_ty(), prop())),
),
("LoebIndep", arrow(real_ty(), arrow(real_ty(), prop()))),
("InternalMartingale", arrow(internal_fun_ty(), prop())),
("StandardMartingale", arrow(internal_fun_ty(), prop())),
("StLift", arrow(internal_fun_ty(), internal_fun_ty())),
("loeb_prob_is_prob_measure", loeb_prob_is_prob_measure_ty()),
("ns_independence", ns_independence_ty()),
("anderson_theorem", anderson_theorem_ty()),
(
"saturation_implies_transfer",
saturation_implies_transfer_ty(),
),
("enlargement_principle", enlargement_principle_ty()),
(
"concurrent_relation_realized",
concurrent_relation_realized_ty(),
),
(
"LimitAt",
arrow(
arrow(real_ty(), real_ty()),
arrow(real_ty(), arrow(real_ty(), prop())),
),
),
(
"HasDerivAt",
arrow(
arrow(real_ty(), real_ty()),
arrow(real_ty(), arrow(real_ty(), prop())),
),
),
(
"HasIntegral",
arrow(
arrow(real_ty(), real_ty()),
arrow(real_ty(), arrow(real_ty(), arrow(real_ty(), prop()))),
),
),
(
"InternalRiemannSum",
arrow(
arrow(real_ty(), real_ty()),
arrow(
real_ty(),
arrow(real_ty(), arrow(hyperreal_ty(), hyperreal_ty())),
),
),
),
("ns_limit", ns_limit_ty()),
("ns_derivative", ns_derivative_ty()),
("ns_integral", ns_integral_ty()),
];
for (name, ty) in axioms {
env.add(Declaration::Axiom {
name: Name::str(*name),
univ_params: vec![],
ty: ty.clone(),
})
.ok();
}
}
pub fn ns_derivative_approx<F: Fn(f64) -> f64>(f: F, a: f64, h: f64) -> f64 {
if h.abs() < f64::EPSILON {
return f64::NAN;
}
(f(a + h) - f(a)) / h
}
pub fn ns_integral_approx<F: Fn(f64) -> f64>(f: F, a: f64, b: f64, n: usize) -> f64 {
if n == 0 {
return 0.0;
}
let h = (b - a) / n as f64;
(0..n).map(|i| f(a + i as f64 * h) * h).sum()
}
pub fn approx_equal(x: f64, y: f64, tol: f64) -> bool {
(x - y).abs() < tol
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_principal_ultrafilter_contains() {
let u = PrincipalUltrafilter::new(4, 2);
assert!(u.contains_set(0b0100));
assert!(!u.contains_set(0b0011));
assert!(!u.is_free());
}
#[test]
fn test_hyperreal_constant_add() {
let a = HyperrealApprox::constant(3.0, 4, 1);
let b = HyperrealApprox::constant(5.0, 4, 1);
let c = a.add(&b);
assert!((c.value() - 8.0).abs() < 1e-12);
assert!((c.standard_part() - 8.0).abs() < 1e-12);
}
#[test]
fn test_hyperreal_mul() {
let a = HyperrealApprox::constant(2.0, 3, 0);
let b = HyperrealApprox::constant(7.0, 3, 0);
let c = a.mul(&b);
assert!((c.value() - 14.0).abs() < 1e-12);
}
#[test]
fn test_ns_derivative_linear() {
let f = |x: f64| 3.0 * x + 1.0;
let deriv = ns_derivative_approx(f, 2.0, 1e-7);
assert!((deriv - 3.0).abs() < 1e-5);
}
#[test]
fn test_ns_integral_quadratic() {
let f = |x: f64| x * x;
let integral = ns_integral_approx(f, 0.0, 1.0, 100_000);
assert!((integral - 1.0 / 3.0).abs() < 1e-4);
}
#[test]
fn test_hyperfinite_prob_independence() {
let space = HyperfiniteProb::new(8);
let a: Vec<usize> = (0..4).collect();
let b: Vec<usize> = (0..8).filter(|x| x % 2 == 0).collect();
assert!(space.loeb_independent(&a, &b));
}
#[test]
fn test_hyperfinite_prob_non_independence() {
let space = HyperfiniteProb::new(4);
let a = vec![0usize, 1];
let b = vec![0usize];
assert!(!space.loeb_independent(&a, &b));
}
#[test]
fn test_build_nonstandard_analysis_env() {
let mut env = Environment::new();
build_nonstandard_analysis_env(&mut env);
assert!(env.get(&Name::str("Hyperreal")).is_some());
assert!(env.get(&Name::str("IsInfinitesimal")).is_some());
assert!(env.get(&Name::str("StPart")).is_some());
assert!(env.get(&Name::str("transfer_iff")).is_some());
assert!(env.get(&Name::str("loeb_is_measure")).is_some());
assert!(env.get(&Name::str("free_ultrafilter_exists")).is_some());
assert!(env
.get(&Name::str("concurrent_relation_realized"))
.is_some());
}
}
#[allow(dead_code)]
pub fn nsa_ext_hyperreal() -> Expr {
cst("Hyperreal")
}
#[allow(dead_code)]
pub fn nsa_ext_real() -> Expr {
cst("Real")
}
#[allow(dead_code)]
pub fn nsa_ext_nat() -> Expr {
cst("Nat")
}
#[allow(dead_code)]
pub fn nsa_ext_prop() -> Expr {
Expr::Sort(Level::zero())
}
#[allow(dead_code)]
pub fn nsa_ext_type0() -> Expr {
Expr::Sort(Level::succ(Level::zero()))
}
#[allow(dead_code)]
pub fn nsa_ext_pi(name: &str, dom: Expr, body: Expr) -> Expr {
Expr::Pi(
BinderInfo::Default,
Name::str(name),
Box::new(dom),
Box::new(body),
)
}
#[allow(dead_code)]
pub fn nsa_ext_arrow(a: Expr, b: Expr) -> Expr {
nsa_ext_pi("_", a, b)
}
#[allow(dead_code)]
pub fn nsa_ext_iff(a: Expr, b: Expr) -> Expr {
app2(cst("Iff"), a, b)
}
#[allow(dead_code)]
pub fn nsa_ext_and(a: Expr, b: Expr) -> Expr {
app2(cst("And"), a, b)
}
#[allow(dead_code)]
pub fn nsa_ext_not(a: Expr) -> Expr {
app(cst("Not"), a)
}
#[allow(dead_code)]
pub fn nsa_ext_or(a: Expr, b: Expr) -> Expr {
app2(cst("Or"), a, b)
}
#[allow(dead_code)]
pub fn nsa_ext_eq(ty: Expr, a: Expr, b: Expr) -> Expr {
app3(cst("Eq"), ty, a, b)
}
#[allow(dead_code)]
pub fn nsa_ext_internal_subset_ty() -> Expr {
nsa_ext_arrow(
cst("InternalSet"),
nsa_ext_arrow(cst("InternalSet"), nsa_ext_prop()),
)
}
#[allow(dead_code)]
pub fn nsa_ext_internal_inter_closed_ty() -> Expr {
nsa_ext_pi(
"A",
cst("InternalSet"),
nsa_ext_pi(
"B",
cst("InternalSet"),
app(cst("Nonempty"), cst("InternalSet")),
),
)
}
#[allow(dead_code)]
pub fn nsa_ext_sigma_saturation_ty() -> Expr {
nsa_ext_arrow(
nsa_ext_arrow(nsa_ext_nat(), cst("InternalSet")),
nsa_ext_arrow(
app(
cst("HasFIP"),
nsa_ext_arrow(nsa_ext_nat(), cst("InternalSet")),
),
app(cst("Nonempty"), cst("Hyperreal")),
),
)
}
#[allow(dead_code)]
pub fn nsa_ext_kappa_saturation_existence_ty() -> Expr {
nsa_ext_arrow(
app(cst("IsInfiniteCardinal"), nsa_ext_nat()),
app(cst("Nonempty"), cst("Hyperreal")),
)
}
#[allow(dead_code)]
pub fn nsa_ext_overflow_for_internal_sets_ty() -> Expr {
nsa_ext_pi(
"A",
cst("InternalSet"),
nsa_ext_arrow(
nsa_ext_pi(
"n",
nsa_ext_nat(),
app2(cst("InternalMem"), cst("n"), Expr::BVar(1)),
),
app(cst("Nonempty"), cst("Hyperreal")),
),
)
}
#[allow(dead_code)]
pub fn nsa_ext_underflow_for_internal_sets_ty() -> Expr {
nsa_ext_pi(
"A",
cst("InternalSet"),
nsa_ext_arrow(
app(cst("InternalBoundedAbove"), Expr::BVar(0)),
app(cst("Nonempty"), cst("Hyperreal")),
),
)
}
#[allow(dead_code)]
pub fn nsa_ext_hyperfinite_set_ty() -> Expr {
nsa_ext_type0()
}
#[allow(dead_code)]
pub fn nsa_ext_hyperfinite_cardinality_ty() -> Expr {
nsa_ext_arrow(cst("HyperfiniteSet"), cst("Hyperreal"))
}
#[allow(dead_code)]
pub fn nsa_ext_hyperfinite_interval_ty() -> Expr {
nsa_ext_arrow(
cst("Hyperreal"),
app(cst("IsHyperfinite"), cst("HyperfiniteInterval")),
)
}
#[allow(dead_code)]
pub fn nsa_ext_hyperfinite_sum_ty() -> Expr {
nsa_ext_arrow(
cst("HyperfiniteSet"),
nsa_ext_arrow(
nsa_ext_arrow(cst("Hyperreal"), cst("Hyperreal")),
cst("Hyperreal"),
),
)
}
#[allow(dead_code)]
pub fn nsa_ext_hyperfinite_product_ty() -> Expr {
nsa_ext_arrow(
cst("HyperfiniteSet"),
nsa_ext_arrow(
nsa_ext_arrow(cst("Hyperreal"), cst("Hyperreal")),
cst("Hyperreal"),
),
)
}
#[allow(dead_code)]
pub fn nsa_ext_loeb_sigma_algebra_ty() -> Expr {
nsa_ext_arrow(cst("HyperfiniteSet"), nsa_ext_type0())
}
#[allow(dead_code)]
pub fn nsa_ext_loeb_measure_extends_counting_ty() -> Expr {
nsa_ext_pi(
"S",
cst("HyperfiniteSet"),
nsa_ext_pi(
"A",
cst("InternalSet"),
nsa_ext_eq(
nsa_ext_real(),
app2(cst("LoebMeasOf"), Expr::BVar(1), Expr::BVar(0)),
app(
cst("StPart"),
app2(
cst("NormalizedCountingMeasure"),
Expr::BVar(1),
Expr::BVar(0),
),
),
),
),
)
}
#[allow(dead_code)]
pub fn nsa_ext_nonstandard_integral_as_loeb_ty() -> Expr {
nsa_ext_pi(
"f",
nsa_ext_arrow(nsa_ext_real(), nsa_ext_real()),
nsa_ext_pi(
"a",
nsa_ext_real(),
nsa_ext_pi(
"b",
nsa_ext_real(),
nsa_ext_iff(
app3(
cst("HasLebesgueIntegral"),
Expr::BVar(2),
Expr::BVar(1),
Expr::BVar(0),
),
app3(
cst("HasLoebIntegral"),
Expr::BVar(2),
Expr::BVar(1),
Expr::BVar(0),
),
),
),
),
)
}
#[allow(dead_code)]
pub fn nsa_ext_loeb_anderson_theorem_ty() -> Expr {
nsa_ext_arrow(
cst("HyperfiniteRandomWalk"),
nsa_ext_arrow(
cst("LoebProbSpace"),
app(cst("IsWienerProcess"), cst("BrownianMotion")),
),
)
}
#[allow(dead_code)]
pub fn nsa_ext_s_continuous_iff_continuous_ty() -> Expr {
nsa_ext_pi(
"f",
nsa_ext_arrow(nsa_ext_real(), nsa_ext_real()),
nsa_ext_pi(
"x",
nsa_ext_real(),
nsa_ext_iff(
app2(cst("ContinuousAt"), Expr::BVar(1), Expr::BVar(0)),
app2(
cst("SContinuousAt"),
Expr::BVar(1),
app(cst("EmbedReal"), Expr::BVar(0)),
),
),
),
)
}
#[allow(dead_code)]
pub fn nsa_ext_s_differentiable_iff_differentiable_ty() -> Expr {
nsa_ext_pi(
"f",
nsa_ext_arrow(nsa_ext_real(), nsa_ext_real()),
nsa_ext_pi(
"x",
nsa_ext_real(),
nsa_ext_iff(
app2(cst("DifferentiableAt"), Expr::BVar(1), Expr::BVar(0)),
app2(
cst("SDifferentiableAt"),
Expr::BVar(1),
app(cst("EmbedReal"), Expr::BVar(0)),
),
),
),
)
}
#[allow(dead_code)]
pub fn nsa_ext_s_continuous_at_standard_ty() -> Expr {
nsa_ext_pi(
"f",
nsa_ext_arrow(nsa_ext_real(), nsa_ext_real()),
nsa_ext_pi(
"x",
nsa_ext_real(),
nsa_ext_arrow(
app2(
cst("SContinuousAt"),
Expr::BVar(1),
app(cst("EmbedReal"), Expr::BVar(0)),
),
nsa_ext_pi(
"y",
nsa_ext_hyperreal(),
nsa_ext_arrow(
app2(
cst("Approx"),
Expr::BVar(0),
app(cst("EmbedReal"), Expr::BVar(2)),
),
app2(
cst("Approx"),
app(cst("StarFun"), app(Expr::BVar(3), Expr::BVar(0))),
app(cst("EmbedReal"), app(Expr::BVar(3), Expr::BVar(2))),
),
),
),
),
),
)
}
#[allow(dead_code)]
pub fn nsa_ext_hyperfinite_dft_ty() -> Expr {
nsa_ext_arrow(
nsa_ext_arrow(cst("Hyperreal"), cst("Hyperreal")),
nsa_ext_arrow(
cst("HyperfiniteSet"),
nsa_ext_arrow(cst("Hyperreal"), cst("Hyperreal")),
),
)
}
#[allow(dead_code)]
pub fn nsa_ext_hyperfinite_dft_inversion_ty() -> Expr {
nsa_ext_arrow(
app(cst("IsHyperfinite"), cst("HyperfiniteSet")),
nsa_ext_arrow(
nsa_ext_arrow(cst("Hyperreal"), cst("Hyperreal")),
nsa_ext_eq(
nsa_ext_arrow(cst("Hyperreal"), cst("Hyperreal")),
app(cst("InverseDFT"), app(cst("HyperfiniteDFT"), cst("f"))),
cst("f"),
),
),
)
}
#[allow(dead_code)]
pub fn nsa_ext_hyperfinite_dft_approx_fourier_ty() -> Expr {
nsa_ext_pi(
"f",
nsa_ext_arrow(nsa_ext_real(), nsa_ext_real()),
nsa_ext_pi(
"xi",
nsa_ext_real(),
app2(
cst("Approx"),
app2(
cst("HyperfiniteDFT"),
app(cst("StarFun"), Expr::BVar(1)),
app(cst("EmbedReal"), Expr::BVar(0)),
),
app(
cst("EmbedReal"),
app2(cst("FourierTransform"), Expr::BVar(1), Expr::BVar(0)),
),
),
),
)
}
#[allow(dead_code)]
pub fn nsa_ext_monad_subset_galaxy_ty() -> Expr {
nsa_ext_pi(
"x",
nsa_ext_hyperreal(),
app2(
cst("InternalSubset"),
app(cst("Monad"), Expr::BVar(0)),
app(cst("Galaxy"), Expr::BVar(0)),
),
)
}
#[allow(dead_code)]
pub fn nsa_ext_monad_intersection_standard_ty() -> Expr {
nsa_ext_pi(
"r",
nsa_ext_real(),
nsa_ext_eq(
cst("InternalSet"),
app(cst("Monad"), app(cst("EmbedReal"), Expr::BVar(0))),
app(cst("Singleton"), app(cst("EmbedReal"), Expr::BVar(0))),
),
)
}
#[allow(dead_code)]
pub fn nsa_ext_open_iff_monad_contained_ty() -> Expr {
nsa_ext_pi(
"U",
app(cst("Set"), nsa_ext_real()),
nsa_ext_iff(
app(cst("IsOpen"), Expr::BVar(0)),
nsa_ext_pi(
"x",
nsa_ext_real(),
nsa_ext_arrow(
app2(cst("Mem"), Expr::BVar(0), Expr::BVar(1)),
app2(
cst("InternalSubset"),
app(cst("Monad"), app(cst("EmbedReal"), Expr::BVar(0))),
app(cst("StarOfSet"), Expr::BVar(1)),
),
),
),
),
)
}
#[allow(dead_code)]
pub fn nsa_ext_compact_iff_all_nearstandard_ty() -> Expr {
nsa_ext_pi(
"K",
app(cst("Set"), nsa_ext_real()),
nsa_ext_iff(
app(cst("IsCompact"), Expr::BVar(0)),
nsa_ext_pi(
"x",
nsa_ext_hyperreal(),
nsa_ext_arrow(
app2(
cst("HyperMem"),
Expr::BVar(0),
app(cst("StarOfSet"), Expr::BVar(1)),
),
app(cst("Nearstandard"), Expr::BVar(0)),
),
),
),
)
}
#[allow(dead_code)]
pub fn nsa_ext_loeb_outer_measure_ty() -> Expr {
nsa_ext_arrow(
cst("HyperfiniteSet"),
nsa_ext_arrow(app(cst("Set"), nsa_ext_hyperreal()), nsa_ext_real()),
)
}
#[allow(dead_code)]
pub fn nsa_ext_loeb_completion_ty() -> Expr {
nsa_ext_pi(
"S",
cst("HyperfiniteSet"),
app(
cst("IsMeasureComplete"),
app(cst("LoebMeasOf"), Expr::BVar(0)),
),
)
}
#[allow(dead_code)]
pub fn nsa_ext_ns_lebesgue_from_loeb_ty() -> Expr {
nsa_ext_pi(
"f",
nsa_ext_arrow(nsa_ext_real(), nsa_ext_real()),
nsa_ext_pi(
"a",
nsa_ext_real(),
nsa_ext_pi(
"b",
nsa_ext_real(),
nsa_ext_eq(
nsa_ext_real(),
app(
cst("StPart"),
app3(
cst("LoebIntegral"),
Expr::BVar(2),
Expr::BVar(1),
Expr::BVar(0),
),
),
app3(
cst("LebesgueIntegral"),
Expr::BVar(2),
Expr::BVar(1),
Expr::BVar(0),
),
),
),
),
)
}
#[allow(dead_code)]
pub fn nsa_ext_bernstein_transfer_ty() -> Expr {
nsa_ext_arrow(
cst("BorelSentence"),
nsa_ext_iff(
app(cst("HoldsInBorelReal"), Expr::BVar(0)),
app(cst("HoldsInHyperBorel"), Expr::BVar(0)),
),
)
}
#[allow(dead_code)]
pub fn nsa_ext_full_saturation_transfer_ty() -> Expr {
nsa_ext_arrow(
app(cst("IsFullySaturated"), cst("Hyperreal")),
nsa_ext_pi(
"phi",
cst("InternalSentence"),
nsa_ext_iff(
app(cst("HoldsInReal"), Expr::BVar(0)),
app(cst("HoldsInHyperreal"), Expr::BVar(0)),
),
),
)
}
#[allow(dead_code)]
pub fn nsa_ext_ns_compactness_sequential_ty() -> Expr {
nsa_ext_pi(
"X",
nsa_ext_type0(),
nsa_ext_iff(
app(cst("IsSequentiallyCompact"), Expr::BVar(0)),
nsa_ext_pi(
"x",
app(cst("StarOf"), Expr::BVar(1)),
app(cst("Nearstandard"), Expr::BVar(0)),
),
),
)
}
#[allow(dead_code)]
pub fn nsa_ext_ns_tychonoff_ty() -> Expr {
nsa_ext_pi(
"I",
nsa_ext_type0(),
nsa_ext_pi(
"X",
nsa_ext_arrow(Expr::BVar(0), nsa_ext_type0()),
nsa_ext_arrow(
nsa_ext_pi(
"i",
Expr::BVar(1),
app(cst("IsCompact"), app(Expr::BVar(1), Expr::BVar(0))),
),
app(
cst("IsCompact"),
app2(cst("PiType"), Expr::BVar(2), Expr::BVar(1)),
),
),
),
)
}
#[allow(dead_code)]
pub fn nsa_ext_nsa_ramsey_ty() -> Expr {
nsa_ext_pi(
"r",
nsa_ext_nat(),
nsa_ext_pi(
"k",
nsa_ext_nat(),
app(
cst("Nonempty"),
app(
cst("RamseyWitness"),
app2(cst("RamseyPair"), Expr::BVar(1), Expr::BVar(0)),
),
),
),
)
}
#[allow(dead_code)]
pub fn nsa_ext_nsa_brouwer_fixed_point_ty() -> Expr {
nsa_ext_pi(
"n",
nsa_ext_nat(),
nsa_ext_pi(
"f",
nsa_ext_arrow(
app(cst("Disk"), Expr::BVar(0)),
app(cst("Disk"), Expr::BVar(1)),
),
nsa_ext_arrow(
app(cst("IsContinuous"), Expr::BVar(0)),
app(cst("Nonempty"), app(cst("FixedPoint"), Expr::BVar(1))),
),
),
)
}
#[allow(dead_code)]
pub fn nsa_ext_nsa_intermediate_value_ty() -> Expr {
nsa_ext_pi(
"f",
nsa_ext_arrow(nsa_ext_real(), nsa_ext_real()),
nsa_ext_pi(
"a",
nsa_ext_real(),
nsa_ext_pi(
"b",
nsa_ext_real(),
nsa_ext_pi(
"y",
nsa_ext_real(),
nsa_ext_arrow(
app(cst("IsContinuous"), Expr::BVar(3)),
nsa_ext_arrow(
app2(
cst("Between"),
app(Expr::BVar(3), Expr::BVar(2)),
app(Expr::BVar(3), Expr::BVar(1)),
),
app(
cst("Nonempty"),
app(
cst("IVTWitness"),
app3(
cst("IVTData"),
Expr::BVar(3),
Expr::BVar(2),
Expr::BVar(1),
),
),
),
),
),
),
),
),
)
}
#[allow(dead_code)]
pub fn nsa_ext_nsa_bolzano_weierstrass_ty() -> Expr {
nsa_ext_pi(
"seq",
nsa_ext_arrow(nsa_ext_nat(), nsa_ext_real()),
nsa_ext_arrow(
app(cst("IsBounded"), Expr::BVar(0)),
app(cst("HasConvergentSubsequence"), Expr::BVar(1)),
),
)
}
#[allow(dead_code)]
pub fn nsa_ext_nsa_arzela_ascoli_ty() -> Expr {
nsa_ext_pi(
"F",
app(cst("FunctionFamily"), nsa_ext_real()),
nsa_ext_iff(
nsa_ext_and(
app(cst("IsEquicontinuous"), Expr::BVar(0)),
app(cst("IsPointwiseBounded"), Expr::BVar(0)),
),
app(cst("IsRelativelyCompact"), Expr::BVar(0)),
),
)
}
#[allow(dead_code)]
pub fn nsa_ext_enlargement_existence_ty() -> Expr {
nsa_ext_pi(
"M",
nsa_ext_type0(),
app(
cst("Nonempty"),
app(cst("ProperElementaryExtension"), Expr::BVar(0)),
),
)
}
#[allow(dead_code)]
pub fn nsa_ext_enlargement_internal_sets_ty() -> Expr {
nsa_ext_pi(
"M",
nsa_ext_type0(),
nsa_ext_pi(
"ext",
app(cst("ElementaryExtension"), Expr::BVar(0)),
nsa_ext_pi(
"A",
app(cst("Set"), Expr::BVar(1)),
app(cst("IsInternal"), app(cst("StarOfSet"), Expr::BVar(0))),
),
),
)
}
pub fn register_nonstandard_analysis_extended(env: &mut Environment) -> Result<(), String> {
let axioms: &[(&str, Expr)] = &[
("nsa_internal_subset", nsa_ext_internal_subset_ty()),
(
"nsa_internal_inter_closed",
nsa_ext_internal_inter_closed_ty(),
),
("nsa_sigma_saturation", nsa_ext_sigma_saturation_ty()),
(
"nsa_kappa_sat_existence",
nsa_ext_kappa_saturation_existence_ty(),
),
(
"nsa_overflow_internal",
nsa_ext_overflow_for_internal_sets_ty(),
),
(
"nsa_underflow_internal",
nsa_ext_underflow_for_internal_sets_ty(),
),
("nsa_hyperfinite_set", nsa_ext_hyperfinite_set_ty()),
(
"nsa_hyperfinite_cardinality",
nsa_ext_hyperfinite_cardinality_ty(),
),
(
"nsa_hyperfinite_interval",
nsa_ext_hyperfinite_interval_ty(),
),
("nsa_hyperfinite_sum", nsa_ext_hyperfinite_sum_ty()),
("nsa_hyperfinite_product", nsa_ext_hyperfinite_product_ty()),
("nsa_loeb_sigma_algebra", nsa_ext_loeb_sigma_algebra_ty()),
(
"nsa_loeb_extends_counting",
nsa_ext_loeb_measure_extends_counting_ty(),
),
(
"nsa_ns_integral_as_loeb",
nsa_ext_nonstandard_integral_as_loeb_ty(),
),
("nsa_loeb_anderson", nsa_ext_loeb_anderson_theorem_ty()),
(
"nsa_s_continuous_iff",
nsa_ext_s_continuous_iff_continuous_ty(),
),
(
"nsa_s_differentiable_iff",
nsa_ext_s_differentiable_iff_differentiable_ty(),
),
(
"nsa_s_continuous_at_std",
nsa_ext_s_continuous_at_standard_ty(),
),
("nsa_hyperfinite_dft", nsa_ext_hyperfinite_dft_ty()),
(
"nsa_hyperfinite_dft_inversion",
nsa_ext_hyperfinite_dft_inversion_ty(),
),
(
"nsa_hyperfinite_dft_approx",
nsa_ext_hyperfinite_dft_approx_fourier_ty(),
),
("nsa_monad_subset_galaxy", nsa_ext_monad_subset_galaxy_ty()),
(
"nsa_monad_at_standard",
nsa_ext_monad_intersection_standard_ty(),
),
("nsa_open_iff_monad", nsa_ext_open_iff_monad_contained_ty()),
(
"nsa_compact_iff_nearstd",
nsa_ext_compact_iff_all_nearstandard_ty(),
),
("nsa_loeb_outer_measure", nsa_ext_loeb_outer_measure_ty()),
("nsa_loeb_completion", nsa_ext_loeb_completion_ty()),
("nsa_lebesgue_from_loeb", nsa_ext_ns_lebesgue_from_loeb_ty()),
("nsa_bernstein_transfer", nsa_ext_bernstein_transfer_ty()),
(
"nsa_full_sat_transfer",
nsa_ext_full_saturation_transfer_ty(),
),
(
"nsa_seq_compactness",
nsa_ext_ns_compactness_sequential_ty(),
),
("nsa_tychonoff", nsa_ext_ns_tychonoff_ty()),
("nsa_ramsey", nsa_ext_nsa_ramsey_ty()),
("nsa_brouwer_fp", nsa_ext_nsa_brouwer_fixed_point_ty()),
("nsa_ivt", nsa_ext_nsa_intermediate_value_ty()),
(
"nsa_bolzano_weierstrass",
nsa_ext_nsa_bolzano_weierstrass_ty(),
),
("nsa_arzela_ascoli", nsa_ext_nsa_arzela_ascoli_ty()),
(
"nsa_enlargement_existence",
nsa_ext_enlargement_existence_ty(),
),
(
"nsa_enlargement_internal",
nsa_ext_enlargement_internal_sets_ty(),
),
];
for (name, ty) in axioms {
env.add(Declaration::Axiom {
name: Name::str(*name),
univ_params: vec![],
ty: ty.clone(),
})
.map_err(|e| format!("{e:?}"))?;
}
Ok(())
}