~ubuntu-branches/ubuntu/hardy/coq-doc/hardy

« back to all changes in this revision

Viewing changes to library/Coq.NArith.BinPos.html

  • Committer: Bazaar Package Importer
  • Author(s): Samuel Mimram
  • Date: 2004-09-18 13:28:22 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20040918132822-ees5mb8qmzd6a0fw
Tags: 8.0pl1.0-1
* Added the Coq faq, moved the tutorial to the root directory and added
  doc-base files for both, closes: #272204.
* Set dh_compat to level 4.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
<html xmlns="http://www.w3.org/1999/xhtml">
 
2
<head>
 
3
<meta http-equiv="Content-Type" content="text/html; charset="><link rel="stylesheet" href="style.css" type="text/css"><title>Coq.NArith.BinPos</title>
 
4
</head>
 
5
 
 
6
<body>
 
7
 
 
8
<h1>Library Coq.NArith.BinPos</h1>
 
9
 
 
10
<code>
 
11
</code>
 
12
 
 
13
<table width="100%"><tr class="doc"><td>
 
14
Binary positive numbers 
 
15
</td></tr></table>
 
16
<code>
 
17
 
 
18
<br/>
 
19
</code>
 
20
 
 
21
<table width="100%"><tr class="doc"><td>
 
22
Original development by Pierre Cr�gut, CNET, Lannion, France 
 
23
</td></tr></table>
 
24
<code>
 
25
 
 
26
<br/>
 
27
<code class="keyword">Inductive</code> <a name="positive"></a>positive : Set :=<br/>
 
28
&nbsp;&nbsp;| <a name="xI"></a>xI : positive -&gt; positive<br/>
 
29
&nbsp;&nbsp;| <a name="xO"></a>xO : positive -&gt; positive<br/>
 
30
&nbsp;&nbsp;| <a name="xH"></a>xH : positive.<br/>
 
31
 
 
32
<br/>
 
33
</code>
 
34
 
 
35
<table width="100%"><tr class="doc"><td>
 
36
Declare binding key for scope positive_scope 
 
37
</td></tr></table>
 
38
<code>
 
39
 
 
40
<br/>
 
41
Delimit Scope positive_scope with positive.<br/>
 
42
 
 
43
<br/>
 
44
</code>
 
45
 
 
46
<table width="100%"><tr class="doc"><td>
 
47
Automatically open scope positive_scope for type positive, xO and xI 
 
48
</td></tr></table>
 
49
<code>
 
50
 
 
51
<br/>
 
52
Bind Scope positive_scope with positive.<br/>
 
53
Arguments Scope xO [positive_scope].<br/>
 
54
Arguments Scope xI [positive_scope].<br/>
 
55
 
 
56
<br/>
 
57
</code>
 
58
 
 
59
<table width="100%"><tr class="doc"><td>
 
60
Successor 
 
61
</td></tr></table>
 
62
<code>
 
63
 
 
64
<br/>
 
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
&nbsp;&nbsp;match x with<br/>
 
67
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xI">xI</a> x' =&gt; <a href="Coq.NArith.BinPos.html#xO">xO</a> (Psucc x')<br/>
 
68
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xO">xO</a> x' =&gt; <a href="Coq.NArith.BinPos.html#xI">xI</a> x'<br/>
 
69
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xH">xH</a> =&gt; <a href="Coq.NArith.BinPos.html#xO">xO</a> <a href="Coq.NArith.BinPos.html#xH">xH</a><br/>
 
70
&nbsp;&nbsp;end.<br/>
 
71
 
 
72
<br/>
 
73
</code>
 
74
 
 
75
<table width="100%"><tr class="doc"><td>
 
76
Addition 
 
77
</td></tr></table>
 
78
<code>
 
79
 
 
80
<br/>
 
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
&nbsp;&nbsp;match x, y with<br/>
 
83
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xI">xI</a> x', <a href="Coq.NArith.BinPos.html#xI">xI</a> y' =&gt; <a href="Coq.NArith.BinPos.html#xO">xO</a> (Pplus_carry x' y')<br/>
 
84
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xI">xI</a> x', <a href="Coq.NArith.BinPos.html#xO">xO</a> y' =&gt; <a href="Coq.NArith.BinPos.html#xI">xI</a> (Pplus x' y')<br/>
 
85
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xI">xI</a> x', <a href="Coq.NArith.BinPos.html#xH">xH</a> =&gt; <a href="Coq.NArith.BinPos.html#xO">xO</a> (<a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> x')<br/>
 
86
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xO">xO</a> x', <a href="Coq.NArith.BinPos.html#xI">xI</a> y' =&gt; <a href="Coq.NArith.BinPos.html#xI">xI</a> (Pplus x' y')<br/>
 
87
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xO">xO</a> x', <a href="Coq.NArith.BinPos.html#xO">xO</a> y' =&gt; <a href="Coq.NArith.BinPos.html#xO">xO</a> (Pplus x' y')<br/>
 
88
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xO">xO</a> x', <a href="Coq.NArith.BinPos.html#xH">xH</a> =&gt; <a href="Coq.NArith.BinPos.html#xI">xI</a> x'<br/>
 
89
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xH">xH</a>, <a href="Coq.NArith.BinPos.html#xI">xI</a> y' =&gt; <a href="Coq.NArith.BinPos.html#xO">xO</a> (<a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> y')<br/>
 
90
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xH">xH</a>, <a href="Coq.NArith.BinPos.html#xO">xO</a> y' =&gt; <a href="Coq.NArith.BinPos.html#xI">xI</a> y'<br/>
 
91
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xH">xH</a>, <a href="Coq.NArith.BinPos.html#xH">xH</a> =&gt; <a href="Coq.NArith.BinPos.html#xO">xO</a> <a href="Coq.NArith.BinPos.html#xH">xH</a><br/>
 
92
&nbsp;&nbsp;end<br/>
 
93
&nbsp;<br/>
 
94
&nbsp;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
&nbsp;&nbsp;match x, y with<br/>
 
96
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xI">xI</a> x', <a href="Coq.NArith.BinPos.html#xI">xI</a> y' =&gt; <a href="Coq.NArith.BinPos.html#xI">xI</a> (Pplus_carry x' y')<br/>
 
97
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xI">xI</a> x', <a href="Coq.NArith.BinPos.html#xO">xO</a> y' =&gt; <a href="Coq.NArith.BinPos.html#xO">xO</a> (Pplus_carry x' y')<br/>
 
98
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xI">xI</a> x', <a href="Coq.NArith.BinPos.html#xH">xH</a> =&gt; <a href="Coq.NArith.BinPos.html#xI">xI</a> (<a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> x')<br/>
 
99
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xO">xO</a> x', <a href="Coq.NArith.BinPos.html#xI">xI</a> y' =&gt; <a href="Coq.NArith.BinPos.html#xO">xO</a> (Pplus_carry x' y')<br/>
 
100
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xO">xO</a> x', <a href="Coq.NArith.BinPos.html#xO">xO</a> y' =&gt; <a href="Coq.NArith.BinPos.html#xI">xI</a> (Pplus x' y')<br/>
 
101
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xO">xO</a> x', <a href="Coq.NArith.BinPos.html#xH">xH</a> =&gt; <a href="Coq.NArith.BinPos.html#xO">xO</a> (<a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> x')<br/>
 
102
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xH">xH</a>, <a href="Coq.NArith.BinPos.html#xI">xI</a> y' =&gt; <a href="Coq.NArith.BinPos.html#xI">xI</a> (<a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> y')<br/>
 
103
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xH">xH</a>, <a href="Coq.NArith.BinPos.html#xO">xO</a> y' =&gt; <a href="Coq.NArith.BinPos.html#xO">xO</a> (<a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> y')<br/>
 
104
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xH">xH</a>, <a href="Coq.NArith.BinPos.html#xH">xH</a> =&gt; <a href="Coq.NArith.BinPos.html#xI">xI</a> <a href="Coq.NArith.BinPos.html#xH">xH</a><br/>
 
105
&nbsp;&nbsp;end.<br/>
 
106
 
 
107
<br/>
 
108
<code class="keyword">Infix</code> "+" := <a href="Coq.NArith.BinPos.html#Pplus">Pplus</a> : positive_scope.<br/>
 
109
 
 
110
<br/>
 
111
Open <code class="keyword">Local</code> Scope positive_scope.<br/>
 
112
 
 
113
<br/>
 
114
</code>
 
115
 
 
116
<table width="100%"><tr class="doc"><td>
 
117
From binary positive numbers to Peano natural numbers 
 
118
</td></tr></table>
 
119
<code>
 
120
 
 
121
<br/>
 
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
&nbsp;&nbsp;match x with<br/>
 
124
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xI">xI</a> x' =&gt; (pow2 + Pmult_nat x' (pow2 + pow2))%nat<br/>
 
