1
<html xmlns="http://www.w3.org/1999/xhtml">
3
<meta http-equiv="Content-Type" content="text/html; charset="><link rel="stylesheet" href="style.css" type="text/css"><title>Coq.ZArith.Zeven</title>
8
<h1>Library Coq.ZArith.Zeven</h1>
11
<code class="keyword">Require</code> <code class="keyword">Import</code> BinInt.<br/>
16
<table width="100%"><tr class="doc"><td>
17
About parity: even and odd predicates on Z, division by 2 on Z
24
<table width="100%"><tr class="doc"><td>
25
<code>Zeven</code>, <code>Zodd</code>, <code>Zdiv2</code> and their related properties
30
<code class="keyword">Definition</code> <a name="Zeven"></a>Zeven (z:<a href="Coq.ZArith.BinInt.html#Z">Z</a>) :=<br/>
31
match z with<br/>
32
| <a href="Coq.ZArith.BinInt.html#Z0">Z0</a> => <a href="Coq.Init.Logic.html#True">True</a><br/>
33
| <a href="Coq.ZArith.BinInt.html#Zpos">Zpos</a> (<a href="Coq.NArith.BinPos.html#xO">xO</a> _) => <a href="Coq.Init.Logic.html#True">True</a><br/>
34
| <a href="Coq.ZArith.BinInt.html#Zneg">Zneg</a> (<a href="Coq.NArith.BinPos.html#xO">xO</a> _) => <a href="Coq.Init.Logic.html#True">True</a><br/>
35
| _ => <a href="Coq.Init.Logic.html#False">False</a><br/>
39
<code class="keyword">Definition</code> <a name="Zodd"></a>Zodd (z:<a href="Coq.ZArith.BinInt.html#Z">Z</a>) :=<br/>
40
match z with<br/>
41
| <a href="Coq.ZArith.BinInt.html#Zpos">Zpos</a> <a href="Coq.NArith.BinPos.html#xH">xH</a> => <a href="Coq.Init.Logic.html#True">True</a><br/>
42
| <a href="Coq.ZArith.BinInt.html#Zneg">Zneg</a> <a href="Coq.NArith.BinPos.html#xH">xH</a> => <a href="Coq.Init.Logic.html#True">True</a><br/>
43
| <a href="Coq.ZArith.BinInt.html#Zpos">Zpos</a> (<a href="Coq.NArith.BinPos.html#xI">xI</a> _) => <a href="Coq.Init.Logic.html#True">True</a><br/>
44
| <a href="Coq.ZArith.BinInt.html#Zneg">Zneg</a> (<a href="Coq.NArith.BinPos.html#xI">xI</a> _) => <a href="Coq.Init.Logic.html#True">True</a><br/>
45
| _ => <a href="Coq.Init.Logic.html#False">False</a><br/>
49
<code class="keyword">Definition</code> <a name="Zeven_bool"></a>Zeven_bool (z:<a href="Coq.ZArith.BinInt.html#Z">Z</a>) :=<br/>
50
match z with<br/>
51
| <a href="Coq.ZArith.BinInt.html#Z0">Z0</a> => <a href="Coq.Init.Datatypes.html#true">true</a><br/>
52
| <a href="Coq.ZArith.BinInt.html#Zpos">Zpos</a> (<a href="Coq.NArith.BinPos.html#xO">xO</a> _) => <a href="Coq.Init.Datatypes.html#true">true</a><br/>
53
| <a href="Coq.ZArith.BinInt.html#Zneg">Zneg</a> (<a href="Coq.NArith.BinPos.html#xO">xO</a> _) => <a href="Coq.Init.Datatypes.html#true">true</a><br/>
54
| _ => <a href="Coq.Init.Datatypes.html#false">false</a><br/>
58
<code class="keyword">Definition</code> <a name="Zodd_bool"></a>Zodd_bool (z:<a href="Coq.ZArith.BinInt.html#Z">Z</a>) :=<br/>
59
match z with<br/>
60
| <a href="Coq.ZArith.BinInt.html#Z0">Z0</a> => <a href="Coq.Init.Datatypes.html#false">false</a><br/>
61
| <a href="Coq.ZArith.BinInt.html#Zpos">Zpos</a> (<a href="Coq.NArith.BinPos.html#xO">xO</a> _) => <a href="Coq.Init.Datatypes.html#false">false</a><br/>
62
| <a href="Coq.ZArith.BinInt.html#Zneg">Zneg</a> (<a href="Coq.NArith.BinPos.html#xO">xO</a> _) => <a href="Coq.Init.Datatypes.html#false">false</a><br/>
63
| _ => <a href="Coq.Init.Datatypes.html#true">true</a><br/>
67
<code class="keyword">Definition</code> <a name="Zeven_odd_dec"></a>Zeven_odd_dec : forall z:<a href="Coq.ZArith.BinInt.html#Z">Z</a>, {<a href="Coq.ZArith.Zeven.html#Zeven">Zeven</a> z} + {<a href="Coq.ZArith.Zeven.html#Zodd">Zodd</a> z}.<br/>
68
<code class="keyword">Proof</code>.<br/>
69
intro z. case z;<br/>
70
[ left; compute in |- *; trivial
71
| intro p; case p; intros;
72
(right; compute in |- *; exact I) || (left; compute in |- *; exact I)
73
| intro p; case p; intros;
74
(right; compute in |- *; exact I) || (left; compute in |- *; exact I) ].<br/>
75
<code class="keyword">Defined</code>.<br/>
78
<code class="keyword">Definition</code> <a name="Zeven_dec"></a>Zeven_dec : forall z:<a href="Coq.ZArith.BinInt.html#Z">Z</a>, {<a href="Coq.ZArith.Zeven.html#Zeven">Zeven</a> z} + {~ <a href="Coq.ZArith.Zeven.html#Zeven">Zeven</a> z}.<br/>
79
<code class="keyword">Proof</code>.<br/>
80
intro z. case z;<br/>
81
[ left; compute in |- *; trivial
82
| intro p; case p; intros;
83
(left; compute in |- *; exact I) || (right; compute in |- *; trivial)
84
| intro p; case p; intros;
85
(left; compute in |- *; exact I) || (right; compute in |- *; trivial) ].<br/>
86
<code class="keyword">Defined</code>.<br/>
89
<code class="keyword">Definition</code> <a name="Zodd_dec"></a>Zodd_dec : forall z:<a href="Coq.ZArith.BinInt.html#Z">Z</a>, {<a href="Coq.ZArith.Zeven.html#Zodd">Zodd</a> z} + {~ <a href="Coq.ZArith.Zeven.html#Zodd">Zodd</a> z}.<br/>
90
<code class="keyword">Proof</code>.<br/>
91
intro z. case z;<br/>
92
[ right; compute in |- *; trivial
93
| intro p; case p; intros;
94
(left; compute in |- *; exact I) || (right; compute in |- *; trivial)
95
| intro p; case p; intros;
96
(left; compute in |- *; exact I) || (right; compute in |- *; trivial) ].<br/>
97
<code class="keyword">Defined</code>.<br/>
100
<code class="keyword">Lemma</code> <a name="Zeven_not_Zodd"></a>Zeven_not_Zodd : forall n:<a href="Coq.ZArith.BinInt.html#Z">Z</a>, <a href="Coq.ZArith.Zeven.html#Zeven">Zeven</a> n -> ~ <a href="Coq.ZArith.Zeven.html#Zodd">Zodd</a> n.<br/>
101
<code class="keyword">Proof</code>.<br/>
102
intro z; destruct z; [ idtac | destruct p | destruct p ]; compute in |- *;<br/>
103
trivial.<br/>
104
<code class="keyword">Qed</code>.<br/>
107
<code class="keyword">Lemma</code> <a name="Zodd_not_Zeven"></a>Zodd_not_Zeven : forall n:<a href="Coq.ZArith.BinInt.html#Z">Z</a>, <a href="Coq.ZArith.Zeven.html#Zodd">Zodd</a> n -> ~ <a href="Coq.ZArith.Zeven.html#Zeven">Zeven</a> n.<br/>
108
<code class="keyword">Proof</code>.<br/>
109
intro z; destruct z; [ idtac | destruct p | destruct p ]; compute in |- *;<br/>
110
trivial.<br/>
111
<code class="keyword">Qed</code>.<br/>
114
<code class="keyword">Lemma</code> <a name="Zeven_Sn"></a>Zeven_Sn : forall n:<a href="Coq.ZArith.BinInt.html#Z">Z</a>, <a href="Coq.ZArith.Zeven.html#Zodd">Zodd</a> n -> <a href="Coq.ZArith.Zeven.html#Zeven">Zeven</a> (<a href="Coq.ZArith.BinInt.html#Zsucc">Zsucc</a> n).<br/>
115
<code class="keyword">Proof</code>.<br/>
116
intro z; destruct z; unfold Zsucc in |- *;<br/>
117
[ idtac | destruct p | destruct p ]; simpl in |- *; <br/>
118
trivial. <br/>
119
unfold Pdouble_minus_one in |- *; case p; simpl in |- *; auto.<br/>
120
<code class="keyword">Qed</code>.<br/>
123
<code class="keyword">Lemma</code> <a name="Zodd_Sn"></a>Zodd_Sn : forall n:<a href="Coq.ZArith.BinInt.html#Z">Z</a>, <a href="Coq.ZArith.Zeven.html#Zeven">Zeven</a> n -> <a href="Coq.ZArith.Zeven.html#Zodd">Zodd</a> (<a href="Coq.ZArith.BinInt.html#Zsucc">Zsucc</a> n).<br/>
124
<code class="keyword">Proof</code>.<br/>
125
intro z; destruct z; unfold Zsucc in |- *;<br/>
126
[ idtac | destruct p | destruct p ]; simpl in |- *; <br/>
127
trivial. <br/>
128
unfold Pdouble_minus_one in |- *; case p; simpl in |- *; auto.<br/>
129
<code class="keyword">Qed</code>.<br/>
132
<code class="keyword">Lemma</code> <a name="Zeven_pred"></a>Zeven_pred : forall n:<a href="Coq.ZArith.BinInt.html#Z">Z</a>, <a href="Coq.ZArith.Zeven.html#Zodd">Zodd</a> n -> <a href="Coq.ZArith.Zeven.html#Zeven">Zeven</a> (<a href="Coq.ZArith.BinInt.html#Zpred">Zpred</a> n).<br/>
133
<code class="keyword">Proof</code>.<br/>
134
intro z; destruct z; unfold Zpred in |- *;<br/>
135
[ idtac | destruct p | destruct p ]; simpl in |- *; <br/>
136
trivial. <br/>
137
unfold Pdouble_minus_one in |- *; case p; simpl in |- *; auto.<br/>
138
<code class="keyword">Qed</code>.<br/>
141
<code class="keyword">Lemma</code> <a name="Zodd_pred"></a>Zodd_pred : forall n:<a href="Coq.ZArith.BinInt.html#Z">Z</a>, <a href="Coq.ZArith.Zeven.html#Zeven">Zeven</a> n -> <a href="Coq.ZArith.Zeven.html#Zodd">Zodd</a> (<a href="Coq.ZArith.BinInt.html#Zpred">Zpred</a> n).<br/>
142
<code class="keyword">Proof</code>.<br/>
143
intro z; destruct z; unfold Zpred in |- *;<br/>
144
[ idtac | destruct p | destruct p ]; simpl in |- *; <br/>
145
trivial. <br/>
146
unfold Pdouble_minus_one in |- *; case p; simpl in |- *; auto.<br/>
147
<code class="keyword">Qed</code>.<br/>
150
<code class="keyword">Hint</code> Unfold Zeven Zodd: zarith.<br/>
155
<table width="100%"><tr class="doc"><td>
156
<code>Zdiv2</code> is defined on all <code>Z</code>, but notice that for odd negative
157
integers it is not the euclidean quotient: in that case we have <code>n =
163
<code class="keyword">Definition</code> <a name="Zdiv2"></a>Zdiv2 (z:<a href="Coq.ZArith.BinInt.html#Z">Z</a>) :=<br/>
164
match z with<br/>
165
| <a href="Coq.ZArith.BinInt.html#Z0">Z0</a> => 0%Z<br/>
166
| <a href="Coq.ZArith.BinInt.html#Zpos">Zpos</a> <a href="Coq.NArith.BinPos.html#xH">xH</a> => 0%Z<br/>
167
| <a href="Coq.ZArith.BinInt.html#Zpos">Zpos</a> p => <a href="Coq.ZArith.BinInt.html#Zpos">Zpos</a> (<a href="Coq.NArith.BinPos.html#Pdiv2">Pdiv2</a> p)<br/>
168
| <a href="Coq.ZArith.BinInt.html#Zneg">Zneg</a> <a href="Coq.NArith.BinPos.html#xH">xH</a> => 0%Z<br/>
169
| <a href="Coq.ZArith.BinInt.html#Zneg">Zneg</a> p => <a href="Coq.ZArith.BinInt.html#Zneg">Zneg</a> (<a href="Coq.NArith.BinPos.html#Pdiv2">Pdiv2</a> p)<br/>
170
end.<br/>
173
<code class="keyword">Lemma</code> <a name="Zeven_div2"></a>Zeven_div2 : forall n:<a href="Coq.ZArith.BinInt.html#Z">Z</a>, <a href="Coq.ZArith.Zeven.html#Zeven">Zeven</a> n -> n = (2 * <a href="Coq.ZArith.Zeven.html#Zdiv2">Zdiv2</a> n)%Z.<br/>
174
<code class="keyword">Proof</code>.<br/>
175
intro x; destruct x.<br/>
176
auto with arith.<br/>
177
destruct p; auto with arith.<br/>
178
intros. absurd (<a href="Coq.ZArith.Zeven.html#Zeven">Zeven</a> (<a href="Coq.ZArith.BinInt.html#Zpos">Zpos</a> (<a href="Coq.NArith.BinPos.html#xI">xI</a> p))); red in |- *; auto with arith.<br/>
179
intros. absurd (<a href="Coq.ZArith.Zeven.html#Zeven">Zeven</a> 1); red in |- *; auto with arith.<br/>
180
destruct p; auto with arith.<br/>
181
intros. absurd (<a href="Coq.ZArith.Zeven.html#Zeven">Zeven</a> (<a href="Coq.ZArith.BinInt.html#Zneg">Zneg</a> (<a href="Coq.NArith.BinPos.html#xI">xI</a> p))); red in |- *; auto with arith.<br/>
182
intros. absurd (<a href="Coq.ZArith.Zeven.html#Zeven">Zeven</a> (-1)); red in |- *; auto with arith.<br/>
183
<code class="keyword">Qed</code>.<br/>
186
<code class="keyword">Lemma</code> <a name="Zodd_div2"></a>Zodd_div2 : forall n:<a href="Coq.ZArith.BinInt.html#Z">Z</a>, (n >= 0)%Z -> <a href="Coq.ZArith.Zeven.html#Zodd">Zodd</a> n -> n = (2 * <a href="Coq.ZArith.Zeven.html#Zdiv2">Zdiv2</a> n + 1)%Z.<br/>
187
<code class="keyword">Proof</code>.<br/>
188
intro x; destruct x.<br/>
189
intros. absurd (<a href="Coq.ZArith.Zeven.html#Zodd">Zodd</a> 0); red in |- *; auto with arith.<br/>
190
destruct p; auto with arith.<br/>
191
intros. absurd (<a href="Coq.ZArith.Zeven.html#Zodd">Zodd</a> (<a href="Coq.ZArith.BinInt.html#Zpos">Zpos</a> (<a href="Coq.NArith.BinPos.html#xO">xO</a> p))); red in |- *; auto with arith.<br/>
192
intros. absurd (<a href="Coq.ZArith.BinInt.html#Zneg">Zneg</a> p >= 0)%Z; red in |- *; auto with arith.<br/>
193
<code class="keyword">Qed</code>.<br/>
196
<code class="keyword">Lemma</code> <a name="Zodd_div2_neg"></a>Zodd_div2_neg :<br/>
197
forall n:<a href="Coq.ZArith.BinInt.html#Z">Z</a>, (n <= 0)%Z -> <a href="Coq.ZArith.Zeven.html#Zodd">Zodd</a> n -> n = (2 * <a href="Coq.ZArith.Zeven.html#Zdiv2">Zdiv2</a> n - 1)%Z.<br/>
198
<code class="keyword">Proof</code>.<br/>
199
intro x; destruct x.<br/>
200
intros. absurd (<a href="Coq.ZArith.Zeven.html#Zodd">Zodd</a> 0); red in |- *; auto with arith.<br/>
201
intros. absurd (<a href="Coq.ZArith.BinInt.html#Zneg">Zneg</a> p >= 0)%Z; red in |- *; auto with arith.<br/>
202
destruct p; auto with arith.<br/>
203
intros. absurd (<a href="Coq.ZArith.Zeven.html#Zodd">Zodd</a> (<a href="Coq.ZArith.BinInt.html#Zneg">Zneg</a> (<a href="Coq.NArith.BinPos.html#xO">xO</a> p))); red in |- *; auto with arith.<br/>
204
<code class="keyword">Qed</code>.<br/>
207
<code class="keyword">Lemma</code> <a name="Z_modulo_2"></a>Z_modulo_2 :<br/>
208
forall n:<a href="Coq.ZArith.BinInt.html#Z">Z</a>, {y : <a href="Coq.ZArith.BinInt.html#Z">Z</a> | n = (2 * y)%Z} + {y : <a href="Coq.ZArith.BinInt.html#Z">Z</a> | n = (2 * y + 1)%Z}.<br/>
209
<code class="keyword">Proof</code>.<br/>
211
elim (<a href="Coq.ZArith.Zeven.html#Zeven_odd_dec">Zeven_odd_dec</a> x); intro.<br/>
212
left. split with (<a href="Coq.ZArith.Zeven.html#Zdiv2">Zdiv2</a> x). exact (<a href="Coq.ZArith.Zeven.html#Zeven_div2">Zeven_div2</a> x a).<br/>
213
right. generalize b; clear b; case x.<br/>
214
intro b; inversion b.<br/>
215
intro p; split with (<a href="Coq.ZArith.Zeven.html#Zdiv2">Zdiv2</a> (<a href="Coq.ZArith.BinInt.html#Zpos">Zpos</a> p)). apply (<a href="Coq.ZArith.Zeven.html#Zodd_div2">Zodd_div2</a> (<a href="Coq.ZArith.BinInt.html#Zpos">Zpos</a> p)); trivial.<br/>
216
unfold Zge, Zcompare in |- *; simpl in |- *; discriminate.<br/>
217
intro p; split with (<a href="Coq.ZArith.Zeven.html#Zdiv2">Zdiv2</a> (<a href="Coq.ZArith.BinInt.html#Zpred">Zpred</a> (<a href="Coq.ZArith.BinInt.html#Zneg">Zneg</a> p))).<br/>
218
pattern (<a href="Coq.ZArith.BinInt.html#Zneg">Zneg</a> p) at 1 in |- *; rewrite (<a href="Coq.ZArith.BinInt.html#Zsucc_pred">Zsucc_pred</a> (<a href="Coq.ZArith.BinInt.html#Zneg">Zneg</a> p)).<br/>
219
pattern (<a href="Coq.ZArith.BinInt.html#Zpred">Zpred</a> (<a href="Coq.ZArith.BinInt.html#Zneg">Zneg</a> p)) at 1 in |- *; rewrite (<a href="Coq.ZArith.Zeven.html#Zeven_div2">Zeven_div2</a> (<a href="Coq.ZArith.BinInt.html#Zpred">Zpred</a> (<a href="Coq.ZArith.BinInt.html#Zneg">Zneg</a> p))).<br/>
221
apply <a href="Coq.ZArith.Zeven.html#Zeven_pred">Zeven_pred</a>; assumption.<br/>
222
<code class="keyword">Qed</code>.<br/>
225
<code class="keyword">Lemma</code> <a name="Zsplit2"></a>Zsplit2 :<br/>
226
forall n:<a href="Coq.ZArith.BinInt.html#Z">Z</a>,<br/>
227
{p : <a href="Coq.ZArith.BinInt.html#Z">Z</a> * <a href="Coq.ZArith.BinInt.html#Z">Z</a> |<br/>
228
let (x1, x2) := p in n = (x1 + x2)%Z /\ (x1 = x2 \/ x2 = (x1 + 1)%Z)}.<br/>
229
<code class="keyword">Proof</code>.<br/>
231
elim (<a href="Coq.ZArith.Zeven.html#Z_modulo_2">Z_modulo_2</a> x); intros [y Hy]; rewrite <a href="Coq.ZArith.BinInt.html#Zmult_comm">Zmult_comm</a> in Hy;<br/>
232
rewrite <- <a href="Coq.ZArith.BinInt.html#Zplus_diag_eq_mult_2">Zplus_diag_eq_mult_2</a> in Hy.<br/>
233
exists (y, y); split. <br/>
235
left; reflexivity.<br/>
236
exists (y, (y + 1)%Z); split.<br/>
237
rewrite <a href="Coq.ZArith.BinInt.html#Zplus_assoc">Zplus_assoc</a>; assumption.<br/>
238
right; reflexivity.<br/>
239
<code class="keyword">Qed</code>.</code>
240
<hr/><a href="index.html">Index</a><hr/><font size="-1">This page has been generated by <a href="http://www.lri.fr/~filliatr/coqdoc/">coqdoc</a></font>
b'\\ No newline at end of file'