1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
use super::*;
use fnat::{FAdd, Nat, Succ, Zero};
#[derive(Copy, Clone)]
pub struct FList(());
pub type List<A> = App<FList, A>;
pub struct Head<A>(A);
pub struct Tail<A>(A);
pub fn list_ty<A: Prop>(_a_ty: Ty<A, Type<Z>>) -> Ty<FList, Pow<Type<Z>, A>> {unimplemented!()}
pub fn list_def<A: Prop, B: Prop>(
_: Ty<A, List<B>>
) -> Or<Eq<A, Nil<B>>, Eq<A, Cons<B, Head<A>, Tail<A>>>> {
unimplemented!()
}
pub fn head_ty<A: Prop, B: Prop>(_: Ty<A, List<B>>, _: Not<Eq<A, Nil<B>>>) -> Ty<Head<A>, B> {
unimplemented!()
}
pub fn tail_ty<A: Prop, B: Prop>(
_: Ty<A, List<B>>,
_: Not<Eq<A, Nil<B>>>
) -> Ty<Tail<A>, List<B>> {
unimplemented!()
}
pub fn list_exists<A: Prop, B: VProp, C: VProp, X: Prop>(
_: Exists<Ty<Nil<A>, List<A>>, X>,
_: Exists<Ty<Cons<A, B, Nil<A>>, List<A>>, X>
) -> X {unimplemented!()}
#[derive(Copy, Clone)]
pub struct FNil(());
pub type Nil<A> = App<FNil, A>;
pub fn nil_ty<A: Prop>(_a_ty: Ty<A, Type<Z>>) -> Ty<Nil<A>, List<A>> {unimplemented!()}
#[derive(Copy, Clone)]
pub struct FCons(());
pub type Cons<X, A, B> = App<App<FCons, X>, Tup<A, B>>;
pub fn cons_ty<A: Prop>() -> Ty<App<FCons, A>, Pow<List<A>, Tup<A, List<A>>>> {
unimplemented!()
}
#[derive(Copy, Clone)]
pub struct FConcat(());
pub type Concat<X, A, B> = App<App<FConcat, X>, Tup<A, B>>;
pub fn concat_ty<A: Prop>(
_a_ty: Ty<A, Type<Z>>
) -> Ty<App<FConcat, A>, Pow<List<A>, Tup<List<A>, List<A>>>> {unimplemented!()}
pub fn concat_nil<X: Prop, A: Prop>(
_ty_nil: Ty<Nil<X>, List<X>>,
_ty_a: Ty<A, List<X>>
) -> Eq<Concat<X, Nil<X>, A>, A> {unimplemented!()}
pub fn concat_cons<X: Prop, A: Prop, B: Prop, C: Prop>(
_ty_cons: Ty<Cons<X, A, B>, List<X>>,
_ty_c: Ty<C, List<X>>
) -> Eq<Concat<X, Cons<X, A, B>, C>, Cons<X, A, Concat<X, B, C>>> {unimplemented!()}
pub fn norm1_concat_len<X: Prop>() -> Eq<SymNorm2<App<FConcat, X>, App<FLen, X>>, FAdd> {
unimplemented!()
}
#[derive(Copy, Clone)]
pub struct FLen(());
pub type Len<X, A> = App<App<FLen, X>, A>;
pub fn len_ty<A: Prop>(_a: Ty<A, Type<Z>>) -> Ty<App<FLen, A>, Pow<Nat, List<A>>> {
unimplemented!()
}
pub fn len_nil<A: Prop>(_: Ty<Nil<A>, List<A>>) -> Eq<Len<A, Nil<A>>, Zero> {unimplemented!()}
pub fn len_cons<X: Prop, A: Prop, B: Prop>(
_: Ty<Cons<X, A, B>, List<A>>
) -> Eq<Len<X, Cons<X, A, B>>, Succ<Len<X, B>>> {
unimplemented!()
}