125
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xO">xO</a> x' =&gt; Pmult_nat x' (pow2 + pow2)%nat<br/>
 
126
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xH">xH</a> =&gt; pow2<br/>
 
127
&nbsp;&nbsp;end.<br/>
 
128
 
 
129
<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/>
 
131
 
 
132
<br/>
 
133
</code>
 
134
 
 
135
<table width="100%"><tr class="doc"><td>
 
136
From Peano natural numbers to binary positive numbers 
 
137
</td></tr></table>
 
138
<code>
 
139
 
 
140
<br/>
 
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
&nbsp;&nbsp;match n with<br/>
 
143
&nbsp;&nbsp;| <a href="Coq.Init.Datatypes.html#O">O</a> =&gt; <a href="Coq.NArith.BinPos.html#xH">xH</a><br/>
 
144
&nbsp;&nbsp;| <a href="Coq.Init.Datatypes.html#S">S</a> x' =&gt; <a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> (P_of_succ_nat x')<br/>
 
145
&nbsp;&nbsp;end.<br/>
 
146
 
 
147
<br/>
 
148
</code>
 
149
 
 
150
<table width="100%"><tr class="doc"><td>
 
151
Operation x -&gt; 2*x-1 
 
152
</td></tr></table>
 
153
<code>
 
154
 
 
155
<br/>
 
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
&nbsp;&nbsp;match x with<br/>
 
158
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xI">xI</a> x' =&gt; <a href="Coq.NArith.BinPos.html#xI">xI</a> (<a href="Coq.NArith.BinPos.html#xO">xO</a> x')<br/>
 
159
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xO">xO</a> x' =&gt; <a href="Coq.NArith.BinPos.html#xI">xI</a> (Pdouble_minus_one x')<br/>
 
160
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xH">xH</a> =&gt; <a href="Coq.NArith.BinPos.html#xH">xH</a><br/>
 
161
&nbsp;&nbsp;end.<br/>
 
162
 
 
163
<br/>
 
164
</code>
 
165
 
 
166
<table width="100%"><tr class="doc"><td>
 
167
Predecessor 
 
168
</td></tr></table>
 
169
<code>
 
170
 
 
171
<br/>
 
172
<code class="keyword">Definition</code> <a name="Ppred"></a>Ppred (x:<a href="Coq.NArith.BinPos.html#positive">positive</a>) :=<br/>
 
173
&nbsp;&nbsp;match x with<br/>
 
174
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xI">xI</a> x' =&gt; <a href="Coq.NArith.BinPos.html#xO">xO</a> x'<br/>
 
175
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xO">xO</a> x' =&gt; <a href="Coq.NArith.BinPos.html#Pdouble_minus_one">Pdouble_minus_one</a> x'<br/>
 
176
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xH">xH</a> =&gt; <a href="Coq.NArith.BinPos.html#xH">xH</a><br/>
 
177
&nbsp;&nbsp;end.<br/>
 
178
 
 
179
<br/>
 
180
</code>
 
181
 
 
182
<table width="100%"><tr class="doc"><td>
 
183
An auxiliary type for subtraction 
 
184
</td></tr></table>
 
185
<code>
 
186
 
 
187
<br/>
 
188
<code class="keyword">Inductive</code> <a name="positive_mask"></a>positive_mask : Set :=<br/>
 
189
&nbsp;&nbsp;| <a name="IsNul"></a>IsNul : positive_mask<br/>
 
190
&nbsp;&nbsp;| <a name="IsPos"></a>IsPos : <a href="Coq.NArith.BinPos.html#positive">positive</a> -&gt; positive_mask<br/>
 
191
&nbsp;&nbsp;| <a name="IsNeg"></a>IsNeg : positive_mask.<br/>
 
192
 
 
193
<br/>
 
194
</code>
 
195
 
 
196
<table width="100%"><tr class="doc"><td>
 
197
Operation x -&gt; 2*x+1 
 
198
</td></tr></table>
 
199
<code>
 
200
 
 
201
<br/>
 
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
&nbsp;&nbsp;match x with<br/>
 
204
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#IsNul">IsNul</a> =&gt; <a href="Coq.NArith.BinPos.html#IsPos">IsPos</a> <a href="Coq.NArith.BinPos.html#xH">xH</a><br/>
 
205
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#IsNeg">IsNeg</a> =&gt; <a href="Coq.NArith.BinPos.html#IsNeg">IsNeg</a><br/>
 
206
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#IsPos">IsPos</a> p =&gt; <a href="Coq.NArith.BinPos.html#IsPos">IsPos</a> (<a href="Coq.NArith.BinPos.html#xI">xI</a> p)<br/>
 
207
&nbsp;&nbsp;end.<br/>
 
208
 
 
209
<br/>
 
210
</code>
 
211
 
 
212
<table width="100%"><tr class="doc"><td>
 
213
Operation x -&gt; 2*x 
 
214
</td></tr></table>
 
215
<code>
 
216
 
 
217
<br/>
 
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
&nbsp;&nbsp;match x with<br/>
 
220
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#IsNul">IsNul</a> =&gt; <a href="Coq.NArith.BinPos.html#IsNul">IsNul</a><br/>
 
221
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#IsNeg">IsNeg</a> =&gt; <a href="Coq.NArith.BinPos.html#IsNeg">IsNeg</a><br/>
 
222
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#IsPos">IsPos</a> p =&gt; <a href="Coq.NArith.BinPos.html#IsPos">IsPos</a> (<a href="Coq.NArith.BinPos.html#xO">xO</a> p)<br/>
 
223
&nbsp;&nbsp;end.<br/>
 
224
 
 
225
<br/>
 
226
</code>
 
227
 
 
228
<table width="100%"><tr class="doc"><td>
 
229
Operation x -&gt; 2*x-2 
 
230
</td></tr></table>
 
231
<code>
 
232
 
 
233
<br/>
 
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
&nbsp;&nbsp;match x with<br/>
 
236
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xI">xI</a> x' =&gt; <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
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xO">xO</a> x' =&gt; <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
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xH">xH</a> =&gt; <a href="Coq.NArith.BinPos.html#IsNul">IsNul</a><br/>
 
239
&nbsp;&nbsp;end.<br/>
 
240
 
 
241
<br/>
 
242
</code>
 
243
 
 
244
<table width="100%"><tr class="doc"><td>
 
245
Subtraction of binary positive numbers into a positive numbers mask 
 
246
</td></tr></table>
 
247
<code>
 
248
 
 
249
<br/>
 
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
&nbsp;&nbsp;match x, y with<br/>
 
252
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xI">xI</a> x', <a href="Coq.NArith.BinPos.html#xI">xI</a> y' =&gt; <a href="Coq.NArith.BinPos.html#Pdouble_mask">Pdouble_mask</a> (Pminus_mask x' y')<br/>
 
253
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xI">xI</a> x', <a href="Coq.NArith.BinPos.html#xO">xO</a> y' =&gt; <a href="Coq.NArith.BinPos.html#Pdouble_plus_one_mask">Pdouble_plus_one_mask</a> (Pminus_mask x' y')<br/>
 
254
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xI">xI</a> x', <a href="Coq.NArith.BinPos.html#xH">xH</a> =&gt; <a href="Coq.NArith.BinPos.html#IsPos">IsPos</a> (<a href="Coq.NArith.BinPos.html#xO">xO</a> x')<br/>
 
255
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xO">xO</a> x', <a href="Coq.NArith.BinPos.html#xI">xI</a> y' =&gt; <a href="Coq.NArith.BinPos.html#Pdouble_plus_one_mask">Pdouble_plus_one_mask</a> (Pminus_mask_carry x' y')<br/>
 
256
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xO">xO</a> x', <a href="Coq.NArith.BinPos.html#xO">xO</a> y' =&gt; <a href="Coq.NArith.BinPos.html#Pdouble_mask">Pdouble_mask</a> (Pminus_mask x' y')<br/>
 
257
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xO">xO</a> x', <a href="Coq.NArith.BinPos.html#xH">xH</a> =&gt; <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
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xH">xH</a>, <a href="Coq.NArith.BinPos.html#xH">xH</a> =&gt; <a href="Coq.NArith.BinPos.html#IsNul">IsNul</a><br/>
 
259
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xH">xH</a>, _ =&gt; <a href="Coq.NArith.BinPos.html#IsNeg">IsNeg</a><br/>
 
260
&nbsp;&nbsp;end<br/>
 
261
&nbsp;<br/>
 
262
&nbsp;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
&nbsp;&nbsp;match x, y with<br/>
 
264
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xI">xI</a> x', <a href="Coq.NArith.BinPos.html#xI">xI</a> y' =&gt; <a href="Coq.NArith.BinPos.html#Pdouble_plus_one_mask">Pdouble_plus_one_mask</a> (Pminus_mask_carry x' y')<br/>
 
