use oxilean_kernel::{BinderInfo, Declaration, Environment, Expr, Level, Name};
use super::types::LogicalRelation;
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 app4(f: Expr, a: Expr, b: Expr, c: Expr, d: Expr) -> Expr {
app(app3(f, a, b, c), d)
}
pub fn cst(s: &str) -> Expr {
Expr::Const(Name::str(s), vec![])
}
pub fn prop() -> Expr {
Expr::Sort(Level::zero())
}
pub fn type0() -> Expr {
Expr::Sort(Level::succ(Level::zero()))
}
pub fn type1() -> Expr {
Expr::Sort(Level::succ(Level::succ(Level::zero())))
}
pub fn pi(bi: BinderInfo, name: &str, dom: Expr, body: Expr) -> Expr {
Expr::Pi(bi, Name::str(name), Box::new(dom), Box::new(body))
}
pub(super) 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 rel_ty() -> Expr {
arrow(type0(), arrow(type0(), type0()))
}
pub fn rel_id_ty() -> Expr {
pi(
BinderInfo::Default,
"A",
type0(),
app2(cst("Rel"), bvar(0), bvar(0)),
)
}
pub fn rel_comp_ty() -> Expr {
impl_pi(
"A",
type0(),
impl_pi(
"B",
type0(),
impl_pi(
"C",
type0(),
arrow(
app2(cst("Rel"), bvar(2), bvar(1)),
arrow(
app2(cst("Rel"), bvar(2), bvar(1)),
app2(cst("Rel"), bvar(4), bvar(2)),
),
),
),
),
)
}
pub fn rel_converse_ty() -> Expr {
impl_pi(
"A",
type0(),
impl_pi(
"B",
type0(),
arrow(
app2(cst("Rel"), bvar(1), bvar(0)),
app2(cst("Rel"), bvar(1), bvar(2)),
),
),
)
}
pub fn rel_fun_ty() -> Expr {
impl_pi(
"A",
type0(),
impl_pi(
"B",
type0(),
impl_pi(
"C",
type0(),
impl_pi(
"D",
type0(),
arrow(
app2(cst("Rel"), bvar(3), bvar(2)),
arrow(
app2(cst("Rel"), bvar(3), bvar(2)),
app2(cst("Rel"), arrow(bvar(5), bvar(3)), arrow(bvar(5), bvar(3))),
),
),
),
),
),
)
}
pub fn reynolds_parametricity_ty() -> Expr {
prop()
}
pub fn parametric_function_ty() -> Expr {
impl_pi(
"F",
arrow(type0(), type0()),
arrow(
pi(BinderInfo::Default, "α", type0(), app(bvar(1), bvar(0))),
prop(),
),
)
}
pub fn parametricity_condition_ty() -> Expr {
impl_pi(
"A",
type0(),
impl_pi(
"B",
type0(),
pi(
BinderInfo::Default,
"R",
app2(cst("Rel"), bvar(1), bvar(0)),
impl_pi(
"F",
arrow(type0(), type0()),
arrow(
pi(BinderInfo::Default, "α", type0(), app(bvar(1), bvar(0))),
prop(),
),
),
),
),
)
}
pub fn rel_type_constructor_ty() -> Expr {
arrow(
arrow(type0(), type0()),
arrow(type0(), arrow(type0(), type0())),
)
}
pub fn free_theorem_ty() -> Expr {
arrow(type0(), prop())
}
pub fn free_theorem_id_ty() -> Expr {
impl_pi(
"A",
type0(),
impl_pi(
"B",
type0(),
pi(
BinderInfo::Default,
"f",
pi(BinderInfo::Default, "α", type0(), arrow(bvar(0), bvar(0))),
pi(
BinderInfo::Default,
"x",
bvar(2),
app3(cst("Eq"), bvar(3), app(bvar(1), bvar(3)), bvar(0)),
),
),
),
)
}
pub fn free_theorem_list_ty() -> Expr {
impl_pi(
"A",
type0(),
impl_pi(
"B",
type0(),
pi(
BinderInfo::Default,
"f",
pi(
BinderInfo::Default,
"α",
type0(),
arrow(app(cst("List"), bvar(0)), app(cst("List"), bvar(0))),
),
pi(BinderInfo::Default, "g", arrow(bvar(2), bvar(1)), prop()),
),
),
)
}
pub fn free_theorem_fold_ty() -> Expr {
impl_pi(
"A",
type0(),
impl_pi(
"B",
type0(),
pi(
BinderInfo::Default,
"f",
pi(
BinderInfo::Default,
"α",
type0(),
pi(
BinderInfo::Default,
"β",
type0(),
arrow(
arrow(bvar(1), arrow(bvar(0), bvar(0))),
arrow(bvar(1), arrow(app(cst("List"), bvar(2)), bvar(2))),
),
),
),
prop(),
),
),
)
}
pub fn naturality_ty() -> Expr {
impl_pi(
"F",
arrow(type0(), type0()),
impl_pi(
"G",
arrow(type0(), type0()),
pi(
BinderInfo::Default,
"η",
pi(
BinderInfo::Default,
"α",
type0(),
arrow(app(bvar(2), bvar(0)), app(bvar(2), bvar(0))),
),
impl_pi(
"A",
type0(),
impl_pi("B", type0(), arrow(arrow(bvar(1), bvar(0)), prop())),
),
),
),
)
}
pub fn dinaturality_ty() -> Expr {
impl_pi(
"F",
arrow(type0(), arrow(type0(), type0())),
pi(
BinderInfo::Default,
"α",
pi(
BinderInfo::Default,
"A",
type0(),
app2(bvar(1), bvar(0), bvar(0)),
),
impl_pi(
"A",
type0(),
impl_pi("B", type0(), arrow(arrow(bvar(1), bvar(0)), prop())),
),
),
)
}
pub fn natural_transformation_ty() -> Expr {
arrow(
arrow(type0(), type0()),
arrow(arrow(type0(), type0()), type0()),
)
}
pub fn natural_iso_ty() -> Expr {
arrow(
arrow(type0(), type0()),
arrow(arrow(type0(), type0()), type0()),
)
}
pub fn abstract_type_ty() -> Expr {
type0()
}
pub fn abstract_package_ty() -> Expr {
arrow(arrow(type0(), prop()), type0())
}
pub fn representation_independence_ty() -> Expr {
impl_pi(
"I",
arrow(type0(), prop()),
arrow(
app(cst("AbstractPackage"), bvar(0)),
arrow(app(cst("AbstractPackage"), bvar(1)), prop()),
),
)
}
pub fn abstraction_theorem_ty() -> Expr {
impl_pi(
"I",
arrow(type0(), prop()),
pi(
BinderInfo::Default,
"pkg1",
app(cst("AbstractPackage"), bvar(0)),
pi(
BinderInfo::Default,
"pkg2",
app(cst("AbstractPackage"), bvar(1)),
app2(cst("RepresentationIndependence"), bvar(1), bvar(0)),
),
),
)
}
pub fn existential_type_ty() -> Expr {
arrow(arrow(type0(), type0()), type0())
}
pub fn pack_ty() -> Expr {
impl_pi(
"F",
arrow(type0(), type0()),
pi(
BinderInfo::Default,
"A",
type0(),
arrow(app(bvar(1), bvar(0)), app(cst("ExistentialType"), bvar(2))),
),
)
}
pub fn unpack_ty() -> Expr {
impl_pi(
"F",
arrow(type0(), type0()),
impl_pi(
"R",
prop(),
arrow(
app(cst("ExistentialType"), bvar(1)),
arrow(
pi(
BinderInfo::Default,
"A",
type0(),
arrow(app(bvar(3), bvar(0)), bvar(2)),
),
bvar(1),
),
),
),
)
}
pub fn logical_relation_ty() -> Expr {
pi(
BinderInfo::Default,
"F",
arrow(type0(), type0()),
pi(
BinderInfo::Default,
"A",
type0(),
pi(
BinderInfo::Default,
"B",
type0(),
arrow(
app2(cst("Rel"), bvar(1), bvar(0)),
app2(cst("Rel"), app(bvar(3), bvar(2)), app(bvar(3), bvar(1))),
),
),
),
)
}
pub fn fundamental_lemma_ty() -> Expr {
pi(BinderInfo::Default, "τ", type0(), arrow(bvar(0), prop()))
}
pub fn closed_relation_ty() -> Expr {
impl_pi(
"F",
arrow(type0(), type0()),
arrow(app(cst("LogicalRelation"), bvar(0)), prop()),
)
}
pub fn relational_model_ty() -> Expr {
type0()
}
pub fn parametric_model_ty() -> Expr {
arrow(cst("RelationalModel"), prop())
}
pub fn system_f_type_ty() -> Expr {
type0()
}
pub fn system_f_term_ty() -> Expr {
arrow(cst("SystemFType"), type0())
}
pub fn polymorphic_id_ty() -> Expr {
pi(BinderInfo::Default, "α", type0(), arrow(bvar(0), bvar(0)))
}
pub fn polymorphic_const_ty() -> Expr {
pi(
BinderInfo::Default,
"α",
type0(),
pi(
BinderInfo::Default,
"β",
type0(),
arrow(bvar(1), arrow(bvar(1), bvar(2))),
),
)
}
pub fn polymorphic_flip_ty() -> Expr {
pi(
BinderInfo::Default,
"α",
type0(),
pi(
BinderInfo::Default,
"β",
type0(),
pi(
BinderInfo::Default,
"γ",
type0(),
arrow(
arrow(bvar(2), arrow(bvar(1), bvar(0))),
arrow(bvar(2), arrow(bvar(3), bvar(3))),
),
),
),
)
}
pub fn church_numeral_ty() -> Expr {
pi(
BinderInfo::Default,
"α",
type0(),
arrow(arrow(bvar(0), bvar(0)), arrow(bvar(1), bvar(1))),
)
}
pub fn church_bool_ty() -> Expr {
pi(
BinderInfo::Default,
"α",
type0(),
arrow(bvar(0), arrow(bvar(1), bvar(1))),
)
}
pub fn coherence_theorem_ty() -> Expr {
impl_pi(
"F",
arrow(type0(), type0()),
pi(
BinderInfo::Default,
"f",
pi(BinderInfo::Default, "α", type0(), app(bvar(1), bvar(0))),
pi(
BinderInfo::Default,
"g",
pi(BinderInfo::Default, "α", type0(), app(bvar(2), bvar(0))),
app3(
cst("Eq"),
pi(BinderInfo::Default, "α", type0(), app(bvar(3), bvar(0))),
bvar(1),
bvar(0),
),
),
),
)
}
pub fn parametricity_coherence_ty() -> Expr {
impl_pi(
"A",
type0(),
impl_pi(
"B",
type0(),
impl_pi(
"F",
arrow(type0(), arrow(type0(), type0())),
pi(
BinderInfo::Default,
"f",
pi(
BinderInfo::Default,
"α",
type0(),
pi(
BinderInfo::Default,
"β",
type0(),
app2(bvar(3), bvar(1), bvar(0)),
),
),
pi(
BinderInfo::Default,
"g",
pi(
BinderInfo::Default,
"α",
type0(),
pi(
BinderInfo::Default,
"β",
type0(),
app2(bvar(4), bvar(1), bvar(0)),
),
),
prop(),
),
),
),
),
)
}
pub fn unique_inhabitant_ty() -> Expr {
impl_pi(
"F",
arrow(type0(), type0()),
arrow(
pi(BinderInfo::Default, "α", type0(), app(bvar(1), bvar(0))),
prop(),
),
)
}
pub fn universal_property_ty() -> Expr {
impl_pi(
"F",
arrow(type0(), type0()),
arrow(
pi(BinderInfo::Default, "α", type0(), app(bvar(1), bvar(0))),
prop(),
),
)
}
pub fn kripke_relation_ty() -> Expr {
pi(
BinderInfo::Default,
"W",
type0(),
pi(
BinderInfo::Default,
"A",
type0(),
pi(
BinderInfo::Default,
"B",
type0(),
arrow(bvar(2), arrow(bvar(2), arrow(bvar(2), prop()))),
),
),
)
}
pub fn step_indexed_relation_ty() -> Expr {
pi(
BinderInfo::Default,
"A",
type0(),
pi(
BinderInfo::Default,
"B",
type0(),
arrow(nat_ty(), arrow(bvar(1), arrow(bvar(2), prop()))),
),
)
}
pub fn biorthogonality_relation_ty() -> Expr {
arrow(type0(), type0())
}
pub fn admissible_relation_ty() -> Expr {
pi(
BinderInfo::Default,
"A",
type0(),
pi(
BinderInfo::Default,
"B",
type0(),
arrow(app2(cst("Rel"), bvar(1), bvar(0)), prop()),
),
)
}
pub fn pi_type_ty() -> Expr {
pi(
BinderInfo::Default,
"A",
type0(),
arrow(arrow(bvar(0), type0()), type0()),
)
}
pub fn sigma_type_ty() -> Expr {
pi(
BinderInfo::Default,
"A",
type0(),
arrow(arrow(bvar(0), type0()), type0()),
)
}
pub fn sigma_fst_ty() -> Expr {
impl_pi(
"A",
type0(),
impl_pi(
"B",
arrow(bvar(0), type0()),
arrow(app2(cst("SigmaType"), bvar(1), bvar(0)), bvar(2)),
),
)
}
pub fn sigma_snd_ty() -> Expr {
impl_pi(
"A",
type0(),
impl_pi(
"B",
arrow(bvar(0), type0()),
pi(
BinderInfo::Default,
"p",
app2(cst("SigmaType"), bvar(1), bvar(0)),
app(bvar(1), app(cst("SigmaFst"), bvar(0))),
),
),
)
}
pub fn pi_ext_ty() -> Expr {
impl_pi(
"A",
type0(),
impl_pi(
"B",
arrow(bvar(0), type0()),
pi(
BinderInfo::Default,
"f",
app2(cst("PiType"), bvar(1), bvar(0)),
pi(
BinderInfo::Default,
"g",
app2(cst("PiType"), bvar(2), bvar(1)),
arrow(
pi(
BinderInfo::Default,
"x",
bvar(3),
app3(
cst("Eq"),
app(bvar(3), bvar(0)),
app(bvar(2), bvar(0)),
app(bvar(1), bvar(0)),
),
),
app3(
cst("Eq"),
app2(cst("PiType"), bvar(3), bvar(2)),
bvar(1),
bvar(0),
),
),
),
),
),
)
}
pub fn id_type_ty() -> Expr {
impl_pi("A", type0(), arrow(bvar(0), arrow(bvar(1), type0())))
}
pub fn id_refl_ty() -> Expr {
impl_pi(
"A",
type0(),
pi(
BinderInfo::Default,
"a",
bvar(0),
app2(cst("IdType"), bvar(1), bvar(0)),
),
)
}
pub fn id_elim_ty() -> Expr {
impl_pi(
"A",
type0(),
pi(
BinderInfo::Default,
"C",
pi(
BinderInfo::Default,
"a",
bvar(0),
pi(
BinderInfo::Default,
"b",
bvar(1),
arrow(app2(cst("IdType"), bvar(2), bvar(0)), type0()),
),
),
pi(
BinderInfo::Default,
"refl_case",
pi(
BinderInfo::Default,
"a",
bvar(1),
app3(bvar(2), bvar(0), bvar(0), app(cst("IdRefl"), bvar(0))),
),
impl_pi(
"a",
bvar(2),
impl_pi(
"b",
bvar(3),
pi(
BinderInfo::Default,
"p",
app2(cst("IdType"), bvar(4), bvar(0)),
app3(bvar(4), bvar(2), bvar(1), bvar(0)),
),
),
),
),
),
)
}
pub fn id_symm_ty() -> Expr {
impl_pi(
"A",
type0(),
impl_pi(
"a",
bvar(0),
impl_pi(
"b",
bvar(1),
arrow(
app2(cst("IdType"), bvar(2), bvar(0)),
app2(cst("IdType"), bvar(1), bvar(3)),
),
),
),
)
}
pub fn id_trans_ty() -> Expr {
impl_pi(
"A",
type0(),
impl_pi(
"a",
bvar(0),
impl_pi(
"b",
bvar(1),
impl_pi(
"c",
bvar(2),
arrow(
app2(cst("IdType"), bvar(3), bvar(1)),
arrow(
app2(cst("IdType"), bvar(3), bvar(0)),
app2(cst("IdType"), bvar(4), bvar(2)),
),
),
),
),
),
)
}
pub fn type_equiv_ty() -> Expr {
pi(
BinderInfo::Default,
"A",
type0(),
pi(BinderInfo::Default, "B", type0(), type0()),
)
}
pub fn univalence_axiom_ty() -> Expr {
pi(
BinderInfo::Default,
"A",
type0(),
pi(
BinderInfo::Default,
"B",
type0(),
app2(
cst("TypeEquiv"),
app2(cst("TypeEquiv"), bvar(1), bvar(0)),
app2(cst("IdType"), type0(), bvar(1)),
),
),
)
}
pub fn funext_ty() -> Expr {
impl_pi(
"A",
type0(),
impl_pi(
"B",
arrow(bvar(0), type0()),
pi(
BinderInfo::Default,
"f",
app2(cst("PiType"), bvar(1), bvar(0)),
pi(
BinderInfo::Default,
"g",
app2(cst("PiType"), bvar(2), bvar(1)),
arrow(
pi(
BinderInfo::Default,
"x",
bvar(3),
app2(cst("IdType"), app(bvar(3), bvar(0)), app(bvar(2), bvar(0))),
),
app2(cst("IdType"), bvar(1), bvar(0)),
),
),
),
),
)
}
pub fn prop_ext_ty() -> Expr {
pi(
BinderInfo::Default,
"P",
prop(),
pi(
BinderInfo::Default,
"Q",
prop(),
arrow(
app2(cst("Iff"), bvar(1), bvar(0)),
app2(cst("IdType"), bvar(1), bvar(0)),
),
),
)
}
pub fn trunc_ty() -> Expr {
arrow(type0(), prop())
}
pub fn trunc_in_ty() -> Expr {
impl_pi("A", type0(), arrow(bvar(0), app(cst("Trunc"), bvar(1))))
}
pub fn trunc_elim_ty() -> Expr {
impl_pi(
"A",
type0(),
impl_pi(
"P",
prop(),
arrow(
arrow(bvar(1), bvar(0)),
arrow(app(cst("Trunc"), bvar(2)), bvar(1)),
),
),
)
}
pub fn circle_hit_ty() -> Expr {
type0()
}
pub fn suspension_hit_ty() -> Expr {
arrow(type0(), type0())
}
pub fn interval_hit_ty() -> Expr {
type0()
}
pub fn pushout_hit_ty() -> Expr {
impl_pi(
"A",
type0(),
impl_pi(
"B",
type0(),
impl_pi(
"C",
type0(),
arrow(
arrow(bvar(2), bvar(1)),
arrow(arrow(bvar(3), bvar(1)), type0()),
),
),
),
)
}
pub fn obs_eq_ty() -> Expr {
pi(
BinderInfo::Default,
"A",
type0(),
arrow(bvar(0), arrow(bvar(1), prop())),
)
}
pub fn obs_eq_refl_ty() -> Expr {
impl_pi(
"A",
type0(),
pi(
BinderInfo::Default,
"a",
bvar(0),
app3(cst("ObsEq"), bvar(1), bvar(0), bvar(0)),
),
)
}
pub fn coerce_ty() -> Expr {
impl_pi(
"A",
type0(),
impl_pi(
"B",
type0(),
arrow(
app2(cst("IdType"), bvar(1), bvar(0)),
arrow(bvar(2), bvar(2)),
),
),
)
}
pub fn coherence_ott_ty() -> Expr {
impl_pi(
"A",
type0(),
impl_pi(
"B",
type0(),
pi(
BinderInfo::Default,
"p",
app2(cst("IdType"), bvar(1), bvar(0)),
pi(
BinderInfo::Default,
"q",
app2(cst("IdType"), bvar(2), bvar(1)),
app2(cst("IdType"), bvar(1), bvar(0)),
),
),
),
)
}
pub fn fibrant_type_ty() -> Expr {
arrow(type0(), prop())
}
pub fn strict_equality_ty() -> Expr {
pi(
BinderInfo::Default,
"A",
type0(),
arrow(bvar(0), arrow(bvar(1), prop())),
)
}
pub fn inner_to_outer_ty() -> Expr {
impl_pi(
"A",
type0(),
arrow(app(cst("FibrantType"), bvar(0)), arrow(bvar(1), bvar(2))),
)
}
pub fn setoid_ty() -> Expr {
type0()
}
pub fn setoid_map_ty() -> Expr {
arrow(cst("Setoid"), arrow(cst("Setoid"), type0()))
}
pub fn setoid_equiv_ty() -> Expr {
arrow(cst("Setoid"), arrow(cst("Setoid"), prop()))
}
pub fn setoid_quotient_ty() -> Expr {
arrow(cst("Setoid"), type0())
}
pub fn pca_ty() -> Expr {
type0()
}
pub fn realizer_ty() -> Expr {
arrow(type0(), arrow(cst("PCA"), prop()))
}
pub fn realizability_tripos_ty() -> Expr {
type0()
}
pub fn effective_topos_ty() -> Expr {
type0()
}
pub fn per_ty() -> Expr {
arrow(type0(), type0())
}
pub fn per_domain_ty() -> Expr {
impl_pi(
"A",
type0(),
arrow(app(cst("PER"), bvar(0)), arrow(bvar(1), prop())),
)
}
pub fn per_map_ty() -> Expr {
impl_pi(
"A",
type0(),
impl_pi(
"B",
type0(),
arrow(
app(cst("PER"), bvar(1)),
arrow(
app(cst("PER"), bvar(1)),
arrow(arrow(bvar(3), bvar(2)), prop()),
),
),
),
)
}
pub fn per_model_ty() -> Expr {
type0()
}
pub fn orthogonal_ty() -> Expr {
impl_pi(
"A",
type0(),
impl_pi(
"B",
type0(),
impl_pi(
"C",
type0(),
impl_pi(
"D",
type0(),
arrow(
arrow(bvar(3), bvar(2)),
arrow(arrow(bvar(3), bvar(2)), prop()),
),
),
),
),
)
}
pub fn wfs_ty() -> Expr {
type0()
}
pub fn small_object_argument_ty() -> Expr {
arrow(type0(), cst("WFS"))
}
pub fn dyn_type_ty() -> Expr {
type0()
}
pub fn inject_ty() -> Expr {
impl_pi("A", type0(), arrow(bvar(0), cst("DynType")))
}
pub fn project_ty() -> Expr {
impl_pi(
"A",
type0(),
arrow(cst("DynType"), app(cst("Option"), bvar(1))),
)
}
pub fn gradual_consistency_ty() -> Expr {
pi(
BinderInfo::Default,
"A",
type0(),
pi(BinderInfo::Default, "B", type0(), prop()),
)
}
pub fn cast_evidence_ty() -> Expr {
impl_pi(
"A",
type0(),
impl_pi(
"B",
type0(),
arrow(
app2(cst("GradualConsistency"), bvar(1), bvar(0)),
arrow(bvar(2), bvar(2)),
),
),
)
}
pub fn effect_sig_ty() -> Expr {
type0()
}
pub fn effect_tree_ty() -> Expr {
arrow(cst("EffectSig"), arrow(type0(), type0()))
}
pub fn handler_ty() -> Expr {
impl_pi(
"Σ",
cst("EffectSig"),
impl_pi(
"A",
type0(),
impl_pi(
"B",
type0(),
arrow(
app2(cst("EffectTree"), bvar(2), bvar(1)),
arrow(arrow(bvar(2), bvar(1)), bvar(2)),
),
),
),
)
}
pub fn monad_law_ty() -> Expr {
pi(BinderInfo::Default, "M", arrow(type0(), type0()), prop())
}
pub fn monad_morphism_ty() -> Expr {
impl_pi(
"M",
arrow(type0(), type0()),
impl_pi(
"N",
arrow(type0(), type0()),
arrow(
pi(
BinderInfo::Default,
"A",
type0(),
arrow(app(bvar(2), bvar(0)), app(bvar(2), bvar(0))),
),
prop(),
),
),
)
}
#[allow(clippy::too_many_arguments)]
pub fn register_parametricity(env: &mut Environment) {
let axioms: &[(&str, Expr)] = &[
("Rel", rel_ty()),
("RelId", rel_id_ty()),
("RelComp", rel_comp_ty()),
("RelConverse", rel_converse_ty()),
("RelFun", rel_fun_ty()),
("ReynoldsParametricity", reynolds_parametricity_ty()),
("ParametricFunction", parametric_function_ty()),
("ParametricityCondition", parametricity_condition_ty()),
("RelTypeConstructor", rel_type_constructor_ty()),
("FreeTheorem", free_theorem_ty()),
("FreeTheoremId", free_theorem_id_ty()),
("FreeTheoremList", free_theorem_list_ty()),
("FreeTheoremFold", free_theorem_fold_ty()),
("Naturality", naturality_ty()),
("DiNaturality", dinaturality_ty()),
("NaturalTransformation", natural_transformation_ty()),
("NaturalIso", natural_iso_ty()),
("AbstractType", abstract_type_ty()),
("AbstractPackage", abstract_package_ty()),
(
"RepresentationIndependence",
representation_independence_ty(),
),
("AbstractionTheorem", abstraction_theorem_ty()),
("ExistentialType", existential_type_ty()),
("Pack", pack_ty()),
("Unpack", unpack_ty()),
("LogicalRelation", logical_relation_ty()),
("FundamentalLemma", fundamental_lemma_ty()),
("ClosedRelation", closed_relation_ty()),
("RelationalModel", relational_model_ty()),
("ParametricModel", parametric_model_ty()),
("SystemFType", system_f_type_ty()),
("SystemFTerm", system_f_term_ty()),
("PolymorphicId", polymorphic_id_ty()),
("PolymorphicConst", polymorphic_const_ty()),
("PolymorphicFlip", polymorphic_flip_ty()),
("ChurchNumeral", church_numeral_ty()),
("ChurchBool", church_bool_ty()),
("CoherenceTheorem", coherence_theorem_ty()),
("ParametricityCoherence", parametricity_coherence_ty()),
("UniqueInhabitant", unique_inhabitant_ty()),
("UniversalProperty", universal_property_ty()),
("KripkeRelation", kripke_relation_ty()),
("StepIndexedRelation", step_indexed_relation_ty()),
("BiorthogonalityRelation", biorthogonality_relation_ty()),
("AdmissibleRelation", admissible_relation_ty()),
("PiType", pi_type_ty()),
("SigmaType", sigma_type_ty()),
("SigmaFst", sigma_fst_ty()),
("SigmaSnd", sigma_snd_ty()),
("PiExt", pi_ext_ty()),
("IdType", id_type_ty()),
("IdRefl", id_refl_ty()),
("IdElim", id_elim_ty()),
("IdSymm", id_symm_ty()),
("IdTrans", id_trans_ty()),
("TypeEquiv", type_equiv_ty()),
("UnivalenceAxiom", univalence_axiom_ty()),
("FunExt", funext_ty()),
("PropExt", prop_ext_ty()),
("Trunc", trunc_ty()),
("TruncIn", trunc_in_ty()),
("TruncElim", trunc_elim_ty()),
("CircleHIT", circle_hit_ty()),
("SuspensionHIT", suspension_hit_ty()),
("IntervalHIT", interval_hit_ty()),
("PushoutHIT", pushout_hit_ty()),
("ObsEq", obs_eq_ty()),
("ObsEqRefl", obs_eq_refl_ty()),
("Coerce", coerce_ty()),
("CoherenceOTT", coherence_ott_ty()),
("FibrantType", fibrant_type_ty()),
("StrictEquality", strict_equality_ty()),
("InnerToOuter", inner_to_outer_ty()),
("Setoid", setoid_ty()),
("SetoidMap", setoid_map_ty()),
("SetoidEquiv", setoid_equiv_ty()),
("SetoidQuotient", setoid_quotient_ty()),
("PCA", pca_ty()),
("Realizer", realizer_ty()),
("RealizabilityTripos", realizability_tripos_ty()),
("EffectiveTopos", effective_topos_ty()),
("PER", per_ty()),
("PERDomain", per_domain_ty()),
("PERMap", per_map_ty()),
("PERModel", per_model_ty()),
("Orthogonal", orthogonal_ty()),
("WFS", wfs_ty()),
("SmallObjectArgument", small_object_argument_ty()),
("DynType", dyn_type_ty()),
("Inject", inject_ty()),
("Project", project_ty()),
("GradualConsistency", gradual_consistency_ty()),
("CastEvidence", cast_evidence_ty()),
("EffectSig", effect_sig_ty()),
("EffectTree", effect_tree_ty()),
("Handler", handler_ty()),
("MonadLaw", monad_law_ty()),
("MonadMorphism", monad_morphism_ty()),
];
for (name, ty) in axioms {
env.add(Declaration::Axiom {
name: Name::str(*name),
univ_params: vec![],
ty: ty.clone(),
})
.ok();
}
}