use oxilean_kernel::{BinderInfo, Declaration, Environment, Expr, Level, Name};
#[allow(dead_code)]
pub fn app(f: Expr, a: Expr) -> Expr {
Expr::App(Box::new(f), Box::new(a))
}
#[allow(dead_code)]
pub fn app2(f: Expr, a: Expr, b: Expr) -> Expr {
app(app(f, a), b)
}
#[allow(dead_code)]
pub fn app3(f: Expr, a: Expr, b: Expr, c: Expr) -> Expr {
app(app2(f, a, b), c)
}
#[allow(dead_code)]
pub fn app4(f: Expr, a: Expr, b: Expr, c: Expr, d: Expr) -> Expr {
app(app3(f, a, b, c), d)
}
#[allow(dead_code)]
pub fn app5(f: Expr, a: Expr, b: Expr, c: Expr, d: Expr, e: Expr) -> Expr {
app(app4(f, a, b, c, d), e)
}
pub fn cst(s: &str) -> Expr {
Expr::Const(Name::str(s), vec![])
}
#[allow(dead_code)]
pub fn cst_u(s: &str, levels: Vec<Level>) -> Expr {
Expr::Const(Name::str(s), levels)
}
pub fn prop() -> Expr {
Expr::Sort(Level::zero())
}
pub fn type0() -> Expr {
Expr::Sort(Level::succ(Level::zero()))
}
#[allow(dead_code)]
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))
}
#[allow(dead_code)]
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 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 vec_type() -> Expr {
pi(
BinderInfo::Default,
"n",
nat_ty(),
pi(BinderInfo::Default, "α", type0(), type0()),
)
}
pub fn vec_zero_ty() -> Expr {
impl_pi(
"n",
nat_ty(),
impl_pi(
"α",
type0(),
arrow(
app2(cst("Zero"), cst("α"), cst("α")),
app2(cst("Vec"), cst("n"), cst("α")),
),
),
)
}
pub fn vec_add_ty() -> Expr {
impl_pi(
"n",
nat_ty(),
impl_pi(
"α",
type0(),
arrow(
app(cst("Add"), cst("α")),
arrow(
app2(cst("Vec"), bvar(1), bvar(1)),
arrow(
app2(cst("Vec"), bvar(2), bvar(2)),
app2(cst("Vec"), bvar(3), bvar(3)),
),
),
),
),
)
}
pub fn vec_smul_ty() -> Expr {
impl_pi(
"n",
nat_ty(),
impl_pi(
"α",
type0(),
arrow(
app(cst("Mul"), cst("α")),
arrow(
cst("α"),
arrow(
app2(cst("Vec"), bvar(2), bvar(2)),
app2(cst("Vec"), bvar(3), bvar(3)),
),
),
),
),
)
}
pub fn vec_dot_ty() -> Expr {
impl_pi(
"n",
nat_ty(),
impl_pi(
"α",
type0(),
arrow(
app2(cst("Vec"), bvar(0), bvar(0)),
arrow(app2(cst("Vec"), bvar(1), bvar(1)), bvar(1)),
),
),
)
}
pub fn vec_norm_sq_ty() -> Expr {
impl_pi(
"n",
nat_ty(),
impl_pi(
"α",
type0(),
arrow(app2(cst("Vec"), bvar(0), bvar(0)), bvar(0)),
),
)
}
pub fn matrix_type() -> Expr {
pi(
BinderInfo::Default,
"m",
nat_ty(),
pi(
BinderInfo::Default,
"n",
nat_ty(),
pi(BinderInfo::Default, "α", type0(), type0()),
),
)
}
pub fn matrix_zero_ty() -> Expr {
impl_pi(
"m",
nat_ty(),
impl_pi(
"n",
nat_ty(),
impl_pi(
"α",
type0(),
arrow(
app(cst("Zero"), bvar(0)),
app3(cst("Matrix"), bvar(2), bvar(1), bvar(0)),
),
),
),
)
}
pub fn matrix_add_ty() -> Expr {
impl_pi(
"m",
nat_ty(),
impl_pi(
"n",
nat_ty(),
impl_pi(
"α",
type0(),
arrow(
app(cst("Add"), bvar(0)),
arrow(
app3(cst("Matrix"), bvar(2), bvar(1), bvar(0)),
arrow(
app3(cst("Matrix"), bvar(3), bvar(2), bvar(1)),
app3(cst("Matrix"), bvar(4), bvar(3), bvar(2)),
),
),
),
),
),
)
}
pub fn matrix_mul_ty() -> Expr {
impl_pi(
"m",
nat_ty(),
impl_pi(
"n",
nat_ty(),
impl_pi(
"k",
nat_ty(),
impl_pi(
"α",
type0(),
arrow(
app3(cst("Matrix"), bvar(2), bvar(1), bvar(0)),
arrow(
app3(cst("Matrix"), bvar(2), bvar(1), bvar(0)),
app3(cst("Matrix"), bvar(3), bvar(1), bvar(0)),
),
),
),
),
),
)
}
pub fn matrix_transpose_ty() -> Expr {
impl_pi(
"m",
nat_ty(),
impl_pi(
"n",
nat_ty(),
impl_pi(
"α",
type0(),
arrow(
app3(cst("Matrix"), bvar(1), bvar(0), bvar(0)),
app3(cst("Matrix"), bvar(1), bvar(2), bvar(0)),
),
),
),
)
}
pub fn matrix_identity_ty() -> Expr {
impl_pi(
"n",
nat_ty(),
impl_pi(
"α",
type0(),
arrow(
app(cst("Zero"), bvar(0)),
arrow(
app(cst("One"), bvar(1)),
app3(cst("Matrix"), bvar(2), bvar(2), bvar(2)),
),
),
),
)
}
pub fn matrix_det_ty() -> Expr {
impl_pi(
"n",
nat_ty(),
impl_pi(
"α",
type0(),
arrow(
app(cst("CommRing"), bvar(0)),
arrow(app3(cst("Matrix"), bvar(1), bvar(1), bvar(0)), bvar(0)),
),
),
)
}
pub fn matrix_trace_ty() -> Expr {
impl_pi(
"n",
nat_ty(),
impl_pi(
"α",
type0(),
arrow(app3(cst("Matrix"), bvar(0), bvar(0), bvar(0)), bvar(0)),
),
)
}
pub fn matrix_rank_ty() -> Expr {
impl_pi(
"m",
nat_ty(),
impl_pi(
"n",
nat_ty(),
impl_pi(
"α",
type0(),
arrow(
app(cst("Field"), bvar(0)),
arrow(app3(cst("Matrix"), bvar(2), bvar(1), bvar(0)), nat_ty()),
),
),
),
)
}
pub fn linear_map_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
pi(
BinderInfo::Default,
"M",
type0(),
pi(BinderInfo::Default, "N", type0(), type0()),
),
)
}
pub fn linear_map_apply_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi(
"M",
type0(),
impl_pi(
"N",
type0(),
arrow(
app3(cst("LinearMap"), bvar(2), bvar(1), bvar(0)),
arrow(bvar(1), bvar(1)),
),
),
),
)
}
pub fn linear_map_comp_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi(
"M",
type0(),
impl_pi(
"N",
type0(),
impl_pi(
"P",
type0(),
arrow(
app3(cst("LinearMap"), bvar(3), bvar(2), bvar(1)),
arrow(
app3(cst("LinearMap"), bvar(3), bvar(1), bvar(0)),
app3(cst("LinearMap"), bvar(3), bvar(2), bvar(0)),
),
),
),
),
),
)
}
pub fn linear_map_ker_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi(
"M",
type0(),
impl_pi(
"N",
type0(),
arrow(
app3(cst("LinearMap"), bvar(2), bvar(1), bvar(0)),
app2(cst("Submodule"), bvar(2), bvar(1)),
),
),
),
)
}
pub fn linear_map_range_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi(
"M",
type0(),
impl_pi(
"N",
type0(),
arrow(
app3(cst("LinearMap"), bvar(2), bvar(1), bvar(0)),
app2(cst("Submodule"), bvar(2), bvar(0)),
),
),
),
)
}
pub fn inner_product_ty() -> Expr {
impl_pi(
"E",
type0(),
arrow(
app2(cst("InnerProductSpace"), cst("Real"), bvar(0)),
arrow(bvar(0), arrow(bvar(1), cst("Real"))),
),
)
}
pub fn norm_ty() -> Expr {
impl_pi(
"E",
type0(),
arrow(
app(cst("NormedAddCommGroup"), bvar(0)),
arrow(bvar(0), cst("Real")),
),
)
}
pub fn dist_ty() -> Expr {
impl_pi(
"E",
type0(),
arrow(
app(cst("MetricSpace"), bvar(0)),
arrow(bvar(0), arrow(bvar(1), cst("Real"))),
),
)
}
pub fn is_eigenvalue_ty() -> Expr {
impl_pi(
"n",
nat_ty(),
impl_pi(
"α",
type0(),
arrow(
app(cst("CommRing"), bvar(0)),
arrow(
app3(cst("Matrix"), bvar(1), bvar(1), bvar(0)),
arrow(bvar(0), prop()),
),
),
),
)
}
pub fn is_eigenvector_ty() -> Expr {
impl_pi(
"n",
nat_ty(),
impl_pi(
"α",
type0(),
arrow(
app(cst("CommRing"), bvar(0)),
arrow(
app3(cst("Matrix"), bvar(1), bvar(1), bvar(0)),
arrow(bvar(0), arrow(app2(cst("Vec"), bvar(2), bvar(1)), prop())),
),
),
),
)
}
pub fn characteristic_polynomial_ty() -> Expr {
impl_pi(
"n",
nat_ty(),
impl_pi(
"α",
type0(),
arrow(
app(cst("CommRing"), bvar(0)),
arrow(
app3(cst("Matrix"), bvar(1), bvar(1), bvar(0)),
app(cst("Polynomial"), bvar(0)),
),
),
),
)
}
pub fn rank_nullity_thm_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi(
"M",
type0(),
impl_pi(
"N",
type0(),
pi(
BinderInfo::Default,
"f",
app3(cst("LinearMap"), bvar(2), bvar(1), bvar(0)),
app2(
app(cst("Eq"), nat_ty()),
app2(
cst("Nat.add"),
app(cst("LinearMap.rank"), bvar(0)),
app(cst("LinearMap.nullity"), bvar(1)),
),
app2(cst("FiniteDimensional.finrank"), bvar(4), bvar(3)),
),
),
),
),
)
}
pub fn cayley_hamilton_ty() -> Expr {
impl_pi(
"n",
nat_ty(),
impl_pi(
"α",
type0(),
arrow(
app(cst("CommRing"), bvar(0)),
pi(
BinderInfo::Default,
"A",
app3(cst("Matrix"), bvar(2), bvar(2), bvar(1)),
app2(
app(cst("Eq"), app3(cst("Matrix"), bvar(3), bvar(3), bvar(2))),
app2(
cst("Polynomial.matrixEval"),
bvar(0),
app2(cst("characteristic_polynomial"), bvar(3), bvar(0)),
),
app4(cst("matrix_zero"), bvar(3), bvar(3), bvar(2), bvar(2)),
),
),
),
),
)
}
pub fn spectral_theorem_ty() -> Expr {
impl_pi(
"n",
nat_ty(),
pi(
BinderInfo::Default,
"A",
app3(cst("Matrix"), bvar(0), bvar(0), cst("Real")),
arrow(
app(cst("Matrix.IsSymmetric"), bvar(0)),
app2(cst("Matrix.IsDiagonalizable"), cst("Real"), bvar(1)),
),
),
)
}
pub fn det_mul_thm_ty() -> Expr {
impl_pi(
"n",
nat_ty(),
impl_pi(
"α",
type0(),
arrow(
app(cst("CommRing"), bvar(0)),
pi(
BinderInfo::Default,
"A",
app3(cst("Matrix"), bvar(2), bvar(2), bvar(1)),
pi(
BinderInfo::Default,
"B",
app3(cst("Matrix"), bvar(3), bvar(3), bvar(2)),
app2(
app(cst("Eq"), bvar(2)),
app2(
cst("matrix_det"),
bvar(4),
app2(cst("matrix_mul"), bvar(1), bvar(0)),
),
app2(
cst("HMul.hMul"),
app(cst("matrix_det"), bvar(1)),
app(cst("matrix_det"), bvar(0)),
),
),
),
),
),
),
)
}
#[allow(dead_code)]
pub fn build_linear_algebra_env(env: &mut Environment) -> Result<(), String> {
let _ = env.add(Declaration::Axiom {
name: Name::str("Vec"),
univ_params: vec![],
ty: vec_type(),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("Matrix"),
univ_params: vec![],
ty: matrix_type(),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("LinearMap"),
univ_params: vec![],
ty: linear_map_ty(),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("Submodule"),
univ_params: vec![Name::str("u")],
ty: pi(
BinderInfo::Default,
"R",
type0(),
pi(BinderInfo::Default, "M", type0(), type0()),
),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("vec_zero"),
univ_params: vec![],
ty: vec_zero_ty(),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("vec_add"),
univ_params: vec![],
ty: vec_add_ty(),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("vec_smul"),
univ_params: vec![],
ty: vec_smul_ty(),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("vec_dot"),
univ_params: vec![],
ty: vec_dot_ty(),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("vec_norm_sq"),
univ_params: vec![],
ty: vec_norm_sq_ty(),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("matrix_zero"),
univ_params: vec![],
ty: matrix_zero_ty(),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("matrix_add"),
univ_params: vec![],
ty: matrix_add_ty(),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("matrix_mul"),
univ_params: vec![],
ty: matrix_mul_ty(),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("matrix_transpose"),
univ_params: vec![],
ty: matrix_transpose_ty(),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("matrix_identity"),
univ_params: vec![],
ty: matrix_identity_ty(),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("matrix_det"),
univ_params: vec![],
ty: matrix_det_ty(),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("matrix_trace"),
univ_params: vec![],
ty: matrix_trace_ty(),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("matrix_rank"),
univ_params: vec![],
ty: matrix_rank_ty(),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("linear_map_apply"),
univ_params: vec![],
ty: linear_map_apply_ty(),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("linear_map_comp"),
univ_params: vec![],
ty: linear_map_comp_ty(),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("linear_map_ker"),
univ_params: vec![],
ty: linear_map_ker_ty(),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("linear_map_range"),
univ_params: vec![],
ty: linear_map_range_ty(),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("IsEigenvalue"),
univ_params: vec![],
ty: is_eigenvalue_ty(),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("IsEigenvector"),
univ_params: vec![],
ty: is_eigenvector_ty(),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("characteristic_polynomial"),
univ_params: vec![],
ty: characteristic_polynomial_ty(),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("inner"),
univ_params: vec![],
ty: inner_product_ty(),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("norm"),
univ_params: vec![],
ty: norm_ty(),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("dist"),
univ_params: vec![],
ty: dist_ty(),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("rank_nullity"),
univ_params: vec![],
ty: rank_nullity_thm_ty(),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("cayley_hamilton"),
univ_params: vec![],
ty: cayley_hamilton_ty(),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("spectral_theorem"),
univ_params: vec![],
ty: spectral_theorem_ty(),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("det_mul"),
univ_params: vec![],
ty: det_mul_thm_ty(),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("LinearMap.rank"),
univ_params: vec![],
ty: impl_pi(
"R",
type0(),
impl_pi(
"M",
type0(),
impl_pi(
"N",
type0(),
arrow(app3(cst("LinearMap"), bvar(2), bvar(1), bvar(0)), nat_ty()),
),
),
),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("LinearMap.nullity"),
univ_params: vec![],
ty: impl_pi(
"R",
type0(),
impl_pi(
"M",
type0(),
impl_pi(
"N",
type0(),
arrow(app3(cst("LinearMap"), bvar(2), bvar(1), bvar(0)), nat_ty()),
),
),
),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("FiniteDimensional.finrank"),
univ_params: vec![],
ty: impl_pi("R", type0(), arrow(type0(), nat_ty())),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("Matrix.IsSymmetric"),
univ_params: vec![],
ty: impl_pi(
"n",
nat_ty(),
impl_pi(
"α",
type0(),
arrow(app3(cst("Matrix"), bvar(1), bvar(1), bvar(0)), prop()),
),
),
});
let _ = env.add(Declaration::Axiom {
name: Name::str("Matrix.IsDiagonalizable"),
univ_params: vec![],
ty: impl_pi(
"α",
type0(),
impl_pi(
"n",
nat_ty(),
arrow(app3(cst("Matrix"), bvar(0), bvar(0), bvar(1)), prop()),
),
),
});
Ok(())
}
pub fn tensor_product_type_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
pi(
BinderInfo::Default,
"M",
type0(),
pi(BinderInfo::Default, "N", type0(), type0()),
),
)
}
pub fn tensor_mk_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi(
"M",
type0(),
impl_pi(
"N",
type0(),
arrow(
bvar(1),
arrow(
bvar(1),
app3(cst("TensorProduct"), bvar(2), bvar(2), bvar(1)),
),
),
),
),
)
}
pub fn tensor_universal_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi(
"M",
type0(),
impl_pi(
"N",
type0(),
impl_pi(
"P",
type0(),
arrow(
app4(cst("BilinearMap"), bvar(3), bvar(2), bvar(1), bvar(0)),
app3(
cst("LinearMap"),
bvar(3),
app3(cst("TensorProduct"), bvar(3), bvar(2), bvar(1)),
bvar(0),
),
),
),
),
),
)
}
pub fn tensor_naturality_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi(
"M",
type0(),
impl_pi(
"M2",
type0(),
impl_pi(
"N",
type0(),
impl_pi(
"N2",
type0(),
arrow(
app3(cst("LinearMap"), bvar(4), bvar(3), bvar(2)),
arrow(
app3(cst("LinearMap"), bvar(4), bvar(1), bvar(0)),
app3(
cst("LinearMap"),
bvar(4),
app3(cst("TensorProduct"), bvar(4), bvar(3), bvar(1)),
app3(cst("TensorProduct"), bvar(4), bvar(2), bvar(0)),
),
),
),
),
),
),
),
)
}
pub fn tensor_assoc_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi(
"M",
type0(),
impl_pi(
"N",
type0(),
impl_pi(
"P",
type0(),
app3(
cst("LinearEquiv"),
bvar(3),
app3(
cst("TensorProduct"),
bvar(3),
app3(cst("TensorProduct"), bvar(3), bvar(2), bvar(1)),
bvar(0),
),
app3(
cst("TensorProduct"),
bvar(3),
bvar(2),
app3(cst("TensorProduct"), bvar(3), bvar(1), bvar(0)),
),
),
),
),
),
)
}
pub fn exterior_algebra_type_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
pi(BinderInfo::Default, "M", type0(), type0()),
)
}
pub fn exterior_wedge_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi(
"M",
type0(),
pi(
BinderInfo::Default,
"k",
nat_ty(),
app4(
cst("AlternatingMap"),
bvar(2),
bvar(1),
app2(cst("ExteriorAlgebra"), bvar(2), bvar(1)),
bvar(0),
),
),
),
)
}
pub fn exterior_graded_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi(
"M",
type0(),
app2(
cst("GradedAlgebra"),
bvar(1),
app2(cst("ExteriorAlgebra"), bvar(1), bvar(0)),
),
),
)
}
pub fn exterior_anticomm_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi(
"M",
type0(),
pi(
BinderInfo::Default,
"u",
bvar(0),
pi(
BinderInfo::Default,
"v",
bvar(1),
app2(
app(cst("Eq"), app2(cst("ExteriorAlgebra"), bvar(3), bvar(2))),
app2(cst("exterior_wedge"), bvar(1), bvar(0)),
app(cst("Neg"), app2(cst("exterior_wedge"), bvar(0), bvar(1))),
),
),
),
),
)
}
pub fn symmetric_power_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
pi(
BinderInfo::Default,
"M",
type0(),
pi(BinderInfo::Default, "k", nat_ty(), type0()),
),
)
}
pub fn exterior_power_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
pi(
BinderInfo::Default,
"M",
type0(),
pi(BinderInfo::Default, "k", nat_ty(), type0()),
),
)
}
pub fn free_module_type_ty() -> Expr {
pi(
BinderInfo::Default,
"R",
type0(),
pi(BinderInfo::Default, "ι", type0(), type0()),
)
}
pub fn free_module_basis_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi(
"ι",
type0(),
app3(
cst("Basis"),
bvar(0),
bvar(1),
app2(cst("FreeModule"), bvar(1), bvar(0)),
),
),
)
}
pub fn is_projective_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi(
"M",
type0(),
arrow(app2(cst("Module"), bvar(1), bvar(0)), prop()),
),
)
}
pub fn is_injective_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi(
"M",
type0(),
arrow(app2(cst("Module"), bvar(1), bvar(0)), prop()),
),
)
}
pub fn nakayama_lemma_ty() -> Expr {
impl_pi(
"R",
type0(),
impl_pi(
"M",
type0(),
arrow(
app(cst("Ideal"), bvar(1)),
arrow(
app(cst("Ideal.IsMaximal"), bvar(0)),
arrow(
app2(
app(cst("Eq"), app2(cst("Submodule"), bvar(2), bvar(1))),
app2(
cst("Ideal.smul"),
bvar(0),
app2(cst("Submodule.top"), bvar(2), bvar(1)),
),
app2(cst("Submodule.top"), bvar(2), bvar(1)),
),
app2(
app(cst("Eq"), app2(cst("Submodule"), bvar(2), bvar(1))),
app2(cst("Submodule.top"), bvar(2), bvar(1)),
app2(cst("Submodule.bot"), bvar(2), bvar(1)),
),
),
),
),
),
)
}
pub fn is_normal_operator_ty() -> Expr {
impl_pi(
"H",
type0(),
arrow(
app(cst("HilbertSpace"), bvar(0)),
arrow(arrow(bvar(0), bvar(1)), prop()),
),
)
}
pub fn spectral_decomposition_ty() -> Expr {
impl_pi(
"H",
type0(),
arrow(
app(cst("HilbertSpace"), bvar(0)),
pi(
BinderInfo::Default,
"T",
arrow(bvar(0), bvar(1)),
arrow(
app2(cst("IsNormalOperator"), bvar(2), bvar(0)),
app2(cst("SpectralMeasure"), bvar(2), bvar(0)),
),
),
),
)
}
pub fn functional_calculus_ty() -> Expr {
impl_pi(
"H",
type0(),
arrow(
app(cst("HilbertSpace"), bvar(0)),
pi(
BinderInfo::Default,
"T",
arrow(bvar(0), bvar(1)),
arrow(
app2(cst("IsNormalOperator"), bvar(2), bvar(0)),
arrow(arrow(cst("Real"), cst("Real")), arrow(bvar(2), bvar(3))),
),
),
),
)
}
pub fn spectrum_ty() -> Expr {
impl_pi(
"E",
type0(),
arrow(
app(cst("BanachAlgebra"), bvar(0)),
arrow(bvar(0), app(cst("Set"), cst("Real"))),
),
)
}
pub fn spectral_radius_ty() -> Expr {
impl_pi(
"E",
type0(),
arrow(
app(cst("BanachAlgebra"), bvar(0)),
arrow(bvar(0), cst("Real")),
),
)
}
pub fn cstar_algebra_pred_ty() -> Expr {
arrow(type0(), prop())
}
pub fn von_neumann_algebra_pred_ty() -> Expr {
arrow(type0(), prop())
}
pub fn double_commutant_ty() -> Expr {
impl_pi(
"A",
type0(),
impl_pi(
"H",
type0(),
arrow(
app(cst("VonNeumannAlgebra"), bvar(0)),
arrow(
app2(cst("Subalgebra"), bvar(1), bvar(1)),
app2(cst("Subalgebra"), bvar(1), bvar(1)),
),
),
),
)
}
pub fn is_complete_ty() -> Expr {
impl_pi(
"E",
type0(),
arrow(app(cst("MetricSpace"), bvar(0)), prop()),
)
}
pub fn banach_space_pred_ty() -> Expr {
arrow(type0(), prop())
}
pub fn hilbert_space_pred_ty() -> Expr {
arrow(type0(), prop())
}
pub fn open_mapping_ty() -> Expr {
impl_pi(
"E",
type0(),
impl_pi(
"F",
type0(),
arrow(
app(cst("BanachSpace"), bvar(1)),
arrow(
app(cst("BanachSpace"), bvar(1)),
pi(
BinderInfo::Default,
"T",
app3(cst("LinearMap"), cst("Real"), bvar(2), bvar(1)),
arrow(
app(cst("IsSurjective"), bvar(0)),
app(cst("IsOpenMap"), bvar(1)),
),
),
),
),
),
)
}
pub fn closed_graph_ty() -> Expr {
impl_pi(
"E",
type0(),
impl_pi(
"F",
type0(),
arrow(
app(cst("BanachSpace"), bvar(1)),
arrow(
app(cst("BanachSpace"), bvar(1)),
pi(
BinderInfo::Default,
"T",
app3(cst("LinearMap"), cst("Real"), bvar(2), bvar(1)),
arrow(
app(cst("IsClosedGraph"), bvar(0)),
app(cst("IsContinuous"), bvar(1)),
),
),
),
),
),
)
}
pub fn riesz_representation_ty() -> Expr {
impl_pi(
"H",
type0(),
arrow(
app(cst("HilbertSpace"), bvar(0)),
pi(
BinderInfo::Default,
"φ",
app3(
cst("ContinuousLinearMap"),
cst("Real"),
bvar(1),
cst("Real"),
),
app(
app(cst("Exists"), bvar(1)),
app2(cst("IsInnerProductRep"), bvar(1), bvar(0)),
),
),
),
)
}
pub fn condition_number_ty() -> Expr {
impl_pi(
"n",
nat_ty(),
arrow(
app3(cst("Matrix"), bvar(0), bvar(0), cst("Real")),
cst("Real"),
),
)
}
pub fn is_backward_stable_ty() -> Expr {
impl_pi(
"n",
nat_ty(),
arrow(
arrow(
app3(cst("Matrix"), bvar(0), bvar(0), cst("Real")),
app3(cst("Matrix"), bvar(1), bvar(1), cst("Real")),
),
prop(),
),
)
}
pub fn singular_values_ty() -> Expr {
impl_pi(
"m",
nat_ty(),
impl_pi(
"n",
nat_ty(),
arrow(
app3(cst("Matrix"), bvar(1), bvar(0), cst("Real")),
app2(
cst("Vec"),
app2(cst("Nat.min"), bvar(1), bvar(0)),
cst("Real"),
),
),
),
)
}
pub fn svd_decomp_ty() -> Expr {
impl_pi(
"m",
nat_ty(),
impl_pi(
"n",
nat_ty(),
pi(
BinderInfo::Default,
"A",
app3(cst("Matrix"), bvar(1), bvar(0), cst("Real")),
app(cst("SVDDecomposition"), bvar(0)),
),
),
)
}
pub fn finite_field_ty() -> Expr {
pi(BinderInfo::Default, "p", nat_ty(), type0())
}
pub fn finite_field_order_ty() -> Expr {
pi(
BinderInfo::Default,
"p",
nat_ty(),
app2(
app(cst("Eq"), nat_ty()),
app(cst("Fintype.card"), app(cst("FiniteField"), bvar(0))),
bvar(0),
),
)
}
pub fn vector_space_fin_field_dim_ty() -> Expr {
impl_pi(
"p",
nat_ty(),
impl_pi(
"V",
type0(),
pi(
BinderInfo::Default,
"n",
nat_ty(),
arrow(
app2(
app(cst("Eq"), nat_ty()),
app2(
cst("FiniteDimensional.finrank"),
app(cst("FiniteField"), bvar(2)),
bvar(1),
),
bvar(0),
),
app2(
app(cst("Eq"), nat_ty()),
app(cst("Fintype.card"), bvar(1)),
app2(cst("Nat.pow"), bvar(2), bvar(0)),
),
),
),
),
)
}
pub fn is_toeplitz_ty() -> Expr {
impl_pi(
"n",
nat_ty(),
arrow(app3(cst("Matrix"), bvar(0), bvar(0), cst("Real")), prop()),
)
}
pub fn is_circulant_ty() -> Expr {
impl_pi(
"n",
nat_ty(),
arrow(app3(cst("Matrix"), bvar(0), bvar(0), cst("Real")), prop()),
)
}
pub fn is_cauchy_ty() -> Expr {
impl_pi(
"n",
nat_ty(),
arrow(app3(cst("Matrix"), bvar(0), bvar(0), cst("Real")), prop()),
)
}
pub fn circulant_diagonalizable_ty() -> Expr {
impl_pi(
"n",
nat_ty(),
pi(
BinderInfo::Default,
"A",
app3(cst("Matrix"), bvar(0), bvar(0), cst("Real")),
arrow(
app2(cst("IsCirculant"), bvar(1), bvar(0)),
app2(cst("Matrix.IsDiagonalizable"), cst("Real"), bvar(1)),
),
),
)
}
pub fn stiefel_manifold_ty() -> Expr {
pi(
BinderInfo::Default,
"n",
nat_ty(),
pi(BinderInfo::Default, "k", nat_ty(), type0()),
)
}
pub fn grassmann_manifold_ty() -> Expr {
pi(
BinderInfo::Default,
"n",
nat_ty(),
pi(BinderInfo::Default, "k", nat_ty(), type0()),
)
}
pub fn orthogonal_group_ty() -> Expr {
pi(BinderInfo::Default, "n", nat_ty(), type0())
}
pub fn grassmann_is_homogeneous_ty() -> Expr {
pi(
BinderInfo::Default,
"n",
nat_ty(),
pi(
BinderInfo::Default,
"k",
nat_ty(),
app2(
cst("IsHomogeneousSpace"),
app(cst("OrthogonalGroup"), bvar(1)),
app2(cst("GrassmannManifold"), bvar(1), bvar(0)),
),
),
)
}
pub fn fredholm_operator_ty() -> Expr {
impl_pi(
"E",
type0(),
impl_pi(
"F",
type0(),
arrow(
app(cst("BanachSpace"), bvar(1)),
arrow(
app(cst("BanachSpace"), bvar(1)),
arrow(arrow(bvar(1), bvar(1)), prop()),
),
),
),
)
}
pub fn fredholm_index_ty() -> Expr {
impl_pi(
"E",
type0(),
impl_pi(
"F",
type0(),
pi(
BinderInfo::Default,
"T",
arrow(bvar(1), bvar(1)),
arrow(
app3(cst("FredholmOperator"), bvar(2), bvar(2), bvar(0)),
cst("Int"),
),
),
),
)
}
pub fn trace_class_ty() -> Expr {
impl_pi(
"H",
type0(),
arrow(
app(cst("HilbertSpace"), bvar(0)),
arrow(arrow(bvar(0), bvar(1)), prop()),
),
)
}
pub fn operator_trace_ty() -> Expr {
impl_pi(
"H",
type0(),
arrow(
app(cst("HilbertSpace"), bvar(0)),
pi(
BinderInfo::Default,
"T",
arrow(bvar(0), bvar(1)),
arrow(app2(cst("TraceClass"), bvar(2), bvar(0)), cst("Real")),
),
),
)
}
pub fn linear_recurrence_solution_ty() -> Expr {
impl_pi(
"d",
nat_ty(),
arrow(
app2(cst("Vec"), bvar(0), cst("Real")),
arrow(
app2(cst("Vec"), bvar(1), cst("Real")),
arrow(nat_ty(), cst("Real")),
),
),
)
}
pub fn companion_matrix_ty() -> Expr {
impl_pi(
"d",
nat_ty(),
impl_pi(
"α",
type0(),
arrow(
app(cst("CommRing"), bvar(0)),
arrow(
app2(cst("Vec"), bvar(1), bvar(0)),
app3(cst("Matrix"), bvar(2), bvar(2), bvar(1)),
),
),
),
)
}
pub fn cayley_hamilton_minimal_poly_ty() -> Expr {
impl_pi(
"n",
nat_ty(),
impl_pi(
"α",
type0(),
arrow(
app(cst("CommRing"), bvar(0)),
pi(
BinderInfo::Default,
"A",
app3(cst("Matrix"), bvar(2), bvar(2), bvar(1)),
app2(
cst("Polynomial.Dvd"),
app(cst("minimal_poly"), bvar(0)),
app(cst("char_poly"), bvar(1)),
),
),
),
),
)
}
pub fn sylvester_eq_solution_ty() -> Expr {
impl_pi(
"m",
nat_ty(),
impl_pi(
"n",
nat_ty(),
pi(
BinderInfo::Default,
"A",
app3(cst("Matrix"), bvar(1), bvar(1), cst("Real")),
pi(
BinderInfo::Default,
"B",
app3(cst("Matrix"), bvar(1), bvar(1), cst("Real")),
pi(
BinderInfo::Default,
"C",
app3(cst("Matrix"), bvar(3), bvar(2), cst("Real")),
arrow(
app(
cst("SpectraDisjoint"),
app2(cst("matrix_spec"), bvar(3), bvar(2)),
),
app(
app(
cst("ExistsUnique"),
app3(cst("Matrix"), bvar(4), bvar(3), cst("Real")),
),
app(cst("SylvesterSolution"), bvar(2)),
),
),
),
),
),
),
)
}
pub fn lyapunov_eq_ty() -> Expr {
impl_pi(
"n",
nat_ty(),
pi(
BinderInfo::Default,
"A",
app3(cst("Matrix"), bvar(0), bvar(0), cst("Real")),
pi(
BinderInfo::Default,
"Q",
app3(cst("Matrix"), bvar(1), bvar(1), cst("Real")),
arrow(
app(cst("IsStable"), bvar(1)),
app(
app(
cst("ExistsUnique"),
app3(cst("Matrix"), bvar(2), bvar(2), cst("Real")),
),
app2(cst("LyapunovSolution"), bvar(1), bvar(0)),
),
),
),
),
)
}
pub fn matrix_pencil_ty() -> Expr {
pi(
BinderInfo::Default,
"n",
nat_ty(),
pi(BinderInfo::Default, "α", type0(), type0()),
)
}
pub fn pencil_eigenvalue_ty() -> Expr {
impl_pi(
"n",
nat_ty(),
impl_pi(
"α",
type0(),
arrow(
app(cst("Field"), bvar(0)),
arrow(
app2(cst("MatrixPencil"), bvar(1), bvar(0)),
arrow(bvar(0), prop()),
),
),
),
)
}