265
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xI">xI</a> x', <a href="Coq.NArith.BinPos.html#xO">xO</a> y' =&gt; <a href="Coq.NArith.BinPos.html#Pdouble_mask">Pdouble_mask</a> (Pminus_mask x' y')<br/>
 
266
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xI">xI</a> x', <a href="Coq.NArith.BinPos.html#xH">xH</a> =&gt; <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
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xO">xO</a> x', <a href="Coq.NArith.BinPos.html#xI">xI</a> y' =&gt; <a href="Coq.NArith.BinPos.html#Pdouble_mask">Pdouble_mask</a> (Pminus_mask_carry x' y')<br/>
 
268
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xO">xO</a> x', <a href="Coq.NArith.BinPos.html#xO">xO</a> y' =&gt; <a href="Coq.NArith.BinPos.html#Pdouble_plus_one_mask">Pdouble_plus_one_mask</a> (Pminus_mask_carry x' y')<br/>
 
269
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xO">xO</a> x', <a href="Coq.NArith.BinPos.html#xH">xH</a> =&gt; <a href="Coq.NArith.BinPos.html#Pdouble_minus_two">Pdouble_minus_two</a> x'<br/>
 
270
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xH">xH</a>, _ =&gt; <a href="Coq.NArith.BinPos.html#IsNeg">IsNeg</a><br/>
 
271
&nbsp;&nbsp;end.<br/>
 
272
 
 
273
<br/>
 
274
</code>
 
275
 
 
276
<table width="100%"><tr class="doc"><td>
 
277
Subtraction of binary positive numbers x and y, returns 1 if x&lt;=y 
 
278
</td></tr></table>
 
279
<code>
 
280
 
 
281
<br/>
 
282
<code class="keyword">Definition</code> <a name="Pminus"></a>Pminus (x y:<a href="Coq.NArith.BinPos.html#positive">positive</a>) :=<br/>
 
283
&nbsp;&nbsp;match <a href="Coq.NArith.BinPos.html#Pminus_mask">Pminus_mask</a> x y with<br/>
 
284
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#IsPos">IsPos</a> z =&gt; z<br/>
 
285
&nbsp;&nbsp;| _ =&gt; <a href="Coq.NArith.BinPos.html#xH">xH</a><br/>
 
286
&nbsp;&nbsp;end.<br/>
 
287
 
 
288
<br/>
 
289
<code class="keyword">Infix</code> "-" := <a href="Coq.NArith.BinPos.html#Pminus">Pminus</a> : positive_scope.<br/>
 
290
 
 
291
<br/>
 
292
</code>
 
293
 
 
294
<table width="100%"><tr class="doc"><td>
 
295
Multiplication on binary positive numbers 
 
296
</td></tr></table>
 
297
<code>
 
298
 
 
299
<br/>
 
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
&nbsp;&nbsp;match x with<br/>
 
302
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xI">xI</a> x' =&gt; y + <a href="Coq.NArith.BinPos.html#xO">xO</a> (Pmult x' y)<br/>
 
303
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xO">xO</a> x' =&gt; <a href="Coq.NArith.BinPos.html#xO">xO</a> (Pmult x' y)<br/>
 
304
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xH">xH</a> =&gt; y<br/>
 
305
&nbsp;&nbsp;end.<br/>
 
306
 
 
307
<br/>
 
308
<code class="keyword">Infix</code> "*" := <a href="Coq.NArith.BinPos.html#Pmult">Pmult</a> : positive_scope.<br/>
 
309
 
 
310
<br/>
 
311
</code>
 
312
 
 
313
<table width="100%"><tr class="doc"><td>
 
314
Division by 2 rounded below but for 1 
 
315
</td></tr></table>
 
316
<code>
 
317
 
 
318
<br/>
 
319
<code class="keyword">Definition</code> <a name="Pdiv2"></a>Pdiv2 (z:<a href="Coq.NArith.BinPos.html#positive">positive</a>) :=<br/>
 
320
&nbsp;&nbsp;match z with<br/>
 
321
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xH">xH</a> =&gt; <a href="Coq.NArith.BinPos.html#xH">xH</a><br/>
 
322
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xO">xO</a> p =&gt; p<br/>
 
323
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xI">xI</a> p =&gt; p<br/>
 
324
&nbsp;&nbsp;end.<br/>
 
325
 
 
326
<br/>
 
327
<code class="keyword">Infix</code> "/" := <a href="Coq.NArith.BinPos.html#Pdiv2">Pdiv2</a> : positive_scope.<br/>
 
328
 
 
329
<br/>
 
330
</code>
 
331
 
 
332
<table width="100%"><tr class="doc"><td>
 
333
Comparison on binary positive numbers 
 
334
</td></tr></table>
 
335
<code>
 
336
 
 
337
<br/>
 
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
&nbsp;&nbsp;match x, y with<br/>
 
340
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xI">xI</a> x', <a href="Coq.NArith.BinPos.html#xI">xI</a> y' =&gt; Pcompare x' y' r<br/>
 
341
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xI">xI</a> x', <a href="Coq.NArith.BinPos.html#xO">xO</a> y' =&gt; Pcompare x' y' <a href="Coq.Init.Datatypes.html#Gt">Gt</a><br/>
 
342
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xI">xI</a> x', <a href="Coq.NArith.BinPos.html#xH">xH</a> =&gt; <a href="Coq.Init.Datatypes.html#Gt">Gt</a><br/>
 
343
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xO">xO</a> x', <a href="Coq.NArith.BinPos.html#xI">xI</a> y' =&gt; Pcompare x' y' <a href="Coq.Init.Datatypes.html#Lt">Lt</a><br/>
 
344
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xO">xO</a> x', <a href="Coq.NArith.BinPos.html#xO">xO</a> y' =&gt; Pcompare x' y' r<br/>
 
345
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xO">xO</a> x', <a href="Coq.NArith.BinPos.html#xH">xH</a> =&gt; <a href="Coq.Init.Datatypes.html#Gt">Gt</a><br/>
 
346
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xH">xH</a>, <a href="Coq.NArith.BinPos.html#xI">xI</a> y' =&gt; <a href="Coq.Init.Datatypes.html#Lt">Lt</a><br/>
 
347
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xH">xH</a>, <a href="Coq.NArith.BinPos.html#xO">xO</a> y' =&gt; <a href="Coq.Init.Datatypes.html#Lt">Lt</a><br/>
 
348
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xH">xH</a>, <a href="Coq.NArith.BinPos.html#xH">xH</a> =&gt; r<br/>
 
349
&nbsp;&nbsp;end.<br/>
 
350
 
 
351
<br/>
 
352
<code class="keyword">Infix</code> "?=" := <a href="Coq.NArith.BinPos.html#Pcompare">Pcompare</a> (at level 70, no associativity) : positive_scope.<br/>
 
353
 
 
354
<br/>
 
355
</code>
 
356
 
 
357
<table width="100%"><tr class="doc"><td>
 
358
Miscellaneous properties of binary positive numbers 
 
359
</td></tr></table>
 
360
<code>
 
361
 
 
362
<br/>
 
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 &lt;&gt; <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/>
 
367
 
 
368
<br/>
 
369
</code>
 
370
 
 
371
<table width="100%"><tr class="doc"><td>
 
372
Properties of successor on binary positive numbers 
 
373
</td></tr></table>
 
374
<code>
 
375
 
 
376
<br/>
 
377
</code>
 
378
 
 
379
<table width="100%"><tr class="doc"><td>
 
380
Specification of <code>xI</code> in term of <code>Psucc</code> and <code>xO</code> 
 
381
</td></tr></table>
 
382
<code>
 
383
 
 
384
<br/>
 
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/>
 
387
reflexivity.<br/>
 
388
<code class="keyword">Qed</code>.<br/>
 
389
 
 
390
<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 &lt;&gt; <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/>
 
395
 
 
396
<br/>
 
397
</code>
 
398
 
 
399
<table width="100%"><tr class="doc"><td>
 
400
Successor and double 
 
401
</td></tr></table>
 
402
<code>
 
403
 
 
404
<br/>
 
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
&nbsp;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
&nbsp;reflexivity.<br/>
 
410
<code class="keyword">Qed</code>.<br/>
 
411
 
 
412
<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
&nbsp;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
&nbsp;reflexivity.<br/>
 
418
<code class="keyword">Qed</code>.<br/>
 
419
 
 
420
<br/>
 
421
<code class="keyword">Lemma</code> <a name="xO_succ_permute"></a>xO_succ_permute :<br/>
 
422
&nbsp;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/>
 
426
 
 
427
<br/>
 
428
<code class="keyword">Lemma</code> <a name="double_moins_un_xO_discr"></a>double_moins_un_xO_discr :<br/>
 
