-
Notifications
You must be signed in to change notification settings - Fork 0
/
lists.v
92 lines (67 loc) · 1.67 KB
/
lists.v
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
(**********************************************LISTS*********************************************************)
Require Import List.
Import ListNotations.
Module MyList.
Inductive list (A : Type) : Type :=
| nil : list A
| cons : A -> list A -> list A.
End MyList.
Check list.
Definition is_empty (A : Type) (lst : list A) :=
match lst with
| nil => true
| cons _ _ => false
end.
Definition is_empty_sugar (A : Type) (lst : list A) :=
match lst with
| [] => true
| _::_ => false
end.
Compute is_empty nat [1].
Compute is_empty nat [].
Definition is_empty' {A : Type} (lst : list A) :=
match lst with
| [] => true
| _::_ => false
end.
Compute is_empty' [1].
Compute @is_empty' nat [1].
Module MyLength.
Fixpoint length {A : Type} (lst : list A) :=
match lst with
| nil => 0
| _::t => 1 + length t
end.
Compute length [1;2].
End MyLength.
(************************************************OPTIONS******************************************************)
Module MyOption.
Inductive option (A:Type) : Type :=
| Some : A -> option A
| None : option A.
End MyOption.
Definition hd_opt {A : Type} (lst : list A) : option A :=
match lst with
| nil => None
| x :: xs => Some x
end.
Compute hd_opt [1].
Compute @hd_opt nat [].
Theorem length0_implies_hdopt_is_none :
forall A : Type, forall lst : list A,
length lst = 0 -> hd_opt lst = None.
Proof.
intros A lst length_lst_is_0.
destruct lst.
trivial.
discriminate.
Qed.
Theorem length0_implies_hdopt_is_none' :
forall A : Type, forall lst : list A,
length lst = 0 -> hd_opt lst = None.
Proof.
intros A lst length_lst_is_0.
destruct lst.
- trivial.
- discriminate.
Qed.