oxilean_std/env_builder/
types.rs1use oxilean_kernel::{BinderInfo, Declaration, Environment, Expr, Level, Name, ReducibilityHint};
6
7pub struct EnvBuilder {
10 env: Environment,
11 errors: Vec<String>,
12}
13impl EnvBuilder {
14 pub fn new(env: Environment) -> Self {
16 Self {
17 env,
18 errors: Vec::new(),
19 }
20 }
21 pub fn fresh() -> Self {
23 Self::new(Environment::new())
24 }
25 pub fn add_axiom(&mut self, name: Name, ty: Expr) {
27 let result = self.env.add(Declaration::Axiom {
28 name,
29 univ_params: vec![],
30 ty,
31 });
32 if let Err(e) = result {
33 self.errors.push(e.to_string());
34 }
35 }
36 pub fn axiom(&mut self, name: &str, ty: Expr) -> &mut Self {
38 self.add_axiom(Name::str(name), ty);
39 self
40 }
41 pub fn add_definition(&mut self, name: Name, ty: Expr, value: Expr) {
43 let result = self.env.add(Declaration::Definition {
44 name,
45 univ_params: vec![],
46 ty,
47 val: value,
48 hint: ReducibilityHint::Regular(0),
49 });
50 if let Err(e) = result {
51 self.errors.push(e.to_string());
52 }
53 }
54 pub fn def(&mut self, name: &str, ty: Expr, value: Expr) -> &mut Self {
56 self.add_definition(Name::str(name), ty, value);
57 self
58 }
59 pub fn theorem(&mut self, name: &str, ty: Expr, proof: Expr) -> &mut Self {
61 let result = self.env.add(Declaration::Theorem {
62 name: Name::str(name),
63 univ_params: vec![],
64 ty,
65 val: proof,
66 });
67 if let Err(e) = result {
68 self.errors.push(e.to_string());
69 }
70 self
71 }
72 pub fn sorry(&mut self, name: &str, ty: Expr) -> &mut Self {
74 self.axiom(name, ty)
75 }
76 pub fn finish(self) -> Result<Environment, String> {
78 if self.errors.is_empty() {
79 Ok(self.env)
80 } else {
81 Err(self.errors.join("; "))
82 }
83 }
84 pub fn finish_or_panic(self) -> Environment {
86 match self.finish() {
87 Ok(env) => env,
88 Err(e) => panic!("EnvBuilder errors: {}", e),
89 }
90 }
91 pub fn env(&self) -> &Environment {
93 &self.env
94 }
95 pub fn is_ok(&self) -> bool {
97 self.errors.is_empty()
98 }
99 pub fn errors(&self) -> &[String] {
101 &self.errors
102 }
103 pub fn contains(&self, name: &str) -> bool {
105 self.env.get(&Name::str(name)).is_some()
106 }
107}