429
&nbsp;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 &lt;&gt; <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/>
 
433
 
 
434
<br/>
 
435
</code>
 
436
 
 
437
<table width="100%"><tr class="doc"><td>
 
438
Successor and predecessor 
 
439
</td></tr></table>
 
440
<code>
 
441
 
 
442
<br/>
 
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 &lt;&gt; <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/>
 
447
 
 
448
<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
&nbsp;(induction p as [p IHp| | ]; [ idtac | reflexivity | reflexivity ]);<br/>
 
453
&nbsp;simpl in |- *; simpl in IHp; try rewrite &lt;- IHp; reflexivity.<br/>
 
454
<code class="keyword">Qed</code>.<br/>
 
455
 
 
456
<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
&nbsp;[ simpl in |- *; auto
 
461
 | simpl in |- *; intros; right; apply Psucc_o_double_minus_one_eq_xO
 
462
 | auto ].<br/>
 
463
<code class="keyword">Qed</code>.<br/>
 
464
 
 
465
<br/>
 
466
</code>
 
467
 
 
468
<table width="100%"><tr class="doc"><td>
 
469
Injectivity of successor 
 
470
</td></tr></table>
 
471
<code>
 
472
 
 
473
<br/>
 
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 -&gt; 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
&nbsp;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
&nbsp;[ apply Psucc_not_one | symmetry  in |- *; assumption ].<br/>
 
483
reflexivity.<br/>
 
484
<code class="keyword">Qed</code>.<br/>
 
485
 
 
486
<br/>
 
487
</code>
 
488
 
 
489
<table width="100%"><tr class="doc"><td>
 
490
Properties of addition on binary positive numbers 
 
491
</td></tr></table>
 
492
<code>
 
493
 
 
494
<br/>
 
495
</code>
 
496
 
 
497
<table width="100%"><tr class="doc"><td>
 
498
Specification of <code>Psucc</code> in term of <code>Pplus</code> 
 
499
</td></tr></table>
 
500
<code>
 
501
 
 
502
<br/>
 
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/>
 
507
 
 
508
<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/>
 
513
 
 
514
<br/>
 
515
</code>
 
516
 
 
517
<table width="100%"><tr class="doc"><td>
 
518
Specification of <code>Pplus_carry</code> 
 
519
</td></tr></table>
 
520
<code>
 
521
 
 
522
<br/>
 
523
<code class="keyword">Theorem</code> <a name="Pplus_carry_spec"></a>Pplus_carry_spec :<br/>
 
524
&nbsp;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
&nbsp;[ destruct y as [p0| p0| ]<br/>
 
528
&nbsp;| destruct y as [p0| p0| ]<br/>
 
529
&nbsp;| destruct y as [p| p| ] ]; simpl in |- *; auto; rewrite IHp; <br/>
 
530
&nbsp;auto.<br/>
 
531
<code class="keyword">Qed</code>.<br/>
 
532
 
 
533
<br/>
 
534
</code>
 
535
 
 
536
<table width="100%"><tr class="doc"><td>
 
537
Commutativity 
 
538
</td></tr></table>
 
539
<code>
 
540
 
 
541
<br/>
 
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
&nbsp;[ destruct y as [p0| p0| ]<br/>
 
546
&nbsp;| destruct y as [p0| p0| ]<br/>
 
547
&nbsp;| destruct y as [p| p| ] ]; simpl in |- *; auto;<br/>
 
548
&nbsp;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/>
 
550
 
 
551
<br/>
 
552
</code>
 
553
 
 
554
<table width="100%"><tr class="doc"><td>
 
555
Permutation of <code>Pplus</code> and <code>Psucc</code> 
 
556
</td></tr></table>
 
557
<code>
 
558
 
 
559
<br/>
 
560
<code class="keyword">Theorem</code> <a name="Pplus_succ_permute_r"></a>Pplus_succ_permute_r :<br/>
 
561
&nbsp;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
&nbsp;[ destruct y as [p0| p0| ]<br/>
 
565
&nbsp;| destruct y as [p0| p0| ]<br/>
 
566
&nbsp;| destruct y as [p| p| ] ]; simpl in |- *; auto;<br/>
 
567
&nbsp;[ rewrite Pplus_carry_spec; rewrite IHp; auto
 
568
 | rewrite Pplus_carry_spec; auto
 
569
 | destruct p; simpl in |- *; auto
 
570
 | rewrite IHp; auto
 
571
 | destruct p; simpl in |- *; auto ].<br/>
 
572
<code class="keyword">Qed</code>.<br/>
 
573
 
 
574
<br/>
 
575
<code class="keyword">Theorem</code> <a name="Pplus_succ_permute_l"></a>Pplus_succ_permute_l :<br/>
 
576
&nbsp;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
&nbsp;apply <a href="Coq.NArith.BinPos.html#Pplus_succ_permute_r">Pplus_succ_permute_r</a>.<br/>
 
580
<code class="keyword">Qed</code>.<br/>
 
581
 
 
582
<br/>
 
583
<code class="keyword">Theorem</code> <a name="Pplus_carry_pred_eq_plus"></a>Pplus_carry_pred_eq_plus :<br/>
 
584
&nbsp;forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>, q &lt;&gt; <a href="Coq.NArith.BinPos.html#xH">xH</a> -&gt; <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
&nbsp;[ intro; absurd (z = xH); auto
 
588
 | intros E; pattern z at 2 in |- *; rewrite &lt;- E;
 
589
    rewrite Pplus_succ_permute_r; rewrite Pplus_carry_spec; 
 
590
    trivial ].<br/>
 
591
<code class="keyword">Qed</code>. <br/>
 
592
 
 
593
<br/>
 
594
</code>
 
595
 
 
596
<table width="100%"><tr class="doc"><td>
 
597
No neutral for addition on strictly positive numbers 
 
598
</td></tr></table>
 
599
<code>
 
600
 
 
601
<br/>
 
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 &lt;&gt; 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
&nbsp;discriminate H || injection H; clear H; intro H; apply (IHx y H).<br/>
 
606
<code class="keyword">Qed</code>.<br/>
 
607
 
 
608
<br/>
 
609
<code class="keyword">Lemma</code> <a name="Pplus_carry_no_neutral"></a>Pplus_carry_no_neutral :<br/>
 
610
&nbsp;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 &lt;&gt; <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
&nbsp;[ apply Pplus_no_neutral
 
614
 | apply Psucc_inj; rewrite &lt;- Pplus_carry_spec; assumption ].<br/>
 
615
<code class="keyword">Qed</code>.<br/>
 
616
 
 
617
<br/>
 
618
</code>
 
619
 
 
620
<table width="100%"><tr class="doc"><td>
 
621
Simplification 
 
622
</td></tr></table>
 
623
<code>
 
624
 
 
625
<br/>
 
626
<code class="keyword">Lemma</code> <a name="Pplus_carry_plus"></a>Pplus_carry_plus :<br/>
 
627
&nbsp;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 -&gt; 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 &lt;- <a href="Coq.NArith.BinPos.html#Pplus_carry_spec">Pplus_carry_spec</a>;<br/>
 
630
&nbsp;assumption.<br/>
 
631
<code class="keyword">Qed</code>.<br/>
 
632
 
 
633
<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 -&gt; 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
&nbsp;&nbsp;destruct x as [x| x| ]; intro y; destruct y as [y| y| ]; simpl in |- *;<br/>
 
639
&nbsp;&nbsp;&nbsp;intro H; discriminate H || (try (injection H; clear H; intro H)).<br/>
 
640
&nbsp;&nbsp;&nbsp;&nbsp;rewrite IHz with (1 := <a href="Coq.NArith.BinPos.html#Pplus_carry_plus">Pplus_carry_plus</a> _ _ _ _ H); reflexivity.<br/>
 
641
&nbsp;&nbsp;&nbsp;&nbsp;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
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ apply Pplus_carry_no_neutral | assumption ].<br/>
 
643
&nbsp;&nbsp;&nbsp;&nbsp;rewrite IHz with (1 := H); reflexivity.<br/>
 
644
&nbsp;&nbsp;&nbsp;&nbsp;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
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ apply Pplus_carry_no_neutral | assumption ].<br/>
 
646
&nbsp;&nbsp;&nbsp;&nbsp;reflexivity.<br/>
 
647
&nbsp;&nbsp;destruct x as [x| x| ]; intro y; destruct y as [y| y| ]; simpl in |- *;<br/>
 
648
&nbsp;&nbsp;&nbsp;intro H; discriminate H || (try (injection H; clear H; intro H)).<br/>
 
649
&nbsp;&nbsp;&nbsp;&nbsp;rewrite IHz with (1 := H); reflexivity.<br/>
 
650
&nbsp;&nbsp;&nbsp;&nbsp;absurd (x + z = z); [ apply Pplus_no_neutral | assumption ].<br/>
 
