From bf91f78834e2262fc3014c1a1f6f364b6930feb9 Mon Sep 17 00:00:00 2001 From: arthur-adjedj <arthur.adjedj@gmail.com> Date: Tue, 25 Oct 2022 10:36:49 +0200 Subject: [PATCH] feat : add UniverseLevel --- kernel/src/universe.rs | 56 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 kernel/src/universe.rs diff --git a/kernel/src/universe.rs b/kernel/src/universe.rs new file mode 100644 index 00000000..85ce34ff --- /dev/null +++ b/kernel/src/universe.rs @@ -0,0 +1,56 @@ +use derive_more::{Display}; + +#[derive(Clone, Debug, Default, Display, PartialEq, Eq)] +pub enum UniverseLevel { + #[default] + UnivZero, + UnivSucc(Box<UniverseLevel>), + #[display(fmt = "max {} {}", _0, _1)] + UnivMax(Box<UniverseLevel>,Box<UniverseLevel>), + UnivVar(usize) +} +use UniverseLevel::*; + +impl UniverseLevel { + fn normalize(self) -> Self { + match self { + UnivMax(box UnivSucc(u1),box UnivSucc(u2)) => UnivSucc(box UnivMax(u1,u2)), + UnivMax(box u1,box UnivZero) | UnivMax(box UnivZero, box u1) => u1, + UnivMax(u1, u2) if u1.clone().normalize() == u2.clone().normalize() => u1.clone().normalize(), + _ => self + } + } + + fn shift(self, n : usize) -> Self{ + match self { + UnivZero => self, + UnivSucc(u) => UnivSucc(box u.shift(n)), + UnivMax(u1,u2) => UnivMax(box u1.shift(n), box u2.shift(n)), + UnivVar(k) if k>n => UnivVar(k-1), + _ => self + } + } + + fn substitute(self,n : usize) -> Self { + + } + + fn geq(self, u2 : UniverseLevel,n : u64) -> bool { + match (self,u2) { + (UnivZero,_) if n >=0 => true, + (_,_) if self == u2 && n>=0 => true, + (UnivSucc(l),_) if l.geq(u2,n-1) => true, + (_,UnivSucc(box l)) if self.geq(l,n+1) => true, + (_,UnivMax(box l1, box l2)) if self.geq(l1,n) || self.geq(l2,n) => true, + (UnivMax(box l1, box l2),_) if l1.geq(u2,n) && l2.geq(u2,n) => true + + + } + } + + + pub fn is_eq(self,u2 : UniverseLevel) -> bool { + self.geq(u2,0) && u2.geq(self,0) + } + +} -- GitLab