The finite set datatype is a family of types indexed
by nat, where the type fin n has exactly n
elements, which can be thought of as the set of numbers
.
The function f_plus lifts elements from
to
, f_plus_assoc coerces elements in
to
.
** Module lib_finite Imports lib_nat
$fin : nat->Type(fin)
$f_zero : {n:nat}fin (suc n)
$f_suc : {n|nat}(fin n)->fin (suc n)
$fin_elim :
{C_fin:{n|nat}(fin n)->TYPE}({n:nat}C_fin (f_zero n))->
({n|nat}{x:fin n}(C_fin x)->C_fin (f_suc x))->{n|nat}{z:fin n}
C_fin z
** Label (!fin!) fin
** Label (!fin elim!) fin_elim
** Label (!fin f_zero!) f_zero
** Label (!fin f_suc!) f_suc
[[C_fin:{n|nat}(fin n)->TYPE][f_f_zero:{n1:nat}C_fin (f_zero n1)]
[f_f_suc:{n|nat}{x:fin n}(C_fin x)->C_fin (f_suc x)][n1:nat][n|nat]
[x:fin n]
fin_elim C_fin f_f_zero f_f_suc (f_zero n1) ==> f_f_zero n1
|| fin_elim C_fin f_f_zero f_f_suc (f_suc x) ==>
f_f_suc x (fin_elim C_fin f_f_zero f_f_suc x)]
f_plus = ... : {n,m|nat}(fin n)->fin (plus m n)
fin_elim'_lemma = ... :
{n:nat}{m:fin (suc n)}{P:(fin (suc n))->Type}(P (f_zero n))->
({m'5:fin n}P (f_suc m'5))->P m
fin_elim' = ... :
{n:nat}{P:(fin (suc n))->Type}(P (f_zero n))->
({m:fin n}P (f_suc m))->{m:fin (suc n)}P m
fin_rec = ... :
{C|Type}(nat->C)->({n|nat}(fin n)->C->C)->{n|nat}(fin n)->C
fin_iter = ... : {C|Type}(nat->C)->(nat->C->C)->{n|nat}(fin n)->C
fin_ind = ... :
{P:{n:nat}(fin n)->Prop}({n:nat}P (f_zero n))->
({n|nat}{x:fin n}(P x)->P (f_suc x))->{n|nat}{z:fin n}P z
fin_rec' = ... : {n:nat}{C|Type}C->((fin n)->C)->(fin (suc n))->C
fin_ind' = ... :
{n:nat}{P:(fin (suc n))->Prop}(P (f_zero n))->
({m:fin n}P (f_suc m))->{m:fin (suc n)}P m
peano2_fin = ... : {n:nat}{x:fin n}not (Eq (f_suc x) (f_zero n))
peano3_fin = ... : {n:nat}{x,y:fin n}(Eq (f_suc x) (f_suc y))->Eq x y
inj_void = ... :
{n:nat}{x:fin (suc n)}(not (Eq x (f_zero n)))->
Ex ([x':fin n]Eq x (f_suc x'))
finite_is_zero_or_succ = ... :
{n:nat}{x:fin (suc n)}
(Eq x (f_zero n) \/ Ex ([x':fin n]Eq x (f_suc x')))
zero_set_is_empty = ... : (fin zero)->absurd
fin_zero_lemma = ... :
{n|nat}{x:fin n}
nat_elim ([x'3:nat](fin x'3)->Type)
([x'3:fin zero]{P:(fin zero)->Type}P x'3)
([n'3:nat][_:(fin n'3)->Type][_:fin (suc n'3)]{t:Type}t->t) n x
fin_elim_zero = ... : {P:(fin zero)->Type}{x:fin zero}P x
f_plus_assoc = ... :
{n,o,m|nat}(fin (plus m (plus n o)))->fin (plus (plus m n) o)
fin_to_nat = ... : {n|nat}(fin n)->nat
fin_to_nat_resp_suc = ... :
{n|nat}{x:fin n}Eq (suc (fin_to_nat x)) (fin_to_nat (f_suc x))