651
&nbsp;&nbsp;&nbsp;&nbsp;rewrite IHz with (1 := H); reflexivity.<br/>
 
652
&nbsp;&nbsp;&nbsp;&nbsp;symmetry  in H; absurd (y + z = z);<br/>
 
653
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ apply Pplus_no_neutral | assumption ].<br/>
 
654
&nbsp;&nbsp;&nbsp;&nbsp;reflexivity.<br/>
 
655
&nbsp;&nbsp;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/>
 
657
 
 
658
<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 -&gt; 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
&nbsp;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
&nbsp;assumption.<br/>
 
664
<code class="keyword">Qed</code>.<br/>
 
665
 
 
666
<br/>
 
667
<code class="keyword">Lemma</code> <a name="Pplus_carry_reg_r"></a>Pplus_carry_reg_r :<br/>
 
668
&nbsp;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 -&gt; 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
&nbsp;assumption.<br/>
 
672
<code class="keyword">Qed</code>.<br/>
 
673
 
 
674
<br/>
 
675
<code class="keyword">Lemma</code> <a name="Pplus_carry_reg_l"></a>Pplus_carry_reg_l :<br/>
 
676
&nbsp;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 -&gt; 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
&nbsp;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
&nbsp;apply <a href="Coq.NArith.BinPos.html#Pplus_carry_plus">Pplus_carry_plus</a>; assumption.<br/>
 
681
<code class="keyword">Qed</code>.<br/>
 
682
 
 
683
<br/>
 
684
</code>
 
685
 
 
686
<table width="100%"><tr class="doc"><td>
 
687
Addition on positive is associative 
 
688
</td></tr></table>
 
689
<code>
 
690
 
 
691
<br/>
 
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
&nbsp;&nbsp;destruct x as [x| x| ]; intro z; destruct z as [z| z| ]; simpl in |- *;<br/>
 
697
&nbsp;&nbsp;&nbsp;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
&nbsp;&nbsp;&nbsp;repeat rewrite <a href="Coq.NArith.BinPos.html#Pplus_succ_permute_l">Pplus_succ_permute_l</a>;<br/>
 
699
&nbsp;&nbsp;&nbsp;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
&nbsp;&nbsp;&nbsp;apply IHy.<br/>
 
701
&nbsp;&nbsp;destruct x as [x| x| ]; intro z; destruct z as [z| z| ]; simpl in |- *;<br/>
 
702
&nbsp;&nbsp;&nbsp;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
&nbsp;&nbsp;&nbsp;repeat rewrite <a href="Coq.NArith.BinPos.html#Pplus_succ_permute_l">Pplus_succ_permute_l</a>;<br/>
 
704
&nbsp;&nbsp;&nbsp;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
&nbsp;&nbsp;&nbsp;apply IHy.<br/>
 
706
&nbsp;&nbsp;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
&nbsp;&nbsp;&nbsp;do 2 rewrite &lt;- <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
&nbsp;&nbsp;&nbsp;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/>
 
710
 
 
711
<br/>
 
712
</code>
 
713
 
 
714
<table width="100%"><tr class="doc"><td>
 
715
Commutation of addition with the double of a positive number 
 
716
</td></tr></table>
 
717
<code>
 
718
 
 
719
<br/>
 
720
<code class="keyword">Lemma</code> <a name="Pplus_xI_double_minus_one"></a>Pplus_xI_double_minus_one :<br/>
 
721
&nbsp;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 &lt;- <a href="Coq.NArith.BinPos.html#Pplus_assoc">Pplus_assoc</a>; rewrite &lt;- <a href="Coq.NArith.BinPos.html#Pplus_one_succ_l">Pplus_one_succ_l</a>;<br/>
 
725
&nbsp;rewrite <a href="Coq.NArith.BinPos.html#Psucc_o_double_minus_one_eq_xO">Psucc_o_double_minus_one_eq_xO</a>.<br/>
 
726
reflexivity.<br/>
 
727
<code class="keyword">Qed</code>.<br/>
 
728
 
 
729
<br/>
 
730
<code class="keyword">Lemma</code> <a name="Pplus_xO_double_minus_one"></a>Pplus_xO_double_minus_one :<br/>
 
731
&nbsp;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
&nbsp;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
&nbsp;try rewrite IHp; try rewrite <a href="Coq.NArith.BinPos.html#Pplus_xI_double_minus_one">Pplus_xI_double_minus_one</a>; <br/>
 
736
&nbsp;try reflexivity.<br/>
 
737
&nbsp;rewrite &lt;- <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
&nbsp;&nbsp;reflexivity. <br/>
 
739
<code class="keyword">Qed</code>.<br/>
 
740
 
 
741
<br/>
 
742
</code>
 
743
 
 
744
<table width="100%"><tr class="doc"><td>
 
745
Misc 
 
746
</td></tr></table>
 
747
<code>
 
748
 
 
749
<br/>
 
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
&nbsp;try rewrite IHx; reflexivity.<br/>
 
754
<code class="keyword">Qed</code>.<br/>
 
755
 
 
756
<br/>
 
757
</code>
 
758
 
 
759
<table width="100%"><tr class="doc"><td>
 
760
Peano induction on binary positive positive numbers 
 
761
</td></tr></table>
 
762
<code>
 
763
 
 
764
<br/>
 
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
&nbsp;&nbsp;match x with<br/>
 
767
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xH">xH</a> =&gt; <a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> y<br/>
 
768
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xO">xO</a> x =&gt; plus_iter x (plus_iter x y)<br/>
 
769
&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xI">xI</a> x =&gt; plus_iter x (plus_iter x (<a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> y))<br/>
 
770
&nbsp;&nbsp;end.<br/>
 
771
 
 
772
<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
&nbsp;[ destruct y as [p0| p0| ]<br/>
 
777
&nbsp;| destruct y as [p0| p0| ]<br/>
 
778
&nbsp;| destruct y as [p| p| ] ]; simpl in |- *; reflexivity || (do 2 rewrite IHp);<br/>
 
779
&nbsp;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 &lt;- <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/>
 
783
 
 
784
<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 &lt;- <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/>
 
789
 
 
790
<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 &lt;- <a href="Coq.NArith.BinPos.html#Pplus_diag">Pplus_diag</a>;<br/>
 
794
&nbsp;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/>
 
796
 
 
797
<br/>
 
798
<code class="keyword">Lemma</code> <a name="iterate_add"></a>iterate_add :<br/>
 
799
&nbsp;forall P:<a href="Coq.NArith.BinPos.html#positive">positive</a> -&gt; Type,<br/>
 
800
&nbsp;&nbsp;&nbsp;(forall n:<a href="Coq.NArith.BinPos.html#positive">positive</a>, P n -&gt; P (<a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> n)) -&gt;<br/>
 
801
&nbsp;&nbsp;&nbsp;forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>, P q -&gt; 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/>
 
808
 
 
809
<br/>
 
810
</code>
 
811
 
 
812
<table width="100%"><tr class="doc"><td>
 
813
Peano induction 
 
814
</td></tr></table>
 
815
<code>
 
816
 
 
817
<br/>
 
818
<code class="keyword">Theorem</code> <a name="Pind"></a>Pind :<br/>
 
819
&nbsp;forall P:<a href="Coq.NArith.BinPos.html#positive">positive</a> -&gt; Prop,<br/>
 
820
&nbsp;&nbsp;&nbsp;P <a href="Coq.NArith.BinPos.html#xH">xH</a> -&gt; (forall n:<a href="Coq.NArith.BinPos.html#positive">positive</a>, P n -&gt; P (<a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> n)) -&gt; 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 &lt;- <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 &lt;- <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/>
 
825
assumption.<br/>
 
826
<code class="keyword">Qed</code>.<br/>
 
827
 
 
828
<br/>
 
829
</code>
 
830
 
 
831
<table width="100%"><tr class="doc"><td>
 
832
Peano recursion 
 
833
</td></tr></table>
 
834
<code>
 
835
 
 
836
<br/>
 
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> -&gt; A -&gt; A) : <br/>
 
838
&nbsp;&nbsp;<a href="Coq.NArith.BinPos.html#positive">positive</a> -&gt; A :=<br/>
 
839
&nbsp;&nbsp;(fix Prec (p:<a href="Coq.NArith.BinPos.html#positive">positive</a>) : A :=<br/>
 
840
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;match p with<br/>
 
841
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xH">xH</a> =&gt; a<br/>
 
842
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xO">xO</a> p =&gt; <a href="Coq.NArith.BinPos.html#iterate_add">iterate_add</a> (fun _ =&gt; A) f p p (Prec p)<br/>
 
843
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| <a href="Coq.NArith.BinPos.html#xI">xI</a> p =&gt; 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 _ =&gt; A) f p p (Prec p))<br/>
 
