1use super::functions::*;
6use oxilean_kernel::{
7 BinderInfo, Declaration, Environment, Expr, InductiveEnv, InductiveType, IntroRule, Level, Name,
8};
9
10#[allow(dead_code)]
12pub fn register_vec_zip_axioms(env: &mut Environment) {
13 use oxilean_kernel::{BinderInfo, Declaration, Expr, Level, Name};
14 let type1 = Expr::Sort(Level::succ(Level::zero()));
15 let nat_ty = Expr::Const(Name::str("Nat"), vec![]);
16 let zip_ty = Expr::Pi(
17 BinderInfo::Implicit,
18 Name::str("α"),
19 Box::new(type1.clone()),
20 Box::new(Expr::Pi(
21 BinderInfo::Implicit,
22 Name::str("β"),
23 Box::new(type1.clone()),
24 Box::new(Expr::Pi(
25 BinderInfo::Implicit,
26 Name::str("n"),
27 Box::new(nat_ty.clone()),
28 Box::new(Expr::Pi(
29 BinderInfo::Default,
30 Name::str("xs"),
31 Box::new(Expr::App(
32 Box::new(Expr::App(
33 Box::new(Expr::Const(Name::str("Vec"), vec![])),
34 Box::new(Expr::BVar(2)),
35 )),
36 Box::new(Expr::BVar(0)),
37 )),
38 Box::new(Expr::Pi(
39 BinderInfo::Default,
40 Name::str("ys"),
41 Box::new(Expr::App(
42 Box::new(Expr::App(
43 Box::new(Expr::Const(Name::str("Vec"), vec![])),
44 Box::new(Expr::BVar(3)),
45 )),
46 Box::new(Expr::BVar(1)),
47 )),
48 Box::new(Expr::Const(Name::str("Unit"), vec![])),
49 )),
50 )),
51 )),
52 )),
53 );
54 let zip_decl = Declaration::Axiom {
55 name: Name::str("Vec.zip"),
56 univ_params: vec![],
57 ty: zip_ty,
58 };
59 let _ = env.add(zip_decl);
60 let zip_nil_ty = Expr::Pi(
61 BinderInfo::Implicit,
62 Name::str("α"),
63 Box::new(type1.clone()),
64 Box::new(Expr::Pi(
65 BinderInfo::Implicit,
66 Name::str("β"),
67 Box::new(type1.clone()),
68 Box::new(Expr::Const(Name::str("True"), vec![])),
69 )),
70 );
71 let zip_nil_decl = Declaration::Axiom {
72 name: Name::str("Vec.zip_nil"),
73 univ_params: vec![],
74 ty: zip_nil_ty,
75 };
76 let _ = env.add(zip_nil_decl);
77 let zip_length_ty = Expr::Pi(
78 BinderInfo::Implicit,
79 Name::str("α"),
80 Box::new(type1.clone()),
81 Box::new(Expr::Pi(
82 BinderInfo::Implicit,
83 Name::str("β"),
84 Box::new(type1.clone()),
85 Box::new(Expr::Pi(
86 BinderInfo::Implicit,
87 Name::str("n"),
88 Box::new(nat_ty.clone()),
89 Box::new(Expr::Const(Name::str("True"), vec![])),
90 )),
91 )),
92 );
93 let zip_length_decl = Declaration::Axiom {
94 name: Name::str("Vec.zip_length"),
95 univ_params: vec![],
96 ty: zip_length_ty,
97 };
98 let _ = env.add(zip_length_decl);
99}
100#[allow(dead_code)]
102pub fn register_vec_unzip_axioms(env: &mut Environment) {
103 use oxilean_kernel::{BinderInfo, Declaration, Expr, Level, Name};
104 let type1 = Expr::Sort(Level::succ(Level::zero()));
105 let nat_ty = Expr::Const(Name::str("Nat"), vec![]);
106 let unzip_ty = Expr::Pi(
107 BinderInfo::Implicit,
108 Name::str("α"),
109 Box::new(type1.clone()),
110 Box::new(Expr::Pi(
111 BinderInfo::Implicit,
112 Name::str("β"),
113 Box::new(type1.clone()),
114 Box::new(Expr::Pi(
115 BinderInfo::Implicit,
116 Name::str("n"),
117 Box::new(nat_ty.clone()),
118 Box::new(Expr::Pi(
119 BinderInfo::Default,
120 Name::str("xs"),
121 Box::new(Expr::Const(Name::str("Unit"), vec![])),
122 Box::new(Expr::Const(Name::str("Unit"), vec![])),
123 )),
124 )),
125 )),
126 );
127 let unzip_decl = Declaration::Axiom {
128 name: Name::str("Vec.unzip"),
129 univ_params: vec![],
130 ty: unzip_ty,
131 };
132 let _ = env.add(unzip_decl);
133 let zip_unzip_ty = Expr::Pi(
134 BinderInfo::Implicit,
135 Name::str("α"),
136 Box::new(type1.clone()),
137 Box::new(Expr::Pi(
138 BinderInfo::Implicit,
139 Name::str("β"),
140 Box::new(type1.clone()),
141 Box::new(Expr::Pi(
142 BinderInfo::Implicit,
143 Name::str("n"),
144 Box::new(nat_ty.clone()),
145 Box::new(Expr::Const(Name::str("True"), vec![])),
146 )),
147 )),
148 );
149 let zip_unzip_decl = Declaration::Axiom {
150 name: Name::str("Vec.zip_unzip"),
151 univ_params: vec![],
152 ty: zip_unzip_ty,
153 };
154 let _ = env.add(zip_unzip_decl);
155}
156#[allow(dead_code)]
158pub fn register_vec_fold_axioms(env: &mut Environment) {
159 use oxilean_kernel::{BinderInfo, Declaration, Expr, Level, Name};
160 let type1 = Expr::Sort(Level::succ(Level::zero()));
161 let nat_ty = Expr::Const(Name::str("Nat"), vec![]);
162 let foldl_ty = Expr::Pi(
163 BinderInfo::Implicit,
164 Name::str("α"),
165 Box::new(type1.clone()),
166 Box::new(Expr::Pi(
167 BinderInfo::Implicit,
168 Name::str("β"),
169 Box::new(type1.clone()),
170 Box::new(Expr::Pi(
171 BinderInfo::Default,
172 Name::str("f"),
173 Box::new(Expr::Pi(
174 BinderInfo::Default,
175 Name::str("_acc"),
176 Box::new(Expr::BVar(1)),
177 Box::new(Expr::Pi(
178 BinderInfo::Default,
179 Name::str("_x"),
180 Box::new(Expr::BVar(2)),
181 Box::new(Expr::BVar(3)),
182 )),
183 )),
184 Box::new(Expr::Pi(
185 BinderInfo::Default,
186 Name::str("init"),
187 Box::new(Expr::BVar(2)),
188 Box::new(Expr::Pi(
189 BinderInfo::Implicit,
190 Name::str("n"),
191 Box::new(nat_ty.clone()),
192 Box::new(Expr::Pi(
193 BinderInfo::Default,
194 Name::str("_xs"),
195 Box::new(Expr::Const(Name::str("Unit"), vec![])),
196 Box::new(Expr::BVar(4)),
197 )),
198 )),
199 )),
200 )),
201 )),
202 );
203 let foldl_decl = Declaration::Axiom {
204 name: Name::str("Vec.foldl"),
205 univ_params: vec![],
206 ty: foldl_ty,
207 };
208 let _ = env.add(foldl_decl);
209 let foldl_nil_ty = Expr::Pi(
210 BinderInfo::Implicit,
211 Name::str("α"),
212 Box::new(type1.clone()),
213 Box::new(Expr::Pi(
214 BinderInfo::Implicit,
215 Name::str("β"),
216 Box::new(type1.clone()),
217 Box::new(Expr::Const(Name::str("True"), vec![])),
218 )),
219 );
220 let foldl_nil_decl = Declaration::Axiom {
221 name: Name::str("Vec.foldl_nil"),
222 univ_params: vec![],
223 ty: foldl_nil_ty,
224 };
225 let _ = env.add(foldl_nil_decl);
226 let foldl_cons_ty = Expr::Pi(
227 BinderInfo::Implicit,
228 Name::str("α"),
229 Box::new(type1.clone()),
230 Box::new(Expr::Pi(
231 BinderInfo::Implicit,
232 Name::str("β"),
233 Box::new(type1.clone()),
234 Box::new(Expr::Const(Name::str("True"), vec![])),
235 )),
236 );
237 let foldl_cons_decl = Declaration::Axiom {
238 name: Name::str("Vec.foldl_cons"),
239 univ_params: vec![],
240 ty: foldl_cons_ty,
241 };
242 let _ = env.add(foldl_cons_decl);
243 let foldr_ty = Expr::Pi(
244 BinderInfo::Implicit,
245 Name::str("α"),
246 Box::new(type1.clone()),
247 Box::new(Expr::Pi(
248 BinderInfo::Implicit,
249 Name::str("β"),
250 Box::new(type1.clone()),
251 Box::new(Expr::Pi(
252 BinderInfo::Default,
253 Name::str("_f"),
254 Box::new(Expr::Const(Name::str("Unit"), vec![])),
255 Box::new(Expr::Pi(
256 BinderInfo::Default,
257 Name::str("_init"),
258 Box::new(Expr::BVar(2)),
259 Box::new(Expr::Pi(
260 BinderInfo::Implicit,
261 Name::str("n"),
262 Box::new(nat_ty.clone()),
263 Box::new(Expr::Pi(
264 BinderInfo::Default,
265 Name::str("_xs"),
266 Box::new(Expr::Const(Name::str("Unit"), vec![])),
267 Box::new(Expr::BVar(4)),
268 )),
269 )),
270 )),
271 )),
272 )),
273 );
274 let foldr_decl = Declaration::Axiom {
275 name: Name::str("Vec.foldr"),
276 univ_params: vec![],
277 ty: foldr_ty,
278 };
279 let _ = env.add(foldr_decl);
280}
281#[allow(dead_code)]
283pub fn register_vec_predicate_axioms(env: &mut Environment) {
284 use oxilean_kernel::{BinderInfo, Declaration, Expr, Level, Name};
285 let type1 = Expr::Sort(Level::succ(Level::zero()));
286 let nat_ty = Expr::Const(Name::str("Nat"), vec![]);
287 let all_ty = Expr::Pi(
288 BinderInfo::Implicit,
289 Name::str("α"),
290 Box::new(type1.clone()),
291 Box::new(Expr::Pi(
292 BinderInfo::Implicit,
293 Name::str("n"),
294 Box::new(nat_ty.clone()),
295 Box::new(Expr::Pi(
296 BinderInfo::Default,
297 Name::str("_p"),
298 Box::new(Expr::Pi(
299 BinderInfo::Default,
300 Name::str("_x"),
301 Box::new(Expr::BVar(1)),
302 Box::new(Expr::Const(Name::str("Bool"), vec![])),
303 )),
304 Box::new(Expr::Pi(
305 BinderInfo::Default,
306 Name::str("_xs"),
307 Box::new(Expr::Const(Name::str("Unit"), vec![])),
308 Box::new(Expr::Const(Name::str("Bool"), vec![])),
309 )),
310 )),
311 )),
312 );
313 let all_decl = Declaration::Axiom {
314 name: Name::str("Vec.all"),
315 univ_params: vec![],
316 ty: all_ty,
317 };
318 let _ = env.add(all_decl);
319 let any_ty = Expr::Pi(
320 BinderInfo::Implicit,
321 Name::str("α"),
322 Box::new(type1.clone()),
323 Box::new(Expr::Pi(
324 BinderInfo::Implicit,
325 Name::str("n"),
326 Box::new(nat_ty.clone()),
327 Box::new(Expr::Pi(
328 BinderInfo::Default,
329 Name::str("_p"),
330 Box::new(Expr::Pi(
331 BinderInfo::Default,
332 Name::str("_x"),
333 Box::new(Expr::BVar(1)),
334 Box::new(Expr::Const(Name::str("Bool"), vec![])),
335 )),
336 Box::new(Expr::Pi(
337 BinderInfo::Default,
338 Name::str("_xs"),
339 Box::new(Expr::Const(Name::str("Unit"), vec![])),
340 Box::new(Expr::Const(Name::str("Bool"), vec![])),
341 )),
342 )),
343 )),
344 );
345 let any_decl = Declaration::Axiom {
346 name: Name::str("Vec.any"),
347 univ_params: vec![],
348 ty: any_ty,
349 };
350 let _ = env.add(any_decl);
351 let all_true_ty = Expr::Pi(
352 BinderInfo::Implicit,
353 Name::str("α"),
354 Box::new(type1.clone()),
355 Box::new(Expr::Pi(
356 BinderInfo::Implicit,
357 Name::str("n"),
358 Box::new(nat_ty.clone()),
359 Box::new(Expr::Const(Name::str("True"), vec![])),
360 )),
361 );
362 let all_true_decl = Declaration::Axiom {
363 name: Name::str("Vec.all_true"),
364 univ_params: vec![],
365 ty: all_true_ty,
366 };
367 let _ = env.add(all_true_decl);
368}
369#[allow(dead_code)]
371pub fn register_vec_scan_axioms(env: &mut Environment) {
372 use oxilean_kernel::{BinderInfo, Declaration, Expr, Level, Name};
373 let type1 = Expr::Sort(Level::succ(Level::zero()));
374 let nat_ty = Expr::Const(Name::str("Nat"), vec![]);
375 let scanl_ty = Expr::Pi(
376 BinderInfo::Implicit,
377 Name::str("α"),
378 Box::new(type1.clone()),
379 Box::new(Expr::Pi(
380 BinderInfo::Implicit,
381 Name::str("β"),
382 Box::new(type1.clone()),
383 Box::new(Expr::Pi(
384 BinderInfo::Default,
385 Name::str("_f"),
386 Box::new(Expr::Const(Name::str("Unit"), vec![])),
387 Box::new(Expr::Pi(
388 BinderInfo::Default,
389 Name::str("_init"),
390 Box::new(Expr::BVar(2)),
391 Box::new(Expr::Pi(
392 BinderInfo::Implicit,
393 Name::str("n"),
394 Box::new(nat_ty.clone()),
395 Box::new(Expr::Pi(
396 BinderInfo::Default,
397 Name::str("_xs"),
398 Box::new(Expr::Const(Name::str("Unit"), vec![])),
399 Box::new(Expr::Const(Name::str("Unit"), vec![])),
400 )),
401 )),
402 )),
403 )),
404 )),
405 );
406 let scanl_decl = Declaration::Axiom {
407 name: Name::str("Vec.scanl"),
408 univ_params: vec![],
409 ty: scanl_ty,
410 };
411 let _ = env.add(scanl_decl);
412 let scanl_length_ty = Expr::Pi(
413 BinderInfo::Implicit,
414 Name::str("α"),
415 Box::new(type1.clone()),
416 Box::new(Expr::Pi(
417 BinderInfo::Implicit,
418 Name::str("β"),
419 Box::new(type1.clone()),
420 Box::new(Expr::Pi(
421 BinderInfo::Implicit,
422 Name::str("n"),
423 Box::new(nat_ty.clone()),
424 Box::new(Expr::Const(Name::str("True"), vec![])),
425 )),
426 )),
427 );
428 let scanl_length_decl = Declaration::Axiom {
429 name: Name::str("Vec.scanl_length"),
430 univ_params: vec![],
431 ty: scanl_length_ty,
432 };
433 let _ = env.add(scanl_length_decl);
434}
435#[allow(dead_code)]
437pub fn register_vec_replicate_axioms(env: &mut Environment) {
438 use oxilean_kernel::{BinderInfo, Declaration, Expr, Level, Name};
439 let type1 = Expr::Sort(Level::succ(Level::zero()));
440 let nat_ty = Expr::Const(Name::str("Nat"), vec![]);
441 let replicate_ty = Expr::Pi(
442 BinderInfo::Implicit,
443 Name::str("α"),
444 Box::new(type1.clone()),
445 Box::new(Expr::Pi(
446 BinderInfo::Default,
447 Name::str("n"),
448 Box::new(nat_ty.clone()),
449 Box::new(Expr::Pi(
450 BinderInfo::Default,
451 Name::str("_x"),
452 Box::new(Expr::BVar(1)),
453 Box::new(Expr::App(
454 Box::new(Expr::App(
455 Box::new(Expr::Const(Name::str("Vec"), vec![])),
456 Box::new(Expr::BVar(2)),
457 )),
458 Box::new(Expr::BVar(1)),
459 )),
460 )),
461 )),
462 );
463 let replicate_decl = Declaration::Axiom {
464 name: Name::str("Vec.replicate"),
465 univ_params: vec![],
466 ty: replicate_ty,
467 };
468 let _ = env.add(replicate_decl);
469 let rep_zero_ty = Expr::Pi(
470 BinderInfo::Implicit,
471 Name::str("α"),
472 Box::new(type1.clone()),
473 Box::new(Expr::Pi(
474 BinderInfo::Default,
475 Name::str("_x"),
476 Box::new(Expr::BVar(0)),
477 Box::new(Expr::Const(Name::str("True"), vec![])),
478 )),
479 );
480 let rep_zero_decl = Declaration::Axiom {
481 name: Name::str("Vec.replicate_zero"),
482 univ_params: vec![],
483 ty: rep_zero_ty,
484 };
485 let _ = env.add(rep_zero_decl);
486 let rep_succ_ty = Expr::Pi(
487 BinderInfo::Implicit,
488 Name::str("α"),
489 Box::new(type1.clone()),
490 Box::new(Expr::Pi(
491 BinderInfo::Default,
492 Name::str("n"),
493 Box::new(nat_ty.clone()),
494 Box::new(Expr::Pi(
495 BinderInfo::Default,
496 Name::str("_x"),
497 Box::new(Expr::BVar(1)),
498 Box::new(Expr::Const(Name::str("True"), vec![])),
499 )),
500 )),
501 );
502 let rep_succ_decl = Declaration::Axiom {
503 name: Name::str("Vec.replicate_succ"),
504 univ_params: vec![],
505 ty: rep_succ_ty,
506 };
507 let _ = env.add(rep_succ_decl);
508 let map_rep_ty = Expr::Pi(
509 BinderInfo::Implicit,
510 Name::str("α"),
511 Box::new(type1.clone()),
512 Box::new(Expr::Pi(
513 BinderInfo::Implicit,
514 Name::str("β"),
515 Box::new(type1.clone()),
516 Box::new(Expr::Pi(
517 BinderInfo::Default,
518 Name::str("_f"),
519 Box::new(Expr::Pi(
520 BinderInfo::Default,
521 Name::str("_x"),
522 Box::new(Expr::BVar(1)),
523 Box::new(Expr::BVar(2)),
524 )),
525 Box::new(Expr::Pi(
526 BinderInfo::Default,
527 Name::str("n"),
528 Box::new(nat_ty.clone()),
529 Box::new(Expr::Pi(
530 BinderInfo::Default,
531 Name::str("_x"),
532 Box::new(Expr::BVar(3)),
533 Box::new(Expr::Const(Name::str("True"), vec![])),
534 )),
535 )),
536 )),
537 )),
538 );
539 let map_rep_decl = Declaration::Axiom {
540 name: Name::str("Vec.map_replicate"),
541 univ_params: vec![],
542 ty: map_rep_ty,
543 };
544 let _ = env.add(map_rep_decl);
545}
546#[cfg(test)]
547mod tests_vec_extended {
548 use super::*;
549 use oxilean_kernel::{Environment, InductiveEnv, Name};
550 #[test]
551 fn test_vec_zip_axioms_registered() {
552 let mut env = Environment::new();
553 let mut ind_env = InductiveEnv::new();
554 let _ = build_vec_env(&mut env, &mut ind_env);
555 register_vec_zip_axioms(&mut env);
556 assert!(env.get(&Name::str("Vec.zip")).is_some());
557 assert!(env.get(&Name::str("Vec.zip_nil")).is_some());
558 assert!(env.get(&Name::str("Vec.zip_length")).is_some());
559 }
560 #[test]
561 fn test_vec_unzip_axioms_registered() {
562 let mut env = Environment::new();
563 let mut ind_env = InductiveEnv::new();
564 let _ = build_vec_env(&mut env, &mut ind_env);
565 register_vec_unzip_axioms(&mut env);
566 assert!(env.get(&Name::str("Vec.unzip")).is_some());
567 assert!(env.get(&Name::str("Vec.zip_unzip")).is_some());
568 }
569 #[test]
570 fn test_vec_fold_axioms_registered() {
571 let mut env = Environment::new();
572 let mut ind_env = InductiveEnv::new();
573 let _ = build_vec_env(&mut env, &mut ind_env);
574 register_vec_fold_axioms(&mut env);
575 assert!(env.get(&Name::str("Vec.foldl")).is_some());
576 assert!(env.get(&Name::str("Vec.foldl_nil")).is_some());
577 assert!(env.get(&Name::str("Vec.foldl_cons")).is_some());
578 assert!(env.get(&Name::str("Vec.foldr")).is_some());
579 }
580 #[test]
581 fn test_vec_predicate_axioms_registered() {
582 let mut env = Environment::new();
583 let mut ind_env = InductiveEnv::new();
584 let _ = build_vec_env(&mut env, &mut ind_env);
585 register_vec_predicate_axioms(&mut env);
586 assert!(env.get(&Name::str("Vec.all")).is_some());
587 assert!(env.get(&Name::str("Vec.any")).is_some());
588 assert!(env.get(&Name::str("Vec.all_true")).is_some());
589 }
590 #[test]
591 fn test_vec_scan_axioms_registered() {
592 let mut env = Environment::new();
593 let mut ind_env = InductiveEnv::new();
594 let _ = build_vec_env(&mut env, &mut ind_env);
595 register_vec_scan_axioms(&mut env);
596 assert!(env.get(&Name::str("Vec.scanl")).is_some());
597 assert!(env.get(&Name::str("Vec.scanl_length")).is_some());
598 }
599 #[test]
600 fn test_vec_replicate_axioms_registered() {
601 let mut env = Environment::new();
602 let mut ind_env = InductiveEnv::new();
603 let _ = build_vec_env(&mut env, &mut ind_env);
604 register_vec_replicate_axioms(&mut env);
605 assert!(env.get(&Name::str("Vec.replicate")).is_some());
606 assert!(env.get(&Name::str("Vec.replicate_zero")).is_some());
607 assert!(env.get(&Name::str("Vec.replicate_succ")).is_some());
608 assert!(env.get(&Name::str("Vec.map_replicate")).is_some());
609 }
610}