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.NArith.BinPos</title>
8
<h1>Library Coq.NArith.BinPos</h1>
13
<table width="100%"><tr class="doc"><td>
14
Binary positive numbers
21
<table width="100%"><tr class="doc"><td>
22
Original development by Pierre Cr�gut, CNET, Lannion, France
27
<code class="keyword">Inductive</code> <a name="positive"></a>positive : Set :=<br/>
28
| <a name="xI"></a>xI : positive -> positive<br/>
29
| <a name="xO"></a>xO : positive -> positive<br/>
30
| <a name="xH"></a>xH : positive.<br/>
35
<table width="100%"><tr class="doc"><td>
36
Declare binding key for scope positive_scope
41
Delimit Scope positive_scope with positive.<br/>
46
<table width="100%"><tr class="doc"><td>
47
Automatically open scope positive_scope for type positive, xO and xI
52
Bind Scope positive_scope with positive.<br/>
53
Arguments Scope xO [positive_scope].<br/>
54
Arguments Scope xI [positive_scope].<br/>
59
<table width="100%"><tr class="doc"><td>
65
<code class="keyword">Fixpoint</code> <a name="Psucc"></a>Psucc (x:<a href="Coq.NArith.BinPos.html#positive">positive</a>) : <a href="Coq.NArith.BinPos.html#positive">positive</a> :=<br/>
66
match x with<br/>
67
| <a href="Coq.NArith.BinPos.html#xI">xI</a> x' => <a href="Coq.NArith.BinPos.html#xO">xO</a> (Psucc x')<br/>
68
| <a href="Coq.NArith.BinPos.html#xO">xO</a> x' => <a href="Coq.NArith.BinPos.html#xI">xI</a> x'<br/>
69
| <a href="Coq.NArith.BinPos.html#xH">xH</a> => <a href="Coq.NArith.BinPos.html#xO">xO</a> <a href="Coq.NArith.BinPos.html#xH">xH</a><br/>
75
<table width="100%"><tr class="doc"><td>
81
<code class="keyword">Fixpoint</code> <a name="Pplus"></a>Pplus (x y:<a href="Coq.NArith.BinPos.html#positive">positive</a>) {struct x} : <a href="Coq.NArith.BinPos.html#positive">positive</a> :=<br/>
82
match x, y with<br/>
83
| <a href="Coq.NArith.BinPos.html#xI">xI</a> x', <a href="Coq.NArith.BinPos.html#xI">xI</a> y' => <a href="Coq.NArith.BinPos.html#xO">xO</a> (Pplus_carry x' y')<br/>
84
| <a href="Coq.NArith.BinPos.html#xI">xI</a> x', <a href="Coq.NArith.BinPos.html#xO">xO</a> y' => <a href="Coq.NArith.BinPos.html#xI">xI</a> (Pplus x' y')<br/>
85
| <a href="Coq.NArith.BinPos.html#xI">xI</a> x', <a href="Coq.NArith.BinPos.html#xH">xH</a> => <a href="Coq.NArith.BinPos.html#xO">xO</a> (<a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> x')<br/>
86
| <a href="Coq.NArith.BinPos.html#xO">xO</a> x', <a href="Coq.NArith.BinPos.html#xI">xI</a> y' => <a href="Coq.NArith.BinPos.html#xI">xI</a> (Pplus x' y')<br/>
87
| <a href="Coq.NArith.BinPos.html#xO">xO</a> x', <a href="Coq.NArith.BinPos.html#xO">xO</a> y' => <a href="Coq.NArith.BinPos.html#xO">xO</a> (Pplus x' y')<br/>
88
| <a href="Coq.NArith.BinPos.html#xO">xO</a> x', <a href="Coq.NArith.BinPos.html#xH">xH</a> => <a href="Coq.NArith.BinPos.html#xI">xI</a> x'<br/>
89
| <a href="Coq.NArith.BinPos.html#xH">xH</a>, <a href="Coq.NArith.BinPos.html#xI">xI</a> y' => <a href="Coq.NArith.BinPos.html#xO">xO</a> (<a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> y')<br/>
90
| <a href="Coq.NArith.BinPos.html#xH">xH</a>, <a href="Coq.NArith.BinPos.html#xO">xO</a> y' => <a href="Coq.NArith.BinPos.html#xI">xI</a> y'<br/>
91
| <a href="Coq.NArith.BinPos.html#xH">xH</a>, <a href="Coq.NArith.BinPos.html#xH">xH</a> => <a href="Coq.NArith.BinPos.html#xO">xO</a> <a href="Coq.NArith.BinPos.html#xH">xH</a><br/>
94
with <a name="Pplus_carry"></a>Pplus_carry (x y:<a href="Coq.NArith.BinPos.html#positive">positive</a>) {struct x} : <a href="Coq.NArith.BinPos.html#positive">positive</a> :=<br/>
95
match x, y with<br/>
96
| <a href="Coq.NArith.BinPos.html#xI">xI</a> x', <a href="Coq.NArith.BinPos.html#xI">xI</a> y' => <a href="Coq.NArith.BinPos.html#xI">xI</a> (Pplus_carry x' y')<br/>
97
| <a href="Coq.NArith.BinPos.html#xI">xI</a> x', <a href="Coq.NArith.BinPos.html#xO">xO</a> y' => <a href="Coq.NArith.BinPos.html#xO">xO</a> (Pplus_carry x' y')<br/>
98
| <a href="Coq.NArith.BinPos.html#xI">xI</a> x', <a href="Coq.NArith.BinPos.html#xH">xH</a> => <a href="Coq.NArith.BinPos.html#xI">xI</a> (<a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> x')<br/>
99
| <a href="Coq.NArith.BinPos.html#xO">xO</a> x', <a href="Coq.NArith.BinPos.html#xI">xI</a> y' => <a href="Coq.NArith.BinPos.html#xO">xO</a> (Pplus_carry x' y')<br/>
100
| <a href="Coq.NArith.BinPos.html#xO">xO</a> x', <a href="Coq.NArith.BinPos.html#xO">xO</a> y' => <a href="Coq.NArith.BinPos.html#xI">xI</a> (Pplus x' y')<br/>
101
| <a href="Coq.NArith.BinPos.html#xO">xO</a> x', <a href="Coq.NArith.BinPos.html#xH">xH</a> => <a href="Coq.NArith.BinPos.html#xO">xO</a> (<a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> x')<br/>
102
| <a href="Coq.NArith.BinPos.html#xH">xH</a>, <a href="Coq.NArith.BinPos.html#xI">xI</a> y' => <a href="Coq.NArith.BinPos.html#xI">xI</a> (<a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> y')<br/>
103
| <a href="Coq.NArith.BinPos.html#xH">xH</a>, <a href="Coq.NArith.BinPos.html#xO">xO</a> y' => <a href="Coq.NArith.BinPos.html#xO">xO</a> (<a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> y')<br/>
104
| <a href="Coq.NArith.BinPos.html#xH">xH</a>, <a href="Coq.NArith.BinPos.html#xH">xH</a> => <a href="Coq.NArith.BinPos.html#xI">xI</a> <a href="Coq.NArith.BinPos.html#xH">xH</a><br/>
105
end.<br/>
108
<code class="keyword">Infix</code> "+" := <a href="Coq.NArith.BinPos.html#Pplus">Pplus</a> : positive_scope.<br/>
111
Open <code class="keyword">Local</code> Scope positive_scope.<br/>
116
<table width="100%"><tr class="doc"><td>
117
From binary positive numbers to Peano natural numbers
122
<code class="keyword">Fixpoint</code> <a name="Pmult_nat"></a>Pmult_nat (x:<a href="Coq.NArith.BinPos.html#positive">positive</a>) (pow2:<a href="Coq.Init.Datatypes.html#nat">nat</a>) {struct x} : <a href="Coq.Init.Datatypes.html#nat">nat</a> :=<br/>
123
match x with<br/>
124
| <a href="Coq.NArith.BinPos.html#xI">xI</a> x' => (pow2 + Pmult_nat x' (pow2 + pow2))%nat<br/>
125
| <a href="Coq.NArith.BinPos.html#xO">xO</a> x' => Pmult_nat x' (pow2 + pow2)%nat<br/>
126
| <a href="Coq.NArith.BinPos.html#xH">xH</a> => pow2<br/>
127
end.<br/>
130
<code class="keyword">Definition</code> <a name="nat_of_P"></a>nat_of_P (x:<a href="Coq.NArith.BinPos.html#positive">positive</a>) := <a href="Coq.NArith.BinPos.html#Pmult_nat">Pmult_nat</a> x 1.<br/>
135
<table width="100%"><tr class="doc"><td>
136
From Peano natural numbers to binary positive numbers
141
<code class="keyword">Fixpoint</code> <a name="P_of_succ_nat"></a>P_of_succ_nat (n:<a href="Coq.Init.Datatypes.html#nat">nat</a>) : <a href="Coq.NArith.BinPos.html#positive">positive</a> :=<br/>
142
match n with<br/>
143
| <a href="Coq.Init.Datatypes.html#O">O</a> => <a href="Coq.NArith.BinPos.html#xH">xH</a><br/>
144
| <a href="Coq.Init.Datatypes.html#S">S</a> x' => <a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> (P_of_succ_nat x')<br/>
145
end.<br/>
150
<table width="100%"><tr class="doc"><td>
151
Operation x -> 2*x-1
156
<code class="keyword">Fixpoint</code> <a name="Pdouble_minus_one"></a>Pdouble_minus_one (x:<a href="Coq.NArith.BinPos.html#positive">positive</a>) : <a href="Coq.NArith.BinPos.html#positive">positive</a> :=<br/>
157
match x with<br/>
158
| <a href="Coq.NArith.BinPos.html#xI">xI</a> x' => <a href="Coq.NArith.BinPos.html#xI">xI</a> (<a href="Coq.NArith.BinPos.html#xO">xO</a> x')<br/>
159
| <a href="Coq.NArith.BinPos.html#xO">xO</a> x' => <a href="Coq.NArith.BinPos.html#xI">xI</a> (Pdouble_minus_one x')<br/>
160
| <a href="Coq.NArith.BinPos.html#xH">xH</a> => <a href="Coq.NArith.BinPos.html#xH">xH</a><br/>
161
end.<br/>
166
<table width="100%"><tr class="doc"><td>
172
<code class="keyword">Definition</code> <a name="Ppred"></a>Ppred (x:<a href="Coq.NArith.BinPos.html#positive">positive</a>) :=<br/>
173
match x with<br/>
174
| <a href="Coq.NArith.BinPos.html#xI">xI</a> x' => <a href="Coq.NArith.BinPos.html#xO">xO</a> x'<br/>
175
| <a href="Coq.NArith.BinPos.html#xO">xO</a> x' => <a href="Coq.NArith.BinPos.html#Pdouble_minus_one">Pdouble_minus_one</a> x'<br/>
176
| <a href="Coq.NArith.BinPos.html#xH">xH</a> => <a href="Coq.NArith.BinPos.html#xH">xH</a><br/>
177
end.<br/>
182
<table width="100%"><tr class="doc"><td>
183
An auxiliary type for subtraction
188
<code class="keyword">Inductive</code> <a name="positive_mask"></a>positive_mask : Set :=<br/>
189
| <a name="IsNul"></a>IsNul : positive_mask<br/>
190
| <a name="IsPos"></a>IsPos : <a href="Coq.NArith.BinPos.html#positive">positive</a> -> positive_mask<br/>
191
| <a name="IsNeg"></a>IsNeg : positive_mask.<br/>
196
<table width="100%"><tr class="doc"><td>
197
Operation x -> 2*x+1
202
<code class="keyword">Definition</code> <a name="Pdouble_plus_one_mask"></a>Pdouble_plus_one_mask (x:<a href="Coq.NArith.BinPos.html#positive_mask">positive_mask</a>) :=<br/>
203
match x with<br/>
204
| <a href="Coq.NArith.BinPos.html#IsNul">IsNul</a> => <a href="Coq.NArith.BinPos.html#IsPos">IsPos</a> <a href="Coq.NArith.BinPos.html#xH">xH</a><br/>
205
| <a href="Coq.NArith.BinPos.html#IsNeg">IsNeg</a> => <a href="Coq.NArith.BinPos.html#IsNeg">IsNeg</a><br/>
206
| <a href="Coq.NArith.BinPos.html#IsPos">IsPos</a> p => <a href="Coq.NArith.BinPos.html#IsPos">IsPos</a> (<a href="Coq.NArith.BinPos.html#xI">xI</a> p)<br/>
207
end.<br/>
212
<table width="100%"><tr class="doc"><td>
213
Operation x -> 2*x
218
<code class="keyword">Definition</code> <a name="Pdouble_mask"></a>Pdouble_mask (x:<a href="Coq.NArith.BinPos.html#positive_mask">positive_mask</a>) :=<br/>
219
match x with<br/>
220
| <a href="Coq.NArith.BinPos.html#IsNul">IsNul</a> => <a href="Coq.NArith.BinPos.html#IsNul">IsNul</a><br/>
221
| <a href="Coq.NArith.BinPos.html#IsNeg">IsNeg</a> => <a href="Coq.NArith.BinPos.html#IsNeg">IsNeg</a><br/>
222
| <a href="Coq.NArith.BinPos.html#IsPos">IsPos</a> p => <a href="Coq.NArith.BinPos.html#IsPos">IsPos</a> (<a href="Coq.NArith.BinPos.html#xO">xO</a> p)<br/>
223
end.<br/>
228
<table width="100%"><tr class="doc"><td>
229
Operation x -> 2*x-2
234
<code class="keyword">Definition</code> <a name="Pdouble_minus_two"></a>Pdouble_minus_two (x:<a href="Coq.NArith.BinPos.html#positive">positive</a>) :=<br/>
235
match x with<br/>
236
| <a href="Coq.NArith.BinPos.html#xI">xI</a> x' => <a href="Coq.NArith.BinPos.html#IsPos">IsPos</a> (<a href="Coq.NArith.BinPos.html#xO">xO</a> (<a href="Coq.NArith.BinPos.html#xO">xO</a> x'))<br/>
237
| <a href="Coq.NArith.BinPos.html#xO">xO</a> x' => <a href="Coq.NArith.BinPos.html#IsPos">IsPos</a> (<a href="Coq.NArith.BinPos.html#xO">xO</a> (<a href="Coq.NArith.BinPos.html#Pdouble_minus_one">Pdouble_minus_one</a> x'))<br/>
238
| <a href="Coq.NArith.BinPos.html#xH">xH</a> => <a href="Coq.NArith.BinPos.html#IsNul">IsNul</a><br/>
239
end.<br/>
244
<table width="100%"><tr class="doc"><td>
245
Subtraction of binary positive numbers into a positive numbers mask
250
<code class="keyword">Fixpoint</code> <a name="Pminus_mask"></a>Pminus_mask (x y:<a href="Coq.NArith.BinPos.html#positive">positive</a>) {struct y} : <a href="Coq.NArith.BinPos.html#positive_mask">positive_mask</a> :=<br/>
251
match x, y with<br/>
252
| <a href="Coq.NArith.BinPos.html#xI">xI</a> x', <a href="Coq.NArith.BinPos.html#xI">xI</a> y' => <a href="Coq.NArith.BinPos.html#Pdouble_mask">Pdouble_mask</a> (Pminus_mask x' y')<br/>
253
| <a href="Coq.NArith.BinPos.html#xI">xI</a> x', <a href="Coq.NArith.BinPos.html#xO">xO</a> y' => <a href="Coq.NArith.BinPos.html#Pdouble_plus_one_mask">Pdouble_plus_one_mask</a> (Pminus_mask x' y')<br/>
254
| <a href="Coq.NArith.BinPos.html#xI">xI</a> x', <a href="Coq.NArith.BinPos.html#xH">xH</a> => <a href="Coq.NArith.BinPos.html#IsPos">IsPos</a> (<a href="Coq.NArith.BinPos.html#xO">xO</a> x')<br/>
255
| <a href="Coq.NArith.BinPos.html#xO">xO</a> x', <a href="Coq.NArith.BinPos.html#xI">xI</a> y' => <a href="Coq.NArith.BinPos.html#Pdouble_plus_one_mask">Pdouble_plus_one_mask</a> (Pminus_mask_carry x' y')<br/>
256
| <a href="Coq.NArith.BinPos.html#xO">xO</a> x', <a href="Coq.NArith.BinPos.html#xO">xO</a> y' => <a href="Coq.NArith.BinPos.html#Pdouble_mask">Pdouble_mask</a> (Pminus_mask x' y')<br/>
257
| <a href="Coq.NArith.BinPos.html#xO">xO</a> x', <a href="Coq.NArith.BinPos.html#xH">xH</a> => <a href="Coq.NArith.BinPos.html#IsPos">IsPos</a> (<a href="Coq.NArith.BinPos.html#Pdouble_minus_one">Pdouble_minus_one</a> x')<br/>
258
| <a href="Coq.NArith.BinPos.html#xH">xH</a>, <a href="Coq.NArith.BinPos.html#xH">xH</a> => <a href="Coq.NArith.BinPos.html#IsNul">IsNul</a><br/>
259
| <a href="Coq.NArith.BinPos.html#xH">xH</a>, _ => <a href="Coq.NArith.BinPos.html#IsNeg">IsNeg</a><br/>
262
with <a name="Pminus_mask_carry"></a>Pminus_mask_carry (x y:<a href="Coq.NArith.BinPos.html#positive">positive</a>) {struct y} : <a href="Coq.NArith.BinPos.html#positive_mask">positive_mask</a> :=<br/>
263
match x, y with<br/>
264
| <a href="Coq.NArith.BinPos.html#xI">xI</a> x', <a href="Coq.NArith.BinPos.html#xI">xI</a> y' => <a href="Coq.NArith.BinPos.html#Pdouble_plus_one_mask">Pdouble_plus_one_mask</a> (Pminus_mask_carry x' y')<br/>
265
| <a href="Coq.NArith.BinPos.html#xI">xI</a> x', <a href="Coq.NArith.BinPos.html#xO">xO</a> y' => <a href="Coq.NArith.BinPos.html#Pdouble_mask">Pdouble_mask</a> (Pminus_mask x' y')<br/>
266
| <a href="Coq.NArith.BinPos.html#xI">xI</a> x', <a href="Coq.NArith.BinPos.html#xH">xH</a> => <a href="Coq.NArith.BinPos.html#IsPos">IsPos</a> (<a href="Coq.NArith.BinPos.html#Pdouble_minus_one">Pdouble_minus_one</a> x')<br/>
267
| <a href="Coq.NArith.BinPos.html#xO">xO</a> x', <a href="Coq.NArith.BinPos.html#xI">xI</a> y' => <a href="Coq.NArith.BinPos.html#Pdouble_mask">Pdouble_mask</a> (Pminus_mask_carry x' y')<br/>
268
| <a href="Coq.NArith.BinPos.html#xO">xO</a> x', <a href="Coq.NArith.BinPos.html#xO">xO</a> y' => <a href="Coq.NArith.BinPos.html#Pdouble_plus_one_mask">Pdouble_plus_one_mask</a> (Pminus_mask_carry x' y')<br/>
269
| <a href="Coq.NArith.BinPos.html#xO">xO</a> x', <a href="Coq.NArith.BinPos.html#xH">xH</a> => <a href="Coq.NArith.BinPos.html#Pdouble_minus_two">Pdouble_minus_two</a> x'<br/>
270
| <a href="Coq.NArith.BinPos.html#xH">xH</a>, _ => <a href="Coq.NArith.BinPos.html#IsNeg">IsNeg</a><br/>
271
end.<br/>
276
<table width="100%"><tr class="doc"><td>
277
Subtraction of binary positive numbers x and y, returns 1 if x<=y
282
<code class="keyword">Definition</code> <a name="Pminus"></a>Pminus (x y:<a href="Coq.NArith.BinPos.html#positive">positive</a>) :=<br/>
283
match <a href="Coq.NArith.BinPos.html#Pminus_mask">Pminus_mask</a> x y with<br/>
284
| <a href="Coq.NArith.BinPos.html#IsPos">IsPos</a> z => z<br/>
285
| _ => <a href="Coq.NArith.BinPos.html#xH">xH</a><br/>
286
end.<br/>
289
<code class="keyword">Infix</code> "-" := <a href="Coq.NArith.BinPos.html#Pminus">Pminus</a> : positive_scope.<br/>
294
<table width="100%"><tr class="doc"><td>
295
Multiplication on binary positive numbers
300
<code class="keyword">Fixpoint</code> <a name="Pmult"></a>Pmult (x y:<a href="Coq.NArith.BinPos.html#positive">positive</a>) {struct x} : <a href="Coq.NArith.BinPos.html#positive">positive</a> :=<br/>
301
match x with<br/>
302
| <a href="Coq.NArith.BinPos.html#xI">xI</a> x' => y + <a href="Coq.NArith.BinPos.html#xO">xO</a> (Pmult x' y)<br/>
303
| <a href="Coq.NArith.BinPos.html#xO">xO</a> x' => <a href="Coq.NArith.BinPos.html#xO">xO</a> (Pmult x' y)<br/>
304
| <a href="Coq.NArith.BinPos.html#xH">xH</a> => y<br/>
305
end.<br/>
308
<code class="keyword">Infix</code> "*" := <a href="Coq.NArith.BinPos.html#Pmult">Pmult</a> : positive_scope.<br/>
313
<table width="100%"><tr class="doc"><td>
314
Division by 2 rounded below but for 1
319
<code class="keyword">Definition</code> <a name="Pdiv2"></a>Pdiv2 (z:<a href="Coq.NArith.BinPos.html#positive">positive</a>) :=<br/>
320
match z with<br/>
321
| <a href="Coq.NArith.BinPos.html#xH">xH</a> => <a href="Coq.NArith.BinPos.html#xH">xH</a><br/>
322
| <a href="Coq.NArith.BinPos.html#xO">xO</a> p => p<br/>
323
| <a href="Coq.NArith.BinPos.html#xI">xI</a> p => p<br/>
324
end.<br/>
327
<code class="keyword">Infix</code> "/" := <a href="Coq.NArith.BinPos.html#Pdiv2">Pdiv2</a> : positive_scope.<br/>
332
<table width="100%"><tr class="doc"><td>
333
Comparison on binary positive numbers
338
<code class="keyword">Fixpoint</code> <a name="Pcompare"></a>Pcompare (x y:<a href="Coq.NArith.BinPos.html#positive">positive</a>) (r:<a href="Coq.Init.Datatypes.html#comparison">comparison</a>) {struct y} : <a href="Coq.Init.Datatypes.html#comparison">comparison</a> :=<br/>
339
match x, y with<br/>
340
| <a href="Coq.NArith.BinPos.html#xI">xI</a> x', <a href="Coq.NArith.BinPos.html#xI">xI</a> y' => Pcompare x' y' r<br/>
341
| <a href="Coq.NArith.BinPos.html#xI">xI</a> x', <a href="Coq.NArith.BinPos.html#xO">xO</a> y' => Pcompare x' y' <a href="Coq.Init.Datatypes.html#Gt">Gt</a><br/>
342
| <a href="Coq.NArith.BinPos.html#xI">xI</a> x', <a href="Coq.NArith.BinPos.html#xH">xH</a> => <a href="Coq.Init.Datatypes.html#Gt">Gt</a><br/>
343
| <a href="Coq.NArith.BinPos.html#xO">xO</a> x', <a href="Coq.NArith.BinPos.html#xI">xI</a> y' => Pcompare x' y' <a href="Coq.Init.Datatypes.html#Lt">Lt</a><br/>
344
| <a href="Coq.NArith.BinPos.html#xO">xO</a> x', <a href="Coq.NArith.BinPos.html#xO">xO</a> y' => Pcompare x' y' r<br/>
345
| <a href="Coq.NArith.BinPos.html#xO">xO</a> x', <a href="Coq.NArith.BinPos.html#xH">xH</a> => <a href="Coq.Init.Datatypes.html#Gt">Gt</a><br/>
346
| <a href="Coq.NArith.BinPos.html#xH">xH</a>, <a href="Coq.NArith.BinPos.html#xI">xI</a> y' => <a href="Coq.Init.Datatypes.html#Lt">Lt</a><br/>
347
| <a href="Coq.NArith.BinPos.html#xH">xH</a>, <a href="Coq.NArith.BinPos.html#xO">xO</a> y' => <a href="Coq.Init.Datatypes.html#Lt">Lt</a><br/>
348
| <a href="Coq.NArith.BinPos.html#xH">xH</a>, <a href="Coq.NArith.BinPos.html#xH">xH</a> => r<br/>
349
end.<br/>
352
<code class="keyword">Infix</code> "?=" := <a href="Coq.NArith.BinPos.html#Pcompare">Pcompare</a> (at level 70, no associativity) : positive_scope.<br/>
357
<table width="100%"><tr class="doc"><td>
358
Miscellaneous properties of binary positive numbers
363
<code class="keyword">Lemma</code> <a name="ZL11"></a>ZL11 : forall p:<a href="Coq.NArith.BinPos.html#positive">positive</a>, p = <a href="Coq.NArith.BinPos.html#xH">xH</a> \/ p <> <a href="Coq.NArith.BinPos.html#xH">xH</a>.<br/>
364
<code class="keyword">Proof</code>.<br/>
365
intros x; case x; intros; (left; reflexivity) || (right; discriminate).<br/>
366
<code class="keyword">Qed</code>.<br/>
371
<table width="100%"><tr class="doc"><td>
372
Properties of successor on binary positive numbers
379
<table width="100%"><tr class="doc"><td>
380
Specification of <code>xI</code> in term of <code>Psucc</code> and <code>xO</code>
385
<code class="keyword">Lemma</code> <a name="xI_succ_xO"></a>xI_succ_xO : forall p:<a href="Coq.NArith.BinPos.html#positive">positive</a>, <a href="Coq.NArith.BinPos.html#xI">xI</a> p = <a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> (<a href="Coq.NArith.BinPos.html#xO">xO</a> p).<br/>
386
<code class="keyword">Proof</code>.<br/>
388
<code class="keyword">Qed</code>.<br/>
391
<code class="keyword">Lemma</code> <a name="Psucc_discr"></a>Psucc_discr : forall p:<a href="Coq.NArith.BinPos.html#positive">positive</a>, p <> <a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> p.<br/>
392
<code class="keyword">Proof</code>.<br/>
393
intro x; destruct x as [p| p| ]; discriminate.<br/>
394
<code class="keyword">Qed</code>.<br/>
399
<table width="100%"><tr class="doc"><td>
405
<code class="keyword">Lemma</code> <a name="Psucc_o_double_minus_one_eq_xO"></a>Psucc_o_double_minus_one_eq_xO :<br/>
406
forall p:<a href="Coq.NArith.BinPos.html#positive">positive</a>, <a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> (<a href="Coq.NArith.BinPos.html#Pdouble_minus_one">Pdouble_minus_one</a> p) = <a href="Coq.NArith.BinPos.html#xO">xO</a> p.<br/>
407
<code class="keyword">Proof</code>.<br/>
408
intro x; induction x as [x IHx| x| ]; simpl in |- *; try rewrite IHx;<br/>
409
reflexivity.<br/>
410
<code class="keyword">Qed</code>.<br/>
413
<code class="keyword">Lemma</code> <a name="Pdouble_minus_one_o_succ_eq_xI"></a>Pdouble_minus_one_o_succ_eq_xI :<br/>
414
forall p:<a href="Coq.NArith.BinPos.html#positive">positive</a>, <a href="Coq.NArith.BinPos.html#Pdouble_minus_one">Pdouble_minus_one</a> (<a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> p) = <a href="Coq.NArith.BinPos.html#xI">xI</a> p.<br/>
415
<code class="keyword">Proof</code>.<br/>
416
intro x; induction x as [x IHx| x| ]; simpl in |- *; try rewrite IHx;<br/>
417
reflexivity.<br/>
418
<code class="keyword">Qed</code>.<br/>
421
<code class="keyword">Lemma</code> <a name="xO_succ_permute"></a>xO_succ_permute :<br/>
422
forall p:<a href="Coq.NArith.BinPos.html#positive">positive</a>, <a href="Coq.NArith.BinPos.html#xO">xO</a> (<a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> p) = <a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> (<a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> (<a href="Coq.NArith.BinPos.html#xO">xO</a> p)).<br/>
423
<code class="keyword">Proof</code>.<br/>
424
intro y; induction y as [y Hrecy| y Hrecy| ]; simpl in |- *; auto.<br/>
425
<code class="keyword">Qed</code>.<br/>
428
<code class="keyword">Lemma</code> <a name="double_moins_un_xO_discr"></a>double_moins_un_xO_discr :<br/>
429
forall p:<a href="Coq.NArith.BinPos.html#positive">positive</a>, <a href="Coq.NArith.BinPos.html#Pdouble_minus_one">Pdouble_minus_one</a> p <> <a href="Coq.NArith.BinPos.html#xO">xO</a> p.<br/>
430
<code class="keyword">Proof</code>.<br/>
431
intro x; destruct x as [p| p| ]; discriminate.<br/>
432
<code class="keyword">Qed</code>.<br/>
437
<table width="100%"><tr class="doc"><td>
438
Successor and predecessor
443
<code class="keyword">Lemma</code> <a name="Psucc_not_one"></a>Psucc_not_one : forall p:<a href="Coq.NArith.BinPos.html#positive">positive</a>, <a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> p <> <a href="Coq.NArith.BinPos.html#xH">xH</a>.<br/>
444
<code class="keyword">Proof</code>.<br/>
445
intro x; destruct x as [x| x| ]; discriminate.<br/>
446
<code class="keyword">Qed</code>.<br/>
449
<code class="keyword">Lemma</code> <a name="Ppred_succ"></a>Ppred_succ : forall p:<a href="Coq.NArith.BinPos.html#positive">positive</a>, <a href="Coq.NArith.BinPos.html#Ppred">Ppred</a> (<a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> p) = p.<br/>
450
<code class="keyword">Proof</code>.<br/>
451
intro x; destruct x as [p| p| ]; [ idtac | idtac | simpl in |- *; auto ];<br/>
452
(induction p as [p IHp| | ]; [ idtac | reflexivity | reflexivity ]);<br/>
453
simpl in |- *; simpl in IHp; try rewrite <- IHp; reflexivity.<br/>
454
<code class="keyword">Qed</code>.<br/>
457
<code class="keyword">Lemma</code> <a name="Psucc_pred"></a>Psucc_pred : forall p:<a href="Coq.NArith.BinPos.html#positive">positive</a>, p = <a href="Coq.NArith.BinPos.html#xH">xH</a> \/ <a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> (<a href="Coq.NArith.BinPos.html#Ppred">Ppred</a> p) = p.<br/>
458
<code class="keyword">Proof</code>.<br/>
459
intro x; induction x as [x Hrecx| x Hrecx| ];<br/>
460
[ simpl in |- *; auto
461
| simpl in |- *; intros; right; apply Psucc_o_double_minus_one_eq_xO
463
<code class="keyword">Qed</code>.<br/>
468
<table width="100%"><tr class="doc"><td>
469
Injectivity of successor
474
<code class="keyword">Lemma</code> <a name="Psucc_inj"></a>Psucc_inj : forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>, <a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> p = <a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> q -> p = q.<br/>
475
<code class="keyword">Proof</code>.<br/>
476
intro x; induction x; intro y; destruct y as [y| y| ]; simpl in |- *; intro H;<br/>
477
discriminate H || (try (injection H; clear H; intro H)).<br/>
478
rewrite (IHx y H); reflexivity.<br/>
479
absurd (<a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> x = <a href="Coq.NArith.BinPos.html#xH">xH</a>); [ apply Psucc_not_one | assumption ].<br/>
480
apply <a href="Coq.Init.Logic.html#f_equal">f_equal</a> with (1 := H); assumption.<br/>
481
absurd (<a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> y = <a href="Coq.NArith.BinPos.html#xH">xH</a>);<br/>
482
[ apply Psucc_not_one | symmetry in |- *; assumption ].<br/>
484
<code class="keyword">Qed</code>.<br/>
489
<table width="100%"><tr class="doc"><td>
490
Properties of addition on binary positive numbers
497
<table width="100%"><tr class="doc"><td>
498
Specification of <code>Psucc</code> in term of <code>Pplus</code>
503
<code class="keyword">Lemma</code> <a name="Pplus_one_succ_r"></a>Pplus_one_succ_r : forall p:<a href="Coq.NArith.BinPos.html#positive">positive</a>, <a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> p = p + <a href="Coq.NArith.BinPos.html#xH">xH</a>.<br/>
504
<code class="keyword">Proof</code>.<br/>
505
intro q; destruct q as [p| p| ]; reflexivity.<br/>
506
<code class="keyword">Qed</code>.<br/>
509
<code class="keyword">Lemma</code> <a name="Pplus_one_succ_l"></a>Pplus_one_succ_l : forall p:<a href="Coq.NArith.BinPos.html#positive">positive</a>, <a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> p = <a href="Coq.NArith.BinPos.html#xH">xH</a> + p.<br/>
510
<code class="keyword">Proof</code>.<br/>
511
intro q; destruct q as [p| p| ]; reflexivity.<br/>
512
<code class="keyword">Qed</code>.<br/>
517
<table width="100%"><tr class="doc"><td>
518
Specification of <code>Pplus_carry</code>
523
<code class="keyword">Theorem</code> <a name="Pplus_carry_spec"></a>Pplus_carry_spec :<br/>
524
forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>, <a href="Coq.NArith.BinPos.html#Pplus_carry">Pplus_carry</a> p q = <a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> (p + q).<br/>
525
<code class="keyword">Proof</code>.<br/>
526
intro x; induction x as [p IHp| p IHp| ]; intro y;<br/>
527
[ destruct y as [p0| p0| ]<br/>
528
| destruct y as [p0| p0| ]<br/>
529
| destruct y as [p| p| ] ]; simpl in |- *; auto; rewrite IHp; <br/>
531
<code class="keyword">Qed</code>.<br/>
536
<table width="100%"><tr class="doc"><td>
542
<code class="keyword">Theorem</code> <a name="Pplus_comm"></a>Pplus_comm : forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>, p + q = q + p.<br/>
543
<code class="keyword">Proof</code>.<br/>
544
intro x; induction x as [p IHp| p IHp| ]; intro y;<br/>
545
[ destruct y as [p0| p0| ]<br/>
546
| destruct y as [p0| p0| ]<br/>
547
| destruct y as [p| p| ] ]; simpl in |- *; auto;<br/>
548
try do 2 rewrite <a href="Coq.NArith.BinPos.html#Pplus_carry_spec">Pplus_carry_spec</a>; rewrite IHp; auto.<br/>
549
<code class="keyword">Qed</code>. <br/>
554
<table width="100%"><tr class="doc"><td>
555
Permutation of <code>Pplus</code> and <code>Psucc</code>
560
<code class="keyword">Theorem</code> <a name="Pplus_succ_permute_r"></a>Pplus_succ_permute_r :<br/>
561
forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>, p + <a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> q = <a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> (p + q).<br/>
562
<code class="keyword">Proof</code>.<br/>
563
intro x; induction x as [p IHp| p IHp| ]; intro y;<br/>
564
[ destruct y as [p0| p0| ]<br/>
565
| destruct y as [p0| p0| ]<br/>
566
| destruct y as [p| p| ] ]; simpl in |- *; auto;<br/>
567
[ rewrite Pplus_carry_spec; rewrite IHp; auto
568
| rewrite Pplus_carry_spec; auto
569
| destruct p; simpl in |- *; auto
571
| destruct p; simpl in |- *; auto ].<br/>
572
<code class="keyword">Qed</code>.<br/>
575
<code class="keyword">Theorem</code> <a name="Pplus_succ_permute_l"></a>Pplus_succ_permute_l :<br/>
576
forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>, <a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> p + q = <a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> (p + q).<br/>
577
<code class="keyword">Proof</code>.<br/>
578
intros x y; rewrite <a href="Coq.NArith.BinPos.html#Pplus_comm">Pplus_comm</a>; rewrite <a href="Coq.NArith.BinPos.html#Pplus_comm">Pplus_comm</a> with (p:= x);<br/>
579
apply <a href="Coq.NArith.BinPos.html#Pplus_succ_permute_r">Pplus_succ_permute_r</a>.<br/>
580
<code class="keyword">Qed</code>.<br/>
583
<code class="keyword">Theorem</code> <a name="Pplus_carry_pred_eq_plus"></a>Pplus_carry_pred_eq_plus :<br/>
584
forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>, q <> <a href="Coq.NArith.BinPos.html#xH">xH</a> -> <a href="Coq.NArith.BinPos.html#Pplus_carry">Pplus_carry</a> p (<a href="Coq.NArith.BinPos.html#Ppred">Ppred</a> q) = p + q.<br/>
585
<code class="keyword">Proof</code>.<br/>
586
intros q z H; elim (<a href="Coq.NArith.BinPos.html#Psucc_pred">Psucc_pred</a> z);<br/>
587
[ intro; absurd (z = xH); auto
588
| intros E; pattern z at 2 in |- *; rewrite <- E;
589
rewrite Pplus_succ_permute_r; rewrite Pplus_carry_spec;
591
<code class="keyword">Qed</code>. <br/>
596
<table width="100%"><tr class="doc"><td>
597
No neutral for addition on strictly positive numbers
602
<code class="keyword">Lemma</code> <a name="Pplus_no_neutral"></a>Pplus_no_neutral : forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>, q + p <> p.<br/>
603
<code class="keyword">Proof</code>.<br/>
604
intro x; induction x; intro y; destruct y as [y| y| ]; simpl in |- *; intro H;<br/>
605
discriminate H || injection H; clear H; intro H; apply (IHx y H).<br/>
606
<code class="keyword">Qed</code>.<br/>
609
<code class="keyword">Lemma</code> <a name="Pplus_carry_no_neutral"></a>Pplus_carry_no_neutral :<br/>
610
forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>, <a href="Coq.NArith.BinPos.html#Pplus_carry">Pplus_carry</a> q p <> <a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> p.<br/>
611
<code class="keyword">Proof</code>.<br/>
612
intros x y H; absurd (y + x = x);<br/>
613
[ apply Pplus_no_neutral
614
| apply Psucc_inj; rewrite <- Pplus_carry_spec; assumption ].<br/>
615
<code class="keyword">Qed</code>.<br/>
620
<table width="100%"><tr class="doc"><td>
626
<code class="keyword">Lemma</code> <a name="Pplus_carry_plus"></a>Pplus_carry_plus :<br/>
627
forall p q r s:<a href="Coq.NArith.BinPos.html#positive">positive</a>, <a href="Coq.NArith.BinPos.html#Pplus_carry">Pplus_carry</a> p r = <a href="Coq.NArith.BinPos.html#Pplus_carry">Pplus_carry</a> q s -> p + r = q + s.<br/>
628
<code class="keyword">Proof</code>.<br/>
629
intros x y z t H; apply <a href="Coq.NArith.BinPos.html#Psucc_inj">Psucc_inj</a>; do 2 rewrite <- <a href="Coq.NArith.BinPos.html#Pplus_carry_spec">Pplus_carry_spec</a>;<br/>
630
assumption.<br/>
631
<code class="keyword">Qed</code>.<br/>
634
<code class="keyword">Lemma</code> <a name="Pplus_reg_r"></a>Pplus_reg_r : forall p q r:<a href="Coq.NArith.BinPos.html#positive">positive</a>, p + r = q + r -> p = q.<br/>
635
<code class="keyword">Proof</code>.<br/>
636
intros x y z; generalize x y; clear x y.<br/>
637
induction z as [z| z| ].<br/>
638
destruct x as [x| x| ]; intro y; destruct y as [y| y| ]; simpl in |- *;<br/>
639
intro H; discriminate H || (try (injection H; clear H; intro H)).<br/>
640
rewrite IHz with (1 := <a href="Coq.NArith.BinPos.html#Pplus_carry_plus">Pplus_carry_plus</a> _ _ _ _ H); reflexivity.<br/>
641
absurd (<a href="Coq.NArith.BinPos.html#Pplus_carry">Pplus_carry</a> x z = <a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> z);<br/>
642
[ apply Pplus_carry_no_neutral | assumption ].<br/>
643
rewrite IHz with (1 := H); reflexivity.<br/>
644
symmetry in H; absurd (<a href="Coq.NArith.BinPos.html#Pplus_carry">Pplus_carry</a> y z = <a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> z);<br/>
645
[ apply Pplus_carry_no_neutral | assumption ].<br/>
646
reflexivity.<br/>
647
destruct x as [x| x| ]; intro y; destruct y as [y| y| ]; simpl in |- *;<br/>
648
intro H; discriminate H || (try (injection H; clear H; intro H)).<br/>
649
rewrite IHz with (1 := H); reflexivity.<br/>
650
absurd (x + z = z); [ apply Pplus_no_neutral | assumption ].<br/>
651
rewrite IHz with (1 := H); reflexivity.<br/>
652
symmetry in H; absurd (y + z = z);<br/>
653
[ apply Pplus_no_neutral | assumption ].<br/>
654
reflexivity.<br/>
655
intros H x y; apply <a href="Coq.NArith.BinPos.html#Psucc_inj">Psucc_inj</a>; do 2 rewrite <a href="Coq.NArith.BinPos.html#Pplus_one_succ_r">Pplus_one_succ_r</a>; assumption.<br/>
656
<code class="keyword">Qed</code>.<br/>
659
<code class="keyword">Lemma</code> <a name="Pplus_reg_l"></a>Pplus_reg_l : forall p q r:<a href="Coq.NArith.BinPos.html#positive">positive</a>, p + q = p + r -> q = r.<br/>
660
<code class="keyword">Proof</code>.<br/>
661
intros x y z H; apply <a href="Coq.NArith.BinPos.html#Pplus_reg_r">Pplus_reg_r</a> with (r:= x);<br/>
662
rewrite <a href="Coq.NArith.BinPos.html#Pplus_comm">Pplus_comm</a> with (p:= z); rewrite <a href="Coq.NArith.BinPos.html#Pplus_comm">Pplus_comm</a> with (p:= y);<br/>
663
assumption.<br/>
664
<code class="keyword">Qed</code>.<br/>
667
<code class="keyword">Lemma</code> <a name="Pplus_carry_reg_r"></a>Pplus_carry_reg_r :<br/>
668
forall p q r:<a href="Coq.NArith.BinPos.html#positive">positive</a>, <a href="Coq.NArith.BinPos.html#Pplus_carry">Pplus_carry</a> p r = <a href="Coq.NArith.BinPos.html#Pplus_carry">Pplus_carry</a> q r -> p = q.<br/>
669
<code class="keyword">Proof</code>.<br/>
670
intros x y z H; apply <a href="Coq.NArith.BinPos.html#Pplus_reg_r">Pplus_reg_r</a> with (r:= z); apply <a href="Coq.NArith.BinPos.html#Pplus_carry_plus">Pplus_carry_plus</a>;<br/>
671
assumption.<br/>
672
<code class="keyword">Qed</code>.<br/>
675
<code class="keyword">Lemma</code> <a name="Pplus_carry_reg_l"></a>Pplus_carry_reg_l :<br/>
676
forall p q r:<a href="Coq.NArith.BinPos.html#positive">positive</a>, <a href="Coq.NArith.BinPos.html#Pplus_carry">Pplus_carry</a> p q = <a href="Coq.NArith.BinPos.html#Pplus_carry">Pplus_carry</a> p r -> q = r.<br/>
677
<code class="keyword">Proof</code>.<br/>
678
intros x y z H; apply <a href="Coq.NArith.BinPos.html#Pplus_reg_r">Pplus_reg_r</a> with (r:= x);<br/>
679
rewrite <a href="Coq.NArith.BinPos.html#Pplus_comm">Pplus_comm</a> with (p:= z); rewrite <a href="Coq.NArith.BinPos.html#Pplus_comm">Pplus_comm</a> with (p:= y);<br/>
680
apply <a href="Coq.NArith.BinPos.html#Pplus_carry_plus">Pplus_carry_plus</a>; assumption.<br/>
681
<code class="keyword">Qed</code>.<br/>
686
<table width="100%"><tr class="doc"><td>
687
Addition on positive is associative
692
<code class="keyword">Theorem</code> <a name="Pplus_assoc"></a>Pplus_assoc : forall p q r:<a href="Coq.NArith.BinPos.html#positive">positive</a>, p + (q + r) = p + q + r.<br/>
693
<code class="keyword">Proof</code>.<br/>
694
intros x y; generalize x; clear x.<br/>
695
induction y as [y| y| ]; intro x.<br/>
696
destruct x as [x| x| ]; intro z; destruct z as [z| z| ]; simpl in |- *;<br/>
697
repeat rewrite <a href="Coq.NArith.BinPos.html#Pplus_carry_spec">Pplus_carry_spec</a>; repeat rewrite <a href="Coq.NArith.BinPos.html#Pplus_succ_permute_r">Pplus_succ_permute_r</a>;<br/>
698
repeat rewrite <a href="Coq.NArith.BinPos.html#Pplus_succ_permute_l">Pplus_succ_permute_l</a>;<br/>
699
reflexivity || (repeat apply <a href="Coq.Init.Logic.html#f_equal">f_equal</a> with (A:= <a href="Coq.NArith.BinPos.html#positive">positive</a>)); <br/>
700
apply IHy.<br/>
701
destruct x as [x| x| ]; intro z; destruct z as [z| z| ]; simpl in |- *;<br/>
702
repeat rewrite <a href="Coq.NArith.BinPos.html#Pplus_carry_spec">Pplus_carry_spec</a>; repeat rewrite <a href="Coq.NArith.BinPos.html#Pplus_succ_permute_r">Pplus_succ_permute_r</a>;<br/>
703
repeat rewrite <a href="Coq.NArith.BinPos.html#Pplus_succ_permute_l">Pplus_succ_permute_l</a>;<br/>
704
reflexivity || (repeat apply <a href="Coq.Init.Logic.html#f_equal">f_equal</a> with (A:= <a href="Coq.NArith.BinPos.html#positive">positive</a>)); <br/>
705
apply IHy.<br/>
706
intro z; rewrite <a href="Coq.NArith.BinPos.html#Pplus_comm">Pplus_comm</a> with (p:= <a href="Coq.NArith.BinPos.html#xH">xH</a>);<br/>
707
do 2 rewrite <- <a href="Coq.NArith.BinPos.html#Pplus_one_succ_r">Pplus_one_succ_r</a>; rewrite <a href="Coq.NArith.BinPos.html#Pplus_succ_permute_l">Pplus_succ_permute_l</a>;<br/>
708
rewrite <a href="Coq.NArith.BinPos.html#Pplus_succ_permute_r">Pplus_succ_permute_r</a>; reflexivity.<br/>
709
<code class="keyword">Qed</code>.<br/>
714
<table width="100%"><tr class="doc"><td>
715
Commutation of addition with the double of a positive number
720
<code class="keyword">Lemma</code> <a name="Pplus_xI_double_minus_one"></a>Pplus_xI_double_minus_one :<br/>
721
forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>, <a href="Coq.NArith.BinPos.html#xO">xO</a> (p + q) = <a href="Coq.NArith.BinPos.html#xI">xI</a> p + <a href="Coq.NArith.BinPos.html#Pdouble_minus_one">Pdouble_minus_one</a> q.<br/>
722
<code class="keyword">Proof</code>.<br/>
723
intros; change (<a href="Coq.NArith.BinPos.html#xI">xI</a> p) with (<a href="Coq.NArith.BinPos.html#xO">xO</a> p + <a href="Coq.NArith.BinPos.html#xH">xH</a>) in |- *.<br/>
724
rewrite <- <a href="Coq.NArith.BinPos.html#Pplus_assoc">Pplus_assoc</a>; rewrite <- <a href="Coq.NArith.BinPos.html#Pplus_one_succ_l">Pplus_one_succ_l</a>;<br/>
725
rewrite <a href="Coq.NArith.BinPos.html#Psucc_o_double_minus_one_eq_xO">Psucc_o_double_minus_one_eq_xO</a>.<br/>
727
<code class="keyword">Qed</code>.<br/>
730
<code class="keyword">Lemma</code> <a name="Pplus_xO_double_minus_one"></a>Pplus_xO_double_minus_one :<br/>
731
forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>, <a href="Coq.NArith.BinPos.html#Pdouble_minus_one">Pdouble_minus_one</a> (p + q) = <a href="Coq.NArith.BinPos.html#xO">xO</a> p + <a href="Coq.NArith.BinPos.html#Pdouble_minus_one">Pdouble_minus_one</a> q.<br/>
732
<code class="keyword">Proof</code>.<br/>
733
induction p as [p IHp| p IHp| ]; destruct q as [q| q| ]; simpl in |- *;<br/>
734
try rewrite <a href="Coq.NArith.BinPos.html#Pplus_carry_spec">Pplus_carry_spec</a>; try rewrite <a href="Coq.NArith.BinPos.html#Pdouble_minus_one_o_succ_eq_xI">Pdouble_minus_one_o_succ_eq_xI</a>;<br/>
735
try rewrite IHp; try rewrite <a href="Coq.NArith.BinPos.html#Pplus_xI_double_minus_one">Pplus_xI_double_minus_one</a>; <br/>
736
try reflexivity.<br/>
737
rewrite <- <a href="Coq.NArith.BinPos.html#Psucc_o_double_minus_one_eq_xO">Psucc_o_double_minus_one_eq_xO</a>; rewrite <a href="Coq.NArith.BinPos.html#Pplus_one_succ_l">Pplus_one_succ_l</a>;<br/>
738
reflexivity. <br/>
739
<code class="keyword">Qed</code>.<br/>
744
<table width="100%"><tr class="doc"><td>
750
<code class="keyword">Lemma</code> <a name="Pplus_diag"></a>Pplus_diag : forall p:<a href="Coq.NArith.BinPos.html#positive">positive</a>, p + p = <a href="Coq.NArith.BinPos.html#xO">xO</a> p.<br/>
751
<code class="keyword">Proof</code>.<br/>
752
intro x; induction x; simpl in |- *; try rewrite <a href="Coq.NArith.BinPos.html#Pplus_carry_spec">Pplus_carry_spec</a>;<br/>
753
try rewrite IHx; reflexivity.<br/>
754
<code class="keyword">Qed</code>.<br/>
759
<table width="100%"><tr class="doc"><td>
760
Peano induction on binary positive positive numbers
765
<code class="keyword">Fixpoint</code> <a name="plus_iter"></a>plus_iter (x y:<a href="Coq.NArith.BinPos.html#positive">positive</a>) {struct x} : <a href="Coq.NArith.BinPos.html#positive">positive</a> :=<br/>
766
match x with<br/>
767
| <a href="Coq.NArith.BinPos.html#xH">xH</a> => <a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> y<br/>
768
| <a href="Coq.NArith.BinPos.html#xO">xO</a> x => plus_iter x (plus_iter x y)<br/>
769
| <a href="Coq.NArith.BinPos.html#xI">xI</a> x => plus_iter x (plus_iter x (<a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> y))<br/>
770
end.<br/>
773
<code class="keyword">Lemma</code> <a name="plus_iter_eq_plus"></a>plus_iter_eq_plus : forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>, <a href="Coq.NArith.BinPos.html#plus_iter">plus_iter</a> p q = p + q.<br/>
774
<code class="keyword">Proof</code>.<br/>
775
intro x; induction x as [p IHp| p IHp| ]; intro y;<br/>
776
[ destruct y as [p0| p0| ]<br/>
777
| destruct y as [p0| p0| ]<br/>
778
| destruct y as [p| p| ] ]; simpl in |- *; reflexivity || (do 2 rewrite IHp);<br/>
779
rewrite <a href="Coq.NArith.BinPos.html#Pplus_assoc">Pplus_assoc</a>; rewrite <a href="Coq.NArith.BinPos.html#Pplus_diag">Pplus_diag</a>; try reflexivity.<br/>
780
rewrite <a href="Coq.NArith.BinPos.html#Pplus_carry_spec">Pplus_carry_spec</a>; rewrite <- <a href="Coq.NArith.BinPos.html#Pplus_succ_permute_r">Pplus_succ_permute_r</a>; reflexivity.<br/>
781
rewrite <a href="Coq.NArith.BinPos.html#Pplus_one_succ_r">Pplus_one_succ_r</a>; reflexivity.<br/>
782
<code class="keyword">Qed</code>.<br/>
785
<code class="keyword">Lemma</code> <a name="plus_iter_xO"></a>plus_iter_xO : forall p:<a href="Coq.NArith.BinPos.html#positive">positive</a>, <a href="Coq.NArith.BinPos.html#plus_iter">plus_iter</a> p p = <a href="Coq.NArith.BinPos.html#xO">xO</a> p.<br/>
786
<code class="keyword">Proof</code>.<br/>
787
intro; rewrite <- <a href="Coq.NArith.BinPos.html#Pplus_diag">Pplus_diag</a>; apply <a href="Coq.NArith.BinPos.html#plus_iter_eq_plus">plus_iter_eq_plus</a>.<br/>
788
<code class="keyword">Qed</code>.<br/>
791
<code class="keyword">Lemma</code> <a name="plus_iter_xI"></a>plus_iter_xI : forall p:<a href="Coq.NArith.BinPos.html#positive">positive</a>, <a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> (<a href="Coq.NArith.BinPos.html#plus_iter">plus_iter</a> p p) = <a href="Coq.NArith.BinPos.html#xI">xI</a> p.<br/>
792
<code class="keyword">Proof</code>.<br/>
793
intro; rewrite <a href="Coq.NArith.BinPos.html#xI_succ_xO">xI_succ_xO</a>; rewrite <- <a href="Coq.NArith.BinPos.html#Pplus_diag">Pplus_diag</a>;<br/>
794
apply (<a href="Coq.Init.Logic.html#f_equal">f_equal</a> (A:=<a href="Coq.NArith.BinPos.html#positive">positive</a>)); apply <a href="Coq.NArith.BinPos.html#plus_iter_eq_plus">plus_iter_eq_plus</a>.<br/>
795
<code class="keyword">Qed</code>.<br/>
798
<code class="keyword">Lemma</code> <a name="iterate_add"></a>iterate_add :<br/>
799
forall P:<a href="Coq.NArith.BinPos.html#positive">positive</a> -> Type,<br/>
800
(forall n:<a href="Coq.NArith.BinPos.html#positive">positive</a>, P n -> P (<a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> n)) -><br/>
801
forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>, P q -> P (<a href="Coq.NArith.BinPos.html#plus_iter">plus_iter</a> p q).<br/>
802
<code class="keyword">Proof</code>.<br/>
803
intros P H; induction p; simpl in |- *; intros.<br/>
804
apply IHp; apply IHp; apply H; assumption.<br/>
805
apply IHp; apply IHp; assumption.<br/>
806
apply H; assumption.<br/>
807
<code class="keyword">Defined</code>.<br/>
812
<table width="100%"><tr class="doc"><td>
818
<code class="keyword">Theorem</code> <a name="Pind"></a>Pind :<br/>
819
forall P:<a href="Coq.NArith.BinPos.html#positive">positive</a> -> Prop,<br/>
820
P <a href="Coq.NArith.BinPos.html#xH">xH</a> -> (forall n:<a href="Coq.NArith.BinPos.html#positive">positive</a>, P n -> P (<a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> n)) -> forall p:<a href="Coq.NArith.BinPos.html#positive">positive</a>, P p.<br/>
821
<code class="keyword">Proof</code>.<br/>
822
intros P H1 Hsucc n; induction n.<br/>
823
rewrite <- <a href="Coq.NArith.BinPos.html#plus_iter_xI">plus_iter_xI</a>; apply Hsucc; apply <a href="Coq.NArith.BinPos.html#iterate_add">iterate_add</a>; assumption.<br/>
824
rewrite <- <a href="Coq.NArith.BinPos.html#plus_iter_xO">plus_iter_xO</a>; apply <a href="Coq.NArith.BinPos.html#iterate_add">iterate_add</a>; assumption.<br/>
826
<code class="keyword">Qed</code>.<br/>
831
<table width="100%"><tr class="doc"><td>
837
<code class="keyword">Definition</code> <a name="Prec"></a>Prec (A:Set) (a:A) (f:<a href="Coq.NArith.BinPos.html#positive">positive</a> -> A -> A) : <br/>
838
<a href="Coq.NArith.BinPos.html#positive">positive</a> -> A :=<br/>
839
(fix Prec (p:<a href="Coq.NArith.BinPos.html#positive">positive</a>) : A :=<br/>
840
match p with<br/>
841
| <a href="Coq.NArith.BinPos.html#xH">xH</a> => a<br/>
842
| <a href="Coq.NArith.BinPos.html#xO">xO</a> p => <a href="Coq.NArith.BinPos.html#iterate_add">iterate_add</a> (fun _ => A) f p p (Prec p)<br/>
843
| <a href="Coq.NArith.BinPos.html#xI">xI</a> p => f (<a href="Coq.NArith.BinPos.html#plus_iter">plus_iter</a> p p) (<a href="Coq.NArith.BinPos.html#iterate_add">iterate_add</a> (fun _ => A) f p p (Prec p))<br/>
844
end).<br/>
849
<table width="100%"><tr class="doc"><td>
855
<code class="keyword">Theorem</code> <a name="Pcase"></a>Pcase :<br/>
856
forall P:<a href="Coq.NArith.BinPos.html#positive">positive</a> -> Prop,<br/>
857
P <a href="Coq.NArith.BinPos.html#xH">xH</a> -> (forall n:<a href="Coq.NArith.BinPos.html#positive">positive</a>, P (<a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> n)) -> forall p:<a href="Coq.NArith.BinPos.html#positive">positive</a>, P p.<br/>
858
<code class="keyword">Proof</code>.<br/>
859
intros; apply <a href="Coq.NArith.BinPos.html#Pind">Pind</a>; auto.<br/>
860
<code class="keyword">Qed</code>.<br/>
865
<table width="100%"><tr class="doc"><td>
866
Properties of multiplication on binary positive numbers
873
<table width="100%"><tr class="doc"><td>
874
One is right neutral for multiplication
879
<code class="keyword">Lemma</code> <a name="Pmult_1_r"></a>Pmult_1_r : forall p:<a href="Coq.NArith.BinPos.html#positive">positive</a>, p * <a href="Coq.NArith.BinPos.html#xH">xH</a> = p.<br/>
880
<code class="keyword">Proof</code>.<br/>
881
intro x; induction x; simpl in |- *.<br/>
882
rewrite IHx; reflexivity.<br/>
883
rewrite IHx; reflexivity.<br/>
884
reflexivity.<br/>
885
<code class="keyword">Qed</code>.<br/>
890
<table width="100%"><tr class="doc"><td>
891
Right reduction properties for multiplication
896
<code class="keyword">Lemma</code> <a name="Pmult_xO_permute_r"></a>Pmult_xO_permute_r : forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>, p * <a href="Coq.NArith.BinPos.html#xO">xO</a> q = <a href="Coq.NArith.BinPos.html#xO">xO</a> (p * q).<br/>
897
<code class="keyword">Proof</code>.<br/>
898
intros x y; induction x; simpl in |- *.<br/>
899
rewrite IHx; reflexivity.<br/>
900
rewrite IHx; reflexivity.<br/>
901
reflexivity.<br/>
902
<code class="keyword">Qed</code>.<br/>
905
<code class="keyword">Lemma</code> <a name="Pmult_xI_permute_r"></a>Pmult_xI_permute_r : forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>, p * <a href="Coq.NArith.BinPos.html#xI">xI</a> q = p + <a href="Coq.NArith.BinPos.html#xO">xO</a> (p * q).<br/>
906
<code class="keyword">Proof</code>.<br/>
907
intros x y; induction x; simpl in |- *.<br/>
908
rewrite IHx; do 2 rewrite <a href="Coq.NArith.BinPos.html#Pplus_assoc">Pplus_assoc</a>; rewrite <a href="Coq.NArith.BinPos.html#Pplus_comm">Pplus_comm</a> with (p:= y);<br/>
909
reflexivity.<br/>
910
rewrite IHx; reflexivity.<br/>
911
reflexivity.<br/>
912
<code class="keyword">Qed</code>.<br/>
917
<table width="100%"><tr class="doc"><td>
918
Commutativity of multiplication
923
<code class="keyword">Theorem</code> <a name="Pmult_comm"></a>Pmult_comm : forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>, p * q = q * p.<br/>
924
<code class="keyword">Proof</code>.<br/>
925
intros x y; induction y; simpl in |- *.<br/>
926
rewrite <- IHy; apply <a href="Coq.NArith.BinPos.html#Pmult_xI_permute_r">Pmult_xI_permute_r</a>.<br/>
927
rewrite <- IHy; apply <a href="Coq.NArith.BinPos.html#Pmult_xO_permute_r">Pmult_xO_permute_r</a>.<br/>
928
apply <a href="Coq.NArith.BinPos.html#Pmult_1_r">Pmult_1_r</a>.<br/>
929
<code class="keyword">Qed</code>.<br/>
934
<table width="100%"><tr class="doc"><td>
935
Distributivity of multiplication over addition
940
<code class="keyword">Theorem</code> <a name="Pmult_plus_distr_l"></a>Pmult_plus_distr_l :<br/>
941
forall p q r:<a href="Coq.NArith.BinPos.html#positive">positive</a>, p * (q + r) = p * q + p * r.<br/>
942
<code class="keyword">Proof</code>.<br/>
943
intros x y z; induction x; simpl in |- *.<br/>
944
rewrite IHx; rewrite <- <a href="Coq.NArith.BinPos.html#Pplus_assoc">Pplus_assoc</a> with (q:= <a href="Coq.NArith.BinPos.html#xO">xO</a> (x * y));<br/>
945
rewrite <a href="Coq.NArith.BinPos.html#Pplus_assoc">Pplus_assoc</a> with (p:= <a href="Coq.NArith.BinPos.html#xO">xO</a> (x * y));<br/>
946
rewrite <a href="Coq.NArith.BinPos.html#Pplus_comm">Pplus_comm</a> with (p:= <a href="Coq.NArith.BinPos.html#xO">xO</a> (x * y));<br/>
947
rewrite <- <a href="Coq.NArith.BinPos.html#Pplus_assoc">Pplus_assoc</a> with (q:= <a href="Coq.NArith.BinPos.html#xO">xO</a> (x * y));<br/>
948
rewrite <a href="Coq.NArith.BinPos.html#Pplus_assoc">Pplus_assoc</a> with (q:= z); reflexivity.<br/>
949
rewrite IHx; reflexivity.<br/>
950
reflexivity.<br/>
951
<code class="keyword">Qed</code>.<br/>
954
<code class="keyword">Theorem</code> <a name="Pmult_plus_distr_r"></a>Pmult_plus_distr_r :<br/>
955
forall p q r:<a href="Coq.NArith.BinPos.html#positive">positive</a>, (p + q) * r = p * r + q * r.<br/>
956
<code class="keyword">Proof</code>.<br/>
957
intros x y z; do 3 rewrite <a href="Coq.NArith.BinPos.html#Pmult_comm">Pmult_comm</a> with (q:= z); apply <a href="Coq.NArith.BinPos.html#Pmult_plus_distr_l">Pmult_plus_distr_l</a>.<br/>
958
<code class="keyword">Qed</code>.<br/>
963
<table width="100%"><tr class="doc"><td>
964
Associativity of multiplication
969
<code class="keyword">Theorem</code> <a name="Pmult_assoc"></a>Pmult_assoc : forall p q r:<a href="Coq.NArith.BinPos.html#positive">positive</a>, p * (q * r) = p * q * r.<br/>
970
<code class="keyword">Proof</code>.<br/>
971
intro x; induction x as [x| x| ]; simpl in |- *; intros y z.<br/>
972
rewrite IHx; rewrite <a href="Coq.NArith.BinPos.html#Pmult_plus_distr_r">Pmult_plus_distr_r</a>; reflexivity.<br/>
973
rewrite IHx; reflexivity.<br/>
974
reflexivity.<br/>
975
<code class="keyword">Qed</code>.<br/>
980
<table width="100%"><tr class="doc"><td>
981
Parity properties of multiplication
986
<code class="keyword">Lemma</code> <a name="Pmult_xI_mult_xO_discr"></a>Pmult_xI_mult_xO_discr : forall p q r:<a href="Coq.NArith.BinPos.html#positive">positive</a>, <a href="Coq.NArith.BinPos.html#xI">xI</a> p * r <> <a href="Coq.NArith.BinPos.html#xO">xO</a> q * r.<br/>
987
<code class="keyword">Proof</code>.<br/>
988
intros x y z; induction z as [| z IHz| ]; try discriminate.<br/>
989
intro H; apply IHz; clear IHz.<br/>
990
do 2 rewrite <a href="Coq.NArith.BinPos.html#Pmult_xO_permute_r">Pmult_xO_permute_r</a> in H.<br/>
991
injection H; clear H; intro H; exact H.<br/>
992
<code class="keyword">Qed</code>.<br/>
995
<code class="keyword">Lemma</code> <a name="Pmult_xO_discr"></a>Pmult_xO_discr : forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>, <a href="Coq.NArith.BinPos.html#xO">xO</a> p * q <> q.<br/>
996
<code class="keyword">Proof</code>.<br/>
997
intros x y; induction y; try discriminate.<br/>
998
rewrite <a href="Coq.NArith.BinPos.html#Pmult_xO_permute_r">Pmult_xO_permute_r</a>; injection; assumption.<br/>
999
<code class="keyword">Qed</code>.<br/>
1004
<table width="100%"><tr class="doc"><td>
1005
Simplification properties of multiplication
1010
<code class="keyword">Theorem</code> <a name="Pmult_reg_r"></a>Pmult_reg_r : forall p q r:<a href="Coq.NArith.BinPos.html#positive">positive</a>, p * r = q * r -> p = q.<br/>
1011
<code class="keyword">Proof</code>.<br/>
1012
intro x; induction x as [p IHp| p IHp| ]; intro y; destruct y as [q| q| ];<br/>
1013
intros z H; reflexivity || apply (<a href="Coq.Init.Logic.html#f_equal">f_equal</a> (A:=<a href="Coq.NArith.BinPos.html#positive">positive</a>)) || apply <a href="Coq.Init.Logic.html#False_ind">False_ind</a>.<br/>
1014
simpl in H; apply IHp with (<a href="Coq.NArith.BinPos.html#xO">xO</a> z); simpl in |- *;<br/>
1015
do 2 rewrite <a href="Coq.NArith.BinPos.html#Pmult_xO_permute_r">Pmult_xO_permute_r</a>; apply <a href="Coq.NArith.BinPos.html#Pplus_reg_l">Pplus_reg_l</a> with (1 := H).<br/>
1016
apply <a href="Coq.NArith.BinPos.html#Pmult_xI_mult_xO_discr">Pmult_xI_mult_xO_discr</a> with (1 := H).<br/>
1017
simpl in H; rewrite <a href="Coq.NArith.BinPos.html#Pplus_comm">Pplus_comm</a> in H; apply <a href="Coq.NArith.BinPos.html#Pplus_no_neutral">Pplus_no_neutral</a> with (1 := H).<br/>
1018
symmetry in H; apply <a href="Coq.NArith.BinPos.html#Pmult_xI_mult_xO_discr">Pmult_xI_mult_xO_discr</a> with (1 := H).<br/>
1019
apply IHp with (<a href="Coq.NArith.BinPos.html#xO">xO</a> z); simpl in |- *; do 2 rewrite <a href="Coq.NArith.BinPos.html#Pmult_xO_permute_r">Pmult_xO_permute_r</a>;<br/>
1020
assumption.<br/>
1021
apply <a href="Coq.NArith.BinPos.html#Pmult_xO_discr">Pmult_xO_discr</a> with (1 := H).<br/>
1022
simpl in H; symmetry in H; rewrite <a href="Coq.NArith.BinPos.html#Pplus_comm">Pplus_comm</a> in H;<br/>
1023
apply <a href="Coq.NArith.BinPos.html#Pplus_no_neutral">Pplus_no_neutral</a> with (1 := H).<br/>
1024
symmetry in H; apply <a href="Coq.NArith.BinPos.html#Pmult_xO_discr">Pmult_xO_discr</a> with (1 := H).<br/>
1025
<code class="keyword">Qed</code>.<br/>
1028
<code class="keyword">Theorem</code> <a name="Pmult_reg_l"></a>Pmult_reg_l : forall p q r:<a href="Coq.NArith.BinPos.html#positive">positive</a>, r * p = r * q -> p = q.<br/>
1029
<code class="keyword">Proof</code>.<br/>
1030
intros x y z H; apply <a href="Coq.NArith.BinPos.html#Pmult_reg_r">Pmult_reg_r</a> with (r:= z).<br/>
1031
rewrite <a href="Coq.NArith.BinPos.html#Pmult_comm">Pmult_comm</a> with (p:= x); rewrite <a href="Coq.NArith.BinPos.html#Pmult_comm">Pmult_comm</a> with (p:= y);<br/>
1032
assumption.<br/>
1033
<code class="keyword">Qed</code>.<br/>
1038
<table width="100%"><tr class="doc"><td>
1039
Inversion of multiplication
1044
<code class="keyword">Lemma</code> <a name="Pmult_1_inversion_l"></a>Pmult_1_inversion_l : forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>, p * q = <a href="Coq.NArith.BinPos.html#xH">xH</a> -> p = <a href="Coq.NArith.BinPos.html#xH">xH</a>.<br/>
1045
<code class="keyword">Proof</code>.<br/>
1046
intros x y; destruct x as [p| p| ]; simpl in |- *.<br/>
1047
destruct y as [p0| p0| ]; intro; discriminate.<br/>
1048
intro; discriminate.<br/>
1049
reflexivity.<br/>
1050
<code class="keyword">Qed</code>.<br/>
1055
<table width="100%"><tr class="doc"><td>
1056
Properties of comparison on binary positive numbers
1061
<code class="keyword">Theorem</code> <a name="Pcompare_not_Eq"></a>Pcompare_not_Eq :<br/>
1062
forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>, (p ?= q) <a href="Coq.Init.Datatypes.html#Gt">Gt</a> <> <a href="Coq.Init.Datatypes.html#Eq">Eq</a> /\ (p ?= q) <a href="Coq.Init.Datatypes.html#Lt">Lt</a> <> <a href="Coq.Init.Datatypes.html#Eq">Eq</a>.<br/>
1063
<code class="keyword">Proof</code>.<br/>
1064
intro x; induction x as [p IHp| p IHp| ]; intro y; destruct y as [q| q| ];<br/>
1065
split; simpl in |- *; auto; discriminate || (elim (IHp q); auto).<br/>
1066
<code class="keyword">Qed</code>.<br/>
1069
<code class="keyword">Theorem</code> <a name="Pcompare_Eq_eq"></a>Pcompare_Eq_eq : forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>, (p ?= q) <a href="Coq.Init.Datatypes.html#Eq">Eq</a> = <a href="Coq.Init.Datatypes.html#Eq">Eq</a> -> p = q.<br/>
1070
<code class="keyword">Proof</code>.<br/>
1071
intro x; induction x as [p IHp| p IHp| ]; intro y; destruct y as [q| q| ];<br/>
1072
simpl in |- *; auto; intro H;<br/>
1073
[ rewrite (IHp q); trivial<br/>
1074
| absurd ((p ?= q) <a href="Coq.Init.Datatypes.html#Gt">Gt</a> = <a href="Coq.Init.Datatypes.html#Eq">Eq</a>);<br/>
1075
[ elim (Pcompare_not_Eq p q); auto | assumption ]<br/>
1076
| discriminate H<br/>
1077
| absurd ((p ?= q) <a href="Coq.Init.Datatypes.html#Lt">Lt</a> = <a href="Coq.Init.Datatypes.html#Eq">Eq</a>);<br/>
1078
[ elim (Pcompare_not_Eq p q); auto | assumption ]<br/>
1079
| rewrite (IHp q); auto<br/>
1080
| discriminate H<br/>
1081
| discriminate H<br/>
1082
| discriminate H ].<br/>
1083
<code class="keyword">Qed</code>.<br/>
1086
<code class="keyword">Lemma</code> <a name="Pcompare_Gt_Lt"></a>Pcompare_Gt_Lt :<br/>
1087
forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>, (p ?= q) <a href="Coq.Init.Datatypes.html#Gt">Gt</a> = <a href="Coq.Init.Datatypes.html#Lt">Lt</a> -> (p ?= q) <a href="Coq.Init.Datatypes.html#Eq">Eq</a> = <a href="Coq.Init.Datatypes.html#Lt">Lt</a>.<br/>
1088
<code class="keyword">Proof</code>.<br/>
1089
intro x; induction x as [x Hrecx| x Hrecx| ]; intro y;<br/>
1090
[ induction y as [y Hrecy| y Hrecy| ]<br/>
1091
| induction y as [y Hrecy| y Hrecy| ]<br/>
1092
| induction y as [y Hrecy| y Hrecy| ] ]; simpl in |- *; <br/>
1093
auto; discriminate || intros H; discriminate H.<br/>
1094
<code class="keyword">Qed</code>.<br/>
1097
<code class="keyword">Lemma</code> <a name="Pcompare_Lt_Gt"></a>Pcompare_Lt_Gt :<br/>
1098
forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>, (p ?= q) <a href="Coq.Init.Datatypes.html#Lt">Lt</a> = <a href="Coq.Init.Datatypes.html#Gt">Gt</a> -> (p ?= q) <a href="Coq.Init.Datatypes.html#Eq">Eq</a> = <a href="Coq.Init.Datatypes.html#Gt">Gt</a>.<br/>
1099
<code class="keyword">Proof</code>.<br/>
1100
intro x; induction x as [x Hrecx| x Hrecx| ]; intro y;<br/>
1101
[ induction y as [y Hrecy| y Hrecy| ]<br/>
1102
| induction y as [y Hrecy| y Hrecy| ]<br/>
1103
| induction y as [y Hrecy| y Hrecy| ] ]; simpl in |- *; <br/>
1104
auto; discriminate || intros H; discriminate H.<br/>
1105
<code class="keyword">Qed</code>.<br/>
1108
<code class="keyword">Lemma</code> <a name="Pcompare_Lt_Lt"></a>Pcompare_Lt_Lt :<br/>
1109
forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>, (p ?= q) <a href="Coq.Init.Datatypes.html#Lt">Lt</a> = <a href="Coq.Init.Datatypes.html#Lt">Lt</a> -> (p ?= q) <a href="Coq.Init.Datatypes.html#Eq">Eq</a> = <a href="Coq.Init.Datatypes.html#Lt">Lt</a> \/ p = q.<br/>
1110
<code class="keyword">Proof</code>.<br/>
1111
intro x; induction x as [p IHp| p IHp| ]; intro y; destruct y as [q| q| ];<br/>
1112
simpl in |- *; auto; try discriminate; intro H2; elim (IHp q H2); <br/>
1113
auto; intros E; rewrite E; auto.<br/>
1114
<code class="keyword">Qed</code>.<br/>
1117
<code class="keyword">Lemma</code> <a name="Pcompare_Gt_Gt"></a>Pcompare_Gt_Gt :<br/>
1118
forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>, (p ?= q) <a href="Coq.Init.Datatypes.html#Gt">Gt</a> = <a href="Coq.Init.Datatypes.html#Gt">Gt</a> -> (p ?= q) <a href="Coq.Init.Datatypes.html#Eq">Eq</a> = <a href="Coq.Init.Datatypes.html#Gt">Gt</a> \/ p = q.<br/>
1119
<code class="keyword">Proof</code>.<br/>
1120
intro x; induction x as [p IHp| p IHp| ]; intro y; destruct y as [q| q| ];<br/>
1121
simpl in |- *; auto; try discriminate; intro H2; elim (IHp q H2); <br/>
1122
auto; intros E; rewrite E; auto.<br/>
1123
<code class="keyword">Qed</code>.<br/>
1126
<code class="keyword">Lemma</code> <a name="Dcompare"></a>Dcompare : forall r:<a href="Coq.Init.Datatypes.html#comparison">comparison</a>, r = <a href="Coq.Init.Datatypes.html#Eq">Eq</a> \/ r = <a href="Coq.Init.Datatypes.html#Lt">Lt</a> \/ r = <a href="Coq.Init.Datatypes.html#Gt">Gt</a>.<br/>
1127
<code class="keyword">Proof</code>.<br/>
1128
simple induction r; auto. <br/>
1129
<code class="keyword">Qed</code>.<br/>
1132
<code class="keyword">Ltac</code> ElimPcompare c1 c2 :=<br/>
1133
elim (<a href="Coq.NArith.BinPos.html#Dcompare">Dcompare</a> ((c1 ?= c2) <a href="Coq.Init.Datatypes.html#Eq">Eq</a>));<br/>
1134
[ idtac | let x := fresh "H" in<br/>
1135
(intro x; case x; clear x) ].<br/>
1138
<code class="keyword">Theorem</code> <a name="Pcompare_refl"></a>Pcompare_refl : forall p:<a href="Coq.NArith.BinPos.html#positive">positive</a>, (p ?= p) <a href="Coq.Init.Datatypes.html#Eq">Eq</a> = <a href="Coq.Init.Datatypes.html#Eq">Eq</a>.<br/>
1139
intro x; induction x as [x Hrecx| x Hrecx| ]; auto.<br/>
1140
<code class="keyword">Qed</code>.<br/>
1143
<code class="keyword">Lemma</code> <a name="Pcompare_antisym"></a>Pcompare_antisym :<br/>
1144
forall (p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>) (r:<a href="Coq.Init.Datatypes.html#comparison">comparison</a>),<br/>
1145
<a href="Coq.Init.Datatypes.html#CompOpp">CompOpp</a> ((p ?= q) r) = (q ?= p) (<a href="Coq.Init.Datatypes.html#CompOpp">CompOpp</a> r).<br/>
1146
<code class="keyword">Proof</code>.<br/>
1147
intro x; induction x as [p IHp| p IHp| ]; intro y;<br/>
1148
[ destruct y as [p0| p0| ]<br/>
1149
| destruct y as [p0| p0| ]<br/>
1150
| destruct y as [p| p| ] ]; intro r;<br/>
1151
reflexivity ||<br/>
1152
(symmetry in |- *; assumption) || discriminate H || simpl in |- *;<br/>
1153
apply IHp || (try rewrite IHp); try reflexivity.<br/>
1154
<code class="keyword">Qed</code>.<br/>
1157
<code class="keyword">Lemma</code> <a name="ZC1"></a>ZC1 : forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>, (p ?= q) <a href="Coq.Init.Datatypes.html#Eq">Eq</a> = <a href="Coq.Init.Datatypes.html#Gt">Gt</a> -> (q ?= p) <a href="Coq.Init.Datatypes.html#Eq">Eq</a> = <a href="Coq.Init.Datatypes.html#Lt">Lt</a>.<br/>
1158
<code class="keyword">Proof</code>.<br/>
1159
intros; change <a href="Coq.Init.Datatypes.html#Eq">Eq</a> with (<a href="Coq.Init.Datatypes.html#CompOpp">CompOpp</a> <a href="Coq.Init.Datatypes.html#Eq">Eq</a>) in |- *.<br/>
1160
rewrite <- <a href="Coq.NArith.BinPos.html#Pcompare_antisym">Pcompare_antisym</a>; rewrite H; reflexivity.<br/>
1161
<code class="keyword">Qed</code>.<br/>
1164
<code class="keyword">Lemma</code> <a name="ZC2"></a>ZC2 : forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>, (p ?= q) <a href="Coq.Init.Datatypes.html#Eq">Eq</a> = <a href="Coq.Init.Datatypes.html#Lt">Lt</a> -> (q ?= p) <a href="Coq.Init.Datatypes.html#Eq">Eq</a> = <a href="Coq.Init.Datatypes.html#Gt">Gt</a>.<br/>
1165
<code class="keyword">Proof</code>.<br/>
1166
intros; change <a href="Coq.Init.Datatypes.html#Eq">Eq</a> with (<a href="Coq.Init.Datatypes.html#CompOpp">CompOpp</a> <a href="Coq.Init.Datatypes.html#Eq">Eq</a>) in |- *.<br/>
1167
rewrite <- <a href="Coq.NArith.BinPos.html#Pcompare_antisym">Pcompare_antisym</a>; rewrite H; reflexivity.<br/>
1168
<code class="keyword">Qed</code>.<br/>
1171
<code class="keyword">Lemma</code> <a name="ZC3"></a>ZC3 : forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>, (p ?= q) <a href="Coq.Init.Datatypes.html#Eq">Eq</a> = <a href="Coq.Init.Datatypes.html#Eq">Eq</a> -> (q ?= p) <a href="Coq.Init.Datatypes.html#Eq">Eq</a> = <a href="Coq.Init.Datatypes.html#Eq">Eq</a>.<br/>
1172
<code class="keyword">Proof</code>.<br/>
1173
intros; change <a href="Coq.Init.Datatypes.html#Eq">Eq</a> with (<a href="Coq.Init.Datatypes.html#CompOpp">CompOpp</a> <a href="Coq.Init.Datatypes.html#Eq">Eq</a>) in |- *.<br/>
1174
rewrite <- <a href="Coq.NArith.BinPos.html#Pcompare_antisym">Pcompare_antisym</a>; rewrite H; reflexivity.<br/>
1175
<code class="keyword">Qed</code>.<br/>
1178
<code class="keyword">Lemma</code> <a name="ZC4"></a>ZC4 : forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>, (p ?= q) <a href="Coq.Init.Datatypes.html#Eq">Eq</a> = <a href="Coq.Init.Datatypes.html#CompOpp">CompOpp</a> ((q ?= p) <a href="Coq.Init.Datatypes.html#Eq">Eq</a>).<br/>
1179
<code class="keyword">Proof</code>.<br/>
1180
intros; change <a href="Coq.Init.Datatypes.html#Eq">Eq</a> at 1 with (<a href="Coq.Init.Datatypes.html#CompOpp">CompOpp</a> <a href="Coq.Init.Datatypes.html#Eq">Eq</a>) in |- *.<br/>
1181
symmetry in |- *; apply <a href="Coq.NArith.BinPos.html#Pcompare_antisym">Pcompare_antisym</a>.<br/>
1182
<code class="keyword">Qed</code>.<br/>
1187
<table width="100%"><tr class="doc"><td>
1188
Properties of subtraction on binary positive numbers
1193
<code class="keyword">Lemma</code> <a name="double_eq_zero_inversion"></a>double_eq_zero_inversion :<br/>
1194
forall p:<a href="Coq.NArith.BinPos.html#positive_mask">positive_mask</a>, <a href="Coq.NArith.BinPos.html#Pdouble_mask">Pdouble_mask</a> p = <a href="Coq.NArith.BinPos.html#IsNul">IsNul</a> -> p = <a href="Coq.NArith.BinPos.html#IsNul">IsNul</a>.<br/>
1195
<code class="keyword">Proof</code>.<br/>
1196
destruct p; simpl in |- *; [ trivial | discriminate 1 | discriminate 1 ].<br/>
1197
<code class="keyword">Qed</code>.<br/>
1200
<code class="keyword">Lemma</code> <a name="double_plus_one_zero_discr"></a>double_plus_one_zero_discr :<br/>
1201
forall p:<a href="Coq.NArith.BinPos.html#positive_mask">positive_mask</a>, <a href="Coq.NArith.BinPos.html#Pdouble_plus_one_mask">Pdouble_plus_one_mask</a> p <> <a href="Coq.NArith.BinPos.html#IsNul">IsNul</a>.<br/>
1202
<code class="keyword">Proof</code>.<br/>
1203
simple induction p; intros; discriminate.<br/>
1204
<code class="keyword">Qed</code>.<br/>
1207
<code class="keyword">Lemma</code> <a name="double_plus_one_eq_one_inversion"></a>double_plus_one_eq_one_inversion :<br/>
1208
forall p:<a href="Coq.NArith.BinPos.html#positive_mask">positive_mask</a>, <a href="Coq.NArith.BinPos.html#Pdouble_plus_one_mask">Pdouble_plus_one_mask</a> p = <a href="Coq.NArith.BinPos.html#IsPos">IsPos</a> <a href="Coq.NArith.BinPos.html#xH">xH</a> -> p = <a href="Coq.NArith.BinPos.html#IsNul">IsNul</a>.<br/>
1209
<code class="keyword">Proof</code>.<br/>
1210
destruct p; simpl in |- *; [ trivial | discriminate 1 | discriminate 1 ].<br/>
1211
<code class="keyword">Qed</code>.<br/>
1214
<code class="keyword">Lemma</code> <a name="double_eq_one_discr"></a>double_eq_one_discr :<br/>
1215
forall p:<a href="Coq.NArith.BinPos.html#positive_mask">positive_mask</a>, <a href="Coq.NArith.BinPos.html#Pdouble_mask">Pdouble_mask</a> p <> <a href="Coq.NArith.BinPos.html#IsPos">IsPos</a> <a href="Coq.NArith.BinPos.html#xH">xH</a>.<br/>
1216
<code class="keyword">Proof</code>.<br/>
1217
simple induction p; intros; discriminate.<br/>
1218
<code class="keyword">Qed</code>.<br/>
1221
<code class="keyword">Theorem</code> <a name="Pminus_mask_diag"></a>Pminus_mask_diag : forall p:<a href="Coq.NArith.BinPos.html#positive">positive</a>, <a href="Coq.NArith.BinPos.html#Pminus_mask">Pminus_mask</a> p p = <a href="Coq.NArith.BinPos.html#IsNul">IsNul</a>.<br/>
1222
<code class="keyword">Proof</code>.<br/>
1223
intro x; induction x as [p IHp| p IHp| ];<br/>
1224
[ simpl in |- *; rewrite IHp; simpl in |- *; trivial
1225
| simpl in |- *; rewrite IHp; auto
1227
<code class="keyword">Qed</code>.<br/>
1230
<code class="keyword">Lemma</code> <a name="ZL10"></a>ZL10 :<br/>
1231
forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>,<br/>
1232
<a href="Coq.NArith.BinPos.html#Pminus_mask">Pminus_mask</a> p q = <a href="Coq.NArith.BinPos.html#IsPos">IsPos</a> <a href="Coq.NArith.BinPos.html#xH">xH</a> -> <a href="Coq.NArith.BinPos.html#Pminus_mask_carry">Pminus_mask_carry</a> p q = <a href="Coq.NArith.BinPos.html#IsNul">IsNul</a>.<br/>
1233
<code class="keyword">Proof</code>.<br/>
1234
intro x; induction x as [p| p| ]; intro y; destruct y as [q| q| ];<br/>
1235
simpl in |- *; intro H; try discriminate H;<br/>
1236
[ absurd (<a href="Coq.NArith.BinPos.html#Pdouble_mask">Pdouble_mask</a> (<a href="Coq.NArith.BinPos.html#Pminus_mask">Pminus_mask</a> p q) = <a href="Coq.NArith.BinPos.html#IsPos">IsPos</a> <a href="Coq.NArith.BinPos.html#xH">xH</a>);<br/>
1237
[ apply double_eq_one_discr | assumption ]<br/>
1238
| assert (Heq : <a href="Coq.NArith.BinPos.html#Pminus_mask">Pminus_mask</a> p q = <a href="Coq.NArith.BinPos.html#IsNul">IsNul</a>);<br/>
1239
[ apply double_plus_one_eq_one_inversion; assumption
1240
| rewrite Heq; reflexivity ]<br/>
1241
| assert (Heq : <a href="Coq.NArith.BinPos.html#Pminus_mask_carry">Pminus_mask_carry</a> p q = <a href="Coq.NArith.BinPos.html#IsNul">IsNul</a>);<br/>
1242
[ apply double_plus_one_eq_one_inversion; assumption
1243
| rewrite Heq; reflexivity ]<br/>
1244
| absurd (<a href="Coq.NArith.BinPos.html#Pdouble_mask">Pdouble_mask</a> (<a href="Coq.NArith.BinPos.html#Pminus_mask">Pminus_mask</a> p q) = <a href="Coq.NArith.BinPos.html#IsPos">IsPos</a> <a href="Coq.NArith.BinPos.html#xH">xH</a>);<br/>
1245
[ apply double_eq_one_discr | assumption ]<br/>
1246
| destruct p; simpl in |- *;<br/>
1247
[ discriminate H | discriminate H | reflexivity ] ].<br/>
1248
<code class="keyword">Qed</code>.<br/>
1253
<table width="100%"><tr class="doc"><td>
1254
Properties of subtraction valid only for x>y
1259
<code class="keyword">Lemma</code> <a name="Pminus_mask_Gt"></a>Pminus_mask_Gt :<br/>
1260
forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>,<br/>
1261
(p ?= q) <a href="Coq.Init.Datatypes.html#Eq">Eq</a> = <a href="Coq.Init.Datatypes.html#Gt">Gt</a> -><br/>
1262
exists h : <a href="Coq.NArith.BinPos.html#positive">positive</a>,<br/>
1263
<a href="Coq.NArith.BinPos.html#Pminus_mask">Pminus_mask</a> p q = <a href="Coq.NArith.BinPos.html#IsPos">IsPos</a> h /\<br/>
1264
q + h = p /\ (h = <a href="Coq.NArith.BinPos.html#xH">xH</a> \/ <a href="Coq.NArith.BinPos.html#Pminus_mask_carry">Pminus_mask_carry</a> p q = <a href="Coq.NArith.BinPos.html#IsPos">IsPos</a> (<a href="Coq.NArith.BinPos.html#Ppred">Ppred</a> h)).<br/>
1265
<code class="keyword">Proof</code>.<br/>
1266
intro x; induction x as [p| p| ]; intro y; destruct y as [q| q| ];<br/>
1267
simpl in |- *; intro H; try discriminate H.<br/>
1268
destruct (IHp q H) as [z [H4 [H6 H7]]]; exists (<a href="Coq.NArith.BinPos.html#xO">xO</a> z); split.<br/>
1269
rewrite H4; reflexivity.<br/>
1270
split.<br/>
1271
simpl in |- *; rewrite H6; reflexivity.<br/>
1272
right; clear H6; destruct (<a href="Coq.NArith.BinPos.html#ZL11">ZL11</a> z) as [H8| H8];<br/>
1273
[ rewrite H8; rewrite H8 in H4; rewrite <a href="Coq.NArith.BinPos.html#ZL10">ZL10</a>;<br/>
1274
[ reflexivity | assumption ]<br/>
1275
| clear H4; destruct H7 as [H9| H9];<br/>
1276
[ absurd (z = <a href="Coq.NArith.BinPos.html#xH">xH</a>); assumption<br/>
1277
| rewrite H9; clear H9; destruct z as [p0| p0| ];<br/>
1278
[ reflexivity | reflexivity | absurd (xH = xH); trivial ] ] ].<br/>
1279
case <a href="Coq.NArith.BinPos.html#Pcompare_Gt_Gt">Pcompare_Gt_Gt</a> with (1 := H);<br/>
1280
[ intros H3; elim (IHp q H3); intros z H4; exists (<a href="Coq.NArith.BinPos.html#xI">xI</a> z); elim H4;<br/>
1281
intros H5 H6; elim H6; intros H7 H8; split;<br/>
1282
[ simpl in |- *; rewrite H5; auto<br/>
1283
| split;<br/>
1284
[ simpl in |- *; rewrite H7; trivial
1286
change (Pdouble_mask (Pminus_mask p q) = IsPos (Ppred (xI z)))
1287
in |- *; rewrite H5; auto ] ]<br/>
1288
| intros H3; exists <a href="Coq.NArith.BinPos.html#xH">xH</a>; rewrite H3; split;<br/>
1289
[ simpl in |- *; rewrite Pminus_mask_diag; auto | split; auto ] ].<br/>
1290
exists (<a href="Coq.NArith.BinPos.html#xO">xO</a> p); auto.<br/>
1291
destruct (IHp q) as [z [H4 [H6 H7]]].<br/>
1292
apply <a href="Coq.NArith.BinPos.html#Pcompare_Lt_Gt">Pcompare_Lt_Gt</a>; assumption.<br/>
1293
destruct (<a href="Coq.NArith.BinPos.html#ZL11">ZL11</a> z) as [vZ| ];<br/>
1294
[ exists <a href="Coq.NArith.BinPos.html#xH">xH</a>; split;<br/>
1295
[ rewrite <a href="Coq.NArith.BinPos.html#ZL10">ZL10</a>; [ reflexivity | rewrite vZ in H4; assumption ]<br/>
1296
| split;<br/>
1297
[ simpl in |- *; rewrite Pplus_one_succ_r; rewrite <- vZ;
1300
| exists (<a href="Coq.NArith.BinPos.html#xI">xI</a> (<a href="Coq.NArith.BinPos.html#Ppred">Ppred</a> z)); destruct H7 as [| H8];<br/>
1301
[ absurd (z = <a href="Coq.NArith.BinPos.html#xH">xH</a>); assumption<br/>
1302
| split;<br/>
1303
[ rewrite H8; trivial<br/>
1304
| split;<br/>
1305
[ simpl in |- *; rewrite <a href="Coq.NArith.BinPos.html#Pplus_carry_pred_eq_plus">Pplus_carry_pred_eq_plus</a>;<br/>
1306
[ rewrite H6; trivial | assumption ]<br/>
1307
| right; rewrite H8; reflexivity ] ] ] ].<br/>
1308
destruct (IHp q H) as [z [H4 [H6 H7]]].<br/>
1309
exists (<a href="Coq.NArith.BinPos.html#xO">xO</a> z); split;<br/>
1310
[ rewrite H4; auto<br/>
1311
| split;<br/>
1312
[ simpl in |- *; rewrite H6; reflexivity<br/>
1313
| right;<br/>
1314
change<br/>
1315
(<a href="Coq.NArith.BinPos.html#Pdouble_plus_one_mask">Pdouble_plus_one_mask</a> (<a href="Coq.NArith.BinPos.html#Pminus_mask_carry">Pminus_mask_carry</a> p q) =<br/>
1316
<a href="Coq.NArith.BinPos.html#IsPos">IsPos</a> (<a href="Coq.NArith.BinPos.html#Pdouble_minus_one">Pdouble_minus_one</a> z)) in |- *;<br/>
1317
destruct (<a href="Coq.NArith.BinPos.html#ZL11">ZL11</a> z) as [H8| H8];<br/>
1318
[ rewrite H8; simpl in |- *;<br/>
1319
assert (H9 : <a href="Coq.NArith.BinPos.html#Pminus_mask_carry">Pminus_mask_carry</a> p q = <a href="Coq.NArith.BinPos.html#IsNul">IsNul</a>);<br/>
1320
[ apply ZL10; rewrite <- H8; assumption
1321
| rewrite H9; reflexivity ]<br/>
1322
| destruct H7 as [H9| H9];<br/>
1323
[ absurd (z = <a href="Coq.NArith.BinPos.html#xH">xH</a>); auto<br/>
1324
| rewrite H9; destruct z as [p0| p0| ]; simpl in |- *;<br/>
1325
[ reflexivity<br/>
1326
| reflexivity<br/>
1327
| absurd (<a href="Coq.NArith.BinPos.html#xH">xH</a> = <a href="Coq.NArith.BinPos.html#xH">xH</a>); [ assumption | reflexivity ] ] ] ] ] ].<br/>
1328
exists (<a href="Coq.NArith.BinPos.html#Pdouble_minus_one">Pdouble_minus_one</a> p); split;<br/>
1329
[ reflexivity<br/>
1330
| clear IHp; split;<br/>
1331
[ destruct p; simpl in |- *;<br/>
1332
[ reflexivity
1333
| rewrite Psucc_o_double_minus_one_eq_xO; reflexivity
1334
| reflexivity ]<br/>
1335
| destruct p; [ right | right | left ]; reflexivity ] ].<br/>
1336
<code class="keyword">Qed</code>.<br/>
1339
<code class="keyword">Theorem</code> <a name="Pplus_minus"></a>Pplus_minus :<br/>
1340
forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>, (p ?= q) <a href="Coq.Init.Datatypes.html#Eq">Eq</a> = <a href="Coq.Init.Datatypes.html#Gt">Gt</a> -> q + (p - q) = p.<br/>
1341
<code class="keyword">Proof</code>.<br/>
1342
intros x y H; elim <a href="Coq.NArith.BinPos.html#Pminus_mask_Gt">Pminus_mask_Gt</a> with (1 := H); intros z H1; elim H1;<br/>
1343
intros H2 H3; elim H3; intros H4 H5; unfold Pminus in |- *; <br/>
1344
rewrite H2; exact H4.<br/>
1345
<code class="keyword">Qed</code>.<br/>
1347
<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'