844
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end).<br/>
 
845
 
 
846
<br/>
 
847
</code>
 
848
 
 
849
<table width="100%"><tr class="doc"><td>
 
850
Peano case analysis 
 
851
</td></tr></table>
 
852
<code>
 
853
 
 
854
<br/>
 
855
<code class="keyword">Theorem</code> <a name="Pcase"></a>Pcase :<br/>
 
856
&nbsp;forall P:<a href="Coq.NArith.BinPos.html#positive">positive</a> -&gt; Prop,<br/>
 
857
&nbsp;&nbsp;&nbsp;P <a href="Coq.NArith.BinPos.html#xH">xH</a> -&gt; (forall n:<a href="Coq.NArith.BinPos.html#positive">positive</a>, P (<a href="Coq.NArith.BinPos.html#Psucc">Psucc</a> n)) -&gt; 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/>
 
861
 
 
862
<br/>
 
863
</code>
 
864
 
 
865
<table width="100%"><tr class="doc"><td>
 
866
Properties of multiplication on binary positive numbers 
 
867
</td></tr></table>
 
868
<code>
 
869
 
 
870
<br/>
 
871
</code>
 
872
 
 
873
<table width="100%"><tr class="doc"><td>
 
874
One is right neutral for multiplication 
 
875
</td></tr></table>
 
876
<code>
 
877
 
 
878
<br/>
 
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
&nbsp;&nbsp;rewrite IHx; reflexivity.<br/>
 
883
&nbsp;&nbsp;rewrite IHx; reflexivity.<br/>
 
884
&nbsp;&nbsp;reflexivity.<br/>
 
885
<code class="keyword">Qed</code>.<br/>
 
886
 
 
887
<br/>
 
888
</code>
 
889
 
 
890
<table width="100%"><tr class="doc"><td>
 
891
Right reduction properties for multiplication 
 
892
</td></tr></table>
 
893
<code>
 
894
 
 
895
<br/>
 
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
&nbsp;&nbsp;rewrite IHx; reflexivity.<br/>
 
900
&nbsp;&nbsp;rewrite IHx; reflexivity.<br/>
 
901
&nbsp;&nbsp;reflexivity.<br/>
 
902
<code class="keyword">Qed</code>.<br/>
 
903
 
 
904
<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
&nbsp;&nbsp;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
&nbsp;&nbsp;&nbsp;reflexivity.<br/>
 
910
&nbsp;&nbsp;rewrite IHx; reflexivity.<br/>
 
911
&nbsp;&nbsp;reflexivity.<br/>
 
912
<code class="keyword">Qed</code>.<br/>
 
913
 
 
914
<br/>
 
915
</code>
 
916
 
 
917
<table width="100%"><tr class="doc"><td>
 
918
Commutativity of multiplication 
 
919
</td></tr></table>
 
920
<code>
 
921
 
 
922
<br/>
 
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
&nbsp;&nbsp;rewrite &lt;- IHy; apply <a href="Coq.NArith.BinPos.html#Pmult_xI_permute_r">Pmult_xI_permute_r</a>.<br/>
 
927
&nbsp;&nbsp;rewrite &lt;- IHy; apply <a href="Coq.NArith.BinPos.html#Pmult_xO_permute_r">Pmult_xO_permute_r</a>.<br/>
 
928
&nbsp;&nbsp;apply <a href="Coq.NArith.BinPos.html#Pmult_1_r">Pmult_1_r</a>.<br/>
 
929
<code class="keyword">Qed</code>.<br/>
 
930
 
 
931
<br/>
 
932
</code>
 
933
 
 
934
<table width="100%"><tr class="doc"><td>
 
935
Distributivity of multiplication over addition 
 
936
</td></tr></table>
 
937
<code>
 
938
 
 
939
<br/>
 
940
<code class="keyword">Theorem</code> <a name="Pmult_plus_distr_l"></a>Pmult_plus_distr_l :<br/>
 
941
&nbsp;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
&nbsp;&nbsp;rewrite IHx; rewrite &lt;- <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
&nbsp;&nbsp;&nbsp;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
&nbsp;&nbsp;&nbsp;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
&nbsp;&nbsp;&nbsp;rewrite &lt;- <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
&nbsp;&nbsp;&nbsp;rewrite <a href="Coq.NArith.BinPos.html#Pplus_assoc">Pplus_assoc</a> with (q:= z); reflexivity.<br/>
 
949
&nbsp;&nbsp;rewrite IHx; reflexivity.<br/>
 
950
&nbsp;&nbsp;reflexivity.<br/>
 
951
<code class="keyword">Qed</code>.<br/>
 
952
 
 
953
<br/>
 
954
<code class="keyword">Theorem</code> <a name="Pmult_plus_distr_r"></a>Pmult_plus_distr_r :<br/>
 
955
&nbsp;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/>
 
959
 
 
960
<br/>
 
961
</code>
 
962
 
 
963
<table width="100%"><tr class="doc"><td>
 
964
Associativity of multiplication 
 
965
</td></tr></table>
 
966
<code>
 
967
 
 
968
<br/>
 
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
&nbsp;&nbsp;rewrite IHx; rewrite <a href="Coq.NArith.BinPos.html#Pmult_plus_distr_r">Pmult_plus_distr_r</a>; reflexivity.<br/>
 
973
&nbsp;&nbsp;rewrite IHx; reflexivity.<br/>
 
974
&nbsp;&nbsp;reflexivity.<br/>
 
975
<code class="keyword">Qed</code>.<br/>
 
976
 
 
977
<br/>
 
978
</code>
 
979
 
 
980
<table width="100%"><tr class="doc"><td>
 
981
Parity properties of multiplication 
 
982
</td></tr></table>
 
983
<code>
 
984
 
 
985
<br/>
 
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 &lt;&gt; <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/>
 
993
 
 
994
<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 &lt;&gt; 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/>
 
1000
 
 
1001
<br/>
 
1002
</code>
 
1003
 
 
1004
<table width="100%"><tr class="doc"><td>
 
1005
Simplification properties of multiplication 
 
1006
</td></tr></table>
 
1007
<code>
 
1008
 
 
1009
<br/>
 
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 -&gt; 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
&nbsp;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
&nbsp;&nbsp;simpl in H; apply IHp with (<a href="Coq.NArith.BinPos.html#xO">xO</a> z); simpl in |- *;<br/>
 
1015
&nbsp;&nbsp;&nbsp;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
&nbsp;&nbsp;apply <a href="Coq.NArith.BinPos.html#Pmult_xI_mult_xO_discr">Pmult_xI_mult_xO_discr</a> with (1 := H).<br/>
 
1017
&nbsp;&nbsp;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
&nbsp;&nbsp;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
&nbsp;&nbsp;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
&nbsp;&nbsp;&nbsp;assumption.<br/>
 
1021
&nbsp;&nbsp;apply <a href="Coq.NArith.BinPos.html#Pmult_xO_discr">Pmult_xO_discr</a> with (1 := H).<br/>
 
1022
&nbsp;&nbsp;simpl in H; symmetry  in H; rewrite <a href="Coq.NArith.BinPos.html#Pplus_comm">Pplus_comm</a> in H;<br/>
 
1023
&nbsp;&nbsp;&nbsp;apply <a href="Coq.NArith.BinPos.html#Pplus_no_neutral">Pplus_no_neutral</a> with (1 := H).<br/>
 
1024
&nbsp;&nbsp;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/>
 
1026
 
 
1027
<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 -&gt; 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
&nbsp;assumption.<br/>
 
1033
<code class="keyword">Qed</code>.<br/>
 
1034
 
 
1035
<br/>
 
1036
</code>
 
1037
 
 
1038
<table width="100%"><tr class="doc"><td>
 
1039
Inversion of multiplication 
 
1040
</td></tr></table>
 
1041
<code>
 
1042
 
 
1043
<br/>
 
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> -&gt; 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
&nbsp;destruct y as [p0| p0| ]; intro; discriminate.<br/>
 
1048
&nbsp;intro; discriminate.<br/>
 
1049
&nbsp;reflexivity.<br/>
 
1050
<code class="keyword">Qed</code>.<br/>
 
1051
 
 
1052
<br/>
 
1053
</code>
 
1054
 
 
1055
<table width="100%"><tr class="doc"><td>
 
1056
Properties of comparison on binary positive numbers 
 
1057
</td></tr></table>
 
1058
<code>
 
1059
 
 
1060
<br/>
 
1061
<code class="keyword">Theorem</code> <a name="Pcompare_not_Eq"></a>Pcompare_not_Eq :<br/>
 
1062
&nbsp;forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>, (p ?= q) <a href="Coq.Init.Datatypes.html#Gt">Gt</a> &lt;&gt; <a href="Coq.Init.Datatypes.html#Eq">Eq</a> /\ (p ?= q) <a href="Coq.Init.Datatypes.html#Lt">Lt</a> &lt;&gt; <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
&nbsp;split; simpl in |- *; auto; discriminate || (elim (IHp q); auto).<br/>
 
1066
<code class="keyword">Qed</code>.<br/>
 
1067
 
 
1068
<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> -&gt; 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
&nbsp;simpl in |- *; auto; intro H;<br/>
 
1073
&nbsp;[ rewrite (IHp q); trivial<br/>
 
1074
&nbsp;| absurd ((p ?= q) <a href="Coq.Init.Datatypes.html#Gt">Gt</a> = <a href="Coq.Init.Datatypes.html#Eq">Eq</a>);<br/>
 
1075
&nbsp;&nbsp;&nbsp;&nbsp;[ elim (Pcompare_not_Eq p q); auto | assumption ]<br/>
 
1076
&nbsp;| discriminate H<br/>
 
1077
&nbsp;| absurd ((p ?= q) <a href="Coq.Init.Datatypes.html#Lt">Lt</a> = <a href="Coq.Init.Datatypes.html#Eq">Eq</a>);<br/>
 
1078
&nbsp;&nbsp;&nbsp;&nbsp;[ elim (Pcompare_not_Eq p q); auto | assumption ]<br/>
 
1079
&nbsp;| rewrite (IHp q); auto<br/>
 
1080
&nbsp;| discriminate H<br/>
 
1081
&nbsp;| discriminate H<br/>
 
1082
&nbsp;| discriminate H ].<br/>
 
1083
<code class="keyword">Qed</code>.<br/>
 
1084
 
 
1085
<br/>
 
1086
<code class="keyword">Lemma</code> <a name="Pcompare_Gt_Lt"></a>Pcompare_Gt_Lt :<br/>
 
1087
&nbsp;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> -&gt; (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
&nbsp;[ induction  y as [y Hrecy| y Hrecy| ]<br/>
 
1091
&nbsp;| induction  y as [y Hrecy| y Hrecy| ]<br/>
 
1092
&nbsp;| induction  y as [y Hrecy| y Hrecy| ] ]; simpl in |- *; <br/>
 
1093
&nbsp;auto; discriminate || intros H; discriminate H.<br/>
 
1094
<code class="keyword">Qed</code>.<br/>
 
1095
 
 
1096
<br/>
 
1097
<code class="keyword">Lemma</code> <a name="Pcompare_Lt_Gt"></a>Pcompare_Lt_Gt :<br/>
 
1098
&nbsp;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> -&gt; (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
&nbsp;[ induction  y as [y Hrecy| y Hrecy| ]<br/>
 
1102
&nbsp;| induction  y as [y Hrecy| y Hrecy| ]<br/>
 
1103
&nbsp;| induction  y as [y Hrecy| y Hrecy| ] ]; simpl in |- *; <br/>
 
1104
&nbsp;auto; discriminate || intros H; discriminate H.<br/>
 
1105
<code class="keyword">Qed</code>.<br/>
 
1106
 
 
1107
<br/>
 
1108
<code class="keyword">Lemma</code> <a name="Pcompare_Lt_Lt"></a>Pcompare_Lt_Lt :<br/>
 
1109
&nbsp;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> -&gt; (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
&nbsp;simpl in |- *; auto; try discriminate; intro H2; elim (IHp q H2); <br/>
 
1113
&nbsp;auto; intros E; rewrite E; auto.<br/>
 
1114
<code class="keyword">Qed</code>.<br/>
 
1115
 
 
1116
<br/>
 
1117
<code class="keyword">Lemma</code> <a name="Pcompare_Gt_Gt"></a>Pcompare_Gt_Gt :<br/>
 
1118
&nbsp;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> -&gt; (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
&nbsp;simpl in |- *; auto; try discriminate; intro H2; elim (IHp q H2); <br/>
 
1122
&nbsp;auto; intros E; rewrite E; auto.<br/>
 
1123
<code class="keyword">Qed</code>.<br/>
 
1124
 
 
1125
<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/>
 
1130
 
 
1131
<br/>
 
1132
<code class="keyword">Ltac</code> ElimPcompare c1 c2 :=<br/>
 
1133
&nbsp;&nbsp;elim (<a href="Coq.NArith.BinPos.html#Dcompare">Dcompare</a> ((c1 ?= c2) <a href="Coq.Init.Datatypes.html#Eq">Eq</a>));<br/>
 
1134
&nbsp;&nbsp;&nbsp;[ idtac | let x := fresh "H" in<br/>
 
1135
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(intro x; case x; clear x) ].<br/>
 
1136
 
 
1137
<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/>
 
1141
 
 
1142
<br/>
 
1143
<code class="keyword">Lemma</code> <a name="Pcompare_antisym"></a>Pcompare_antisym :<br/>
 
1144
&nbsp;forall (p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>) (r:<a href="Coq.Init.Datatypes.html#comparison">comparison</a>),<br/>
 
1145
&nbsp;&nbsp;&nbsp;<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
&nbsp;[ destruct y as [p0| p0| ]<br/>
 
1149
&nbsp;| destruct y as [p0| p0| ]<br/>
 
1150
&nbsp;| destruct y as [p| p| ] ]; intro r;<br/>
 
1151
&nbsp;reflexivity ||<br/>
 
1152
&nbsp;&nbsp;&nbsp;(symmetry  in |- *; assumption) || discriminate H || simpl in |- *;<br/>
 
1153
&nbsp;apply IHp || (try rewrite IHp); try reflexivity.<br/>
 
1154
<code class="keyword">Qed</code>.<br/>
 
1155
 
 
1156
<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> -&gt; (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 &lt;- <a href="Coq.NArith.BinPos.html#Pcompare_antisym">Pcompare_antisym</a>; rewrite H; reflexivity.<br/>
 
1161
<code class="keyword">Qed</code>.<br/>
 
1162
 
 
1163
<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> -&gt; (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 &lt;- <a href="Coq.NArith.BinPos.html#Pcompare_antisym">Pcompare_antisym</a>; rewrite H; reflexivity.<br/>
 
1168
<code class="keyword">Qed</code>.<br/>
 
1169
 
 
1170
<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> -&gt; (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 &lt;- <a href="Coq.NArith.BinPos.html#Pcompare_antisym">Pcompare_antisym</a>; rewrite H; reflexivity.<br/>
 
1175
<code class="keyword">Qed</code>.<br/>
 
1176
 
 
1177
<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/>
 
1183
 
 
1184
<br/>
 
1185
</code>
 
1186
 
 
1187
<table width="100%"><tr class="doc"><td>
 
1188
Properties of subtraction on binary positive numbers 
 
1189
</td></tr></table>
 
1190
<code>
 
1191
 
 
1192
<br/>
 
1193
<code class="keyword">Lemma</code> <a name="double_eq_zero_inversion"></a>double_eq_zero_inversion :<br/>
 
1194
&nbsp;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> -&gt; 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/>
 
1198
 
 
1199
<br/>
 
1200
<code class="keyword">Lemma</code> <a name="double_plus_one_zero_discr"></a>double_plus_one_zero_discr :<br/>
 
1201
&nbsp;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 &lt;&gt; <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/>
 
1205
 
 
1206
<br/>
 
1207
<code class="keyword">Lemma</code> <a name="double_plus_one_eq_one_inversion"></a>double_plus_one_eq_one_inversion :<br/>
 
1208
&nbsp;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> -&gt; 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/>
 
1212
 
 
1213
<br/>
 
1214
<code class="keyword">Lemma</code> <a name="double_eq_one_discr"></a>double_eq_one_discr :<br/>
 
1215
&nbsp;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 &lt;&gt; <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/>
 
1219
 
 
1220
<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
&nbsp;[ simpl in |- *; rewrite IHp; simpl in |- *; trivial
 
1225
 | simpl in |- *; rewrite IHp; auto
 
1226
 | auto ].<br/>
 
1227
<code class="keyword">Qed</code>.<br/>
 
1228
 
 
1229
<br/>
 
1230
<code class="keyword">Lemma</code> <a name="ZL10"></a>ZL10 :<br/>
 
1231
&nbsp;forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>,<br/>
 
1232
&nbsp;&nbsp;&nbsp;<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> -&gt; <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
&nbsp;simpl in |- *; intro H; try discriminate H;<br/>
 
1236
&nbsp;[ 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
&nbsp;&nbsp;&nbsp;&nbsp;[ apply double_eq_one_discr | assumption ]<br/>
 
1238
&nbsp;| 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
&nbsp;&nbsp;&nbsp;&nbsp;[ apply double_plus_one_eq_one_inversion; assumption
 
1240
    | rewrite Heq; reflexivity ]<br/>
 
1241
&nbsp;| 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
&nbsp;&nbsp;&nbsp;&nbsp;[ apply double_plus_one_eq_one_inversion; assumption
 
1243
    | rewrite Heq; reflexivity ]<br/>
 
1244
&nbsp;| 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
&nbsp;&nbsp;&nbsp;&nbsp;[ apply double_eq_one_discr | assumption ]<br/>
 
1246
&nbsp;| destruct p; simpl in |- *;<br/>
 
1247
&nbsp;&nbsp;&nbsp;&nbsp;[ discriminate H | discriminate H | reflexivity ] ].<br/>
 
1248
<code class="keyword">Qed</code>.<br/>
 
1249
 
 
1250
<br/>
 
1251
</code>
 
1252
 
 
1253
<table width="100%"><tr class="doc"><td>
 
1254
Properties of subtraction valid only for x&gt;y 
 
1255
</td></tr></table>
 
1256
<code>
 
1257
 
 
1258
<br/>
 
1259
<code class="keyword">Lemma</code> <a name="Pminus_mask_Gt"></a>Pminus_mask_Gt :<br/>
 
1260
&nbsp;forall p q:<a href="Coq.NArith.BinPos.html#positive">positive</a>,<br/>
 
1261
&nbsp;&nbsp;&nbsp;(p ?= q) <a href="Coq.Init.Datatypes.html#Eq">Eq</a> = <a href="Coq.Init.Datatypes.html#Gt">Gt</a> -&gt;<br/>
 
1262
&nbsp;&nbsp;&nbsp;&nbsp;exists h : <a href="Coq.NArith.BinPos.html#positive">positive</a>,<br/>
 
1263
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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
&nbsp;simpl in |- *; intro H; try discriminate H.<br/>
 
1268
&nbsp;&nbsp;destruct (IHp q H) as [z [H4 [H6 H7]]]; exists (<a href="Coq.NArith.BinPos.html#xO">xO</a> z); split.<br/>
 
1269
&nbsp;&nbsp;&nbsp;&nbsp;rewrite H4; reflexivity.<br/>
 
1270
&nbsp;&nbsp;&nbsp;&nbsp;split.<br/>
 
1271
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;simpl in |- *; rewrite H6; reflexivity.<br/>
 
1272
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;right; clear H6; destruct (<a href="Coq.NArith.BinPos.html#ZL11">ZL11</a> z) as [H8| H8];<br/>
 
1273
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ rewrite H8; rewrite H8 in H4; rewrite <a href="Coq.NArith.BinPos.html#ZL10">ZL10</a>;<br/>
 
1274
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ reflexivity | assumption ]<br/>
 
1275
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| clear H4; destruct H7 as [H9| H9];<br/>
 
1276
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ absurd (z = <a href="Coq.NArith.BinPos.html#xH">xH</a>); assumption<br/>
 
1277
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| rewrite H9; clear H9; destruct z as [p0| p0| ];<br/>
 
1278
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ reflexivity | reflexivity | absurd (xH = xH); trivial ] ] ].<br/>
 
1279
&nbsp;&nbsp;case <a href="Coq.NArith.BinPos.html#Pcompare_Gt_Gt">Pcompare_Gt_Gt</a> with (1 := H);<br/>
 
1280
&nbsp;&nbsp;&nbsp;[ intros H3; elim (IHp q H3); intros z H4; exists (<a href="Coq.NArith.BinPos.html#xI">xI</a> z); elim H4;<br/>
 
1281
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;intros H5 H6; elim H6; intros H7 H8; split;<br/>
 
1282
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ simpl in |- *; rewrite H5; auto<br/>
 
1283
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| split;<br/>
 
1284
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ simpl in |- *; rewrite H7; trivial
 
1285
         | right;
 
1286
            change (Pdouble_mask (Pminus_mask p q) = IsPos (Ppred (xI z)))
 
1287
             in |- *; rewrite H5; auto ] ]<br/>
 
1288
&nbsp;&nbsp;&nbsp;| intros H3; exists <a href="Coq.NArith.BinPos.html#xH">xH</a>; rewrite H3; split;<br/>
 
1289
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ simpl in |- *; rewrite Pminus_mask_diag; auto | split; auto ] ].<br/>
 
1290
&nbsp;&nbsp;exists (<a href="Coq.NArith.BinPos.html#xO">xO</a> p); auto.<br/>
 
1291
&nbsp;&nbsp;destruct (IHp q) as [z [H4 [H6 H7]]].<br/>
 
1292
&nbsp;&nbsp;&nbsp;&nbsp;apply <a href="Coq.NArith.BinPos.html#Pcompare_Lt_Gt">Pcompare_Lt_Gt</a>; assumption.<br/>
 
1293
&nbsp;&nbsp;&nbsp;&nbsp;destruct (<a href="Coq.NArith.BinPos.html#ZL11">ZL11</a> z) as [vZ| ];<br/>
 
1294
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ exists <a href="Coq.NArith.BinPos.html#xH">xH</a>; split;<br/>
 
1295
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ rewrite <a href="Coq.NArith.BinPos.html#ZL10">ZL10</a>; [ reflexivity | rewrite vZ in H4; assumption ]<br/>
 
1296
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| split;<br/>
 
1297
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ simpl in |- *; rewrite Pplus_one_succ_r; rewrite &lt;- vZ;
 
1298
              rewrite H6; trivial
 
1299
           | auto ] ]<br/>
 
1300
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| 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
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ absurd (z = <a href="Coq.NArith.BinPos.html#xH">xH</a>); assumption<br/>
 
1302
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| split;<br/>
 
1303
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ rewrite H8; trivial<br/>
 
1304
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| split;<br/>
 
1305
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ simpl in |- *; rewrite <a href="Coq.NArith.BinPos.html#Pplus_carry_pred_eq_plus">Pplus_carry_pred_eq_plus</a>;<br/>
 
1306
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ rewrite H6; trivial | assumption ]<br/>
 
1307
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| right; rewrite H8; reflexivity ] ] ] ].<br/>
 
1308
&nbsp;&nbsp;destruct (IHp q H) as [z [H4 [H6 H7]]].<br/>
 
1309
&nbsp;&nbsp;exists (<a href="Coq.NArith.BinPos.html#xO">xO</a> z); split;<br/>
 
1310
&nbsp;&nbsp;&nbsp;[ rewrite H4; auto<br/>
 
1311
&nbsp;&nbsp;&nbsp;| split;<br/>
 
1312
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ simpl in |- *; rewrite H6; reflexivity<br/>
 
1313
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| right;<br/>
 
1314
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;change<br/>
 
1315
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<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
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;destruct (<a href="Coq.NArith.BinPos.html#ZL11">ZL11</a> z) as [H8| H8];<br/>
 
1318
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ rewrite H8; simpl in |- *;<br/>
 
1319
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ apply ZL10; rewrite &lt;- H8; assumption
 
1321
            | rewrite H9; reflexivity ]<br/>
 
1322
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| destruct H7 as [H9| H9];<br/>
 
1323
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ absurd (z = <a href="Coq.NArith.BinPos.html#xH">xH</a>); auto<br/>
 
1324
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| rewrite H9; destruct z as [p0| p0| ]; simpl in |- *;<br/>
 
1325
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ reflexivity<br/>
 
1326
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| reflexivity<br/>
 
1327
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| absurd (<a href="Coq.NArith.BinPos.html#xH">xH</a> = <a href="Coq.NArith.BinPos.html#xH">xH</a>); [ assumption | reflexivity ] ] ] ] ] ].<br/>
 
1328
&nbsp;&nbsp;exists (<a href="Coq.NArith.BinPos.html#Pdouble_minus_one">Pdouble_minus_one</a> p); split;<br/>
 
1329
&nbsp;&nbsp;&nbsp;[ reflexivity<br/>
 
1330
&nbsp;&nbsp;&nbsp;| clear IHp; split;<br/>
 
1331
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ destruct p; simpl in |- *;<br/>
 
1332
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ reflexivity
 
1333
         | rewrite Psucc_o_double_minus_one_eq_xO; reflexivity
 
1334
         | reflexivity ]<br/>
 
1335
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| destruct p; [ right | right | left ]; reflexivity ] ].<br/>
 
1336
<code class="keyword">Qed</code>.<br/>
 
1337
 
 
1338
<br/>
 
1339
<code class="keyword">Theorem</code> <a name="Pplus_minus"></a>Pplus_minus :<br/>
 
1340
&nbsp;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> -&gt; 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
&nbsp;intros H2 H3; elim H3; intros H4 H5; unfold Pminus in |- *; <br/>
 
1344
&nbsp;rewrite H2; exact H4.<br/>
 
1345
<code class="keyword">Qed</code>.<br/>
 
1346
</code>
 
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>
 
1348
</body>
 
1349
</html>
 
 
b'\\ No newline at end of file'