1
; Contributed by Alex Spiridonov, with helpful consulting from Robert Krug.
5
; Theorems from arithmetic/top-with-meta
9
(local (include-book "arithmetic/top-with-meta" :dir :system))
11
; Theorems about inequalities
12
(defthm /-inverts-order-1
19
(defthm /-inverts-order-2
26
(defthm /-inverts-weak-order
31
(not (< (/ x) (/ y)))))
33
; Theorems about equalities
35
(equal (equal (* x y) x)
41
(equal (equal (* x y) y)
47
(implies (and (acl2-numberp x)
49
(equal (equal (/ x) y)
52
; From rtl/rel5/arithmetic
53
; Originally written as (mod (binary-* k x) (binary-* y k)), but we write is
54
; this way because arithmetic-3 will rewrite (binary-* y k) to (binary-* k y).
55
(defthm mod-cancel-special-1-ext
56
(implies (if (acl2-numberp x)
59
(if (not (equal y '0))
65
(equal (mod (binary-* k x) (binary-* k y))
66
(binary-* k (mod x y)))))
74
(local (include-book "ihs/ihs-definitions" :dir :system))
75
(local (include-book "ihs/ihs-lemmas" :dir :system))
76
(local (minimal-ihs-theory))
78
(defthm integerp-i/j-integerp-forward
80
(and (integerp (/ i j))
89
(and (integerp (/ i j))
90
(force (real/rationalp i))
92
(force (not (equal 0 j))))
97
(and (integerp (* (/ j) i))
98
(force (real/rationalp i))
100
(force (not (equal 0 j))))
103
(defthm justify-floor-recursion-ext
105
(and (force (real/rationalp x))
106
(force (real/rationalp y))
107
(force (not (equal 0 y))))
116
(< x (floor x y))))))
119
; Alternative: mod-x-y-=-x+y from IHS
120
(defthm mod-x-y-=-x-+-y-ext
121
(implies (and (rationalp x)
129
(equal (mod x y) (+ x y)))
130
:rule-classes ((:rewrite :backchain-limit-lst 0)
133
(implies (and (rationalp x)
136
(equal (equal (mod x y) (+ x y))
149
(force (real/rationalp x)))
150
(equal (mod x (* i j))
151
(+ (mod x i) (* i (mod (floor x i) j))))))
153
(defthm floor-x+i*k-i*j
155
(and (force (real/rationalp x))
163
(equal (floor (+ x (* i k)) (* i j))
166
(defthm mod-x+i*k-i*j
168
(and (force (real/rationalp x))
176
(equal (mod (+ x (* i k)) (* i j))
177
(+ x (* i (mod k j))))))
181
; An encapsulate for rtl/rel6/arithmetic.
185
(local (include-book "rtl/rel6/arithmetic/top" :dir :system))
187
(defthm x*/y=1->x=y-ext
188
(implies (and (rationalp x)
192
(equal (equal (* x (/ y)) 1)
196
(defthm ratio-theory-of-1-f
197
(implies (and (real/rationalp x)
203
:rule-classes :linear)
206
(defthm x*y>1-positive-stronger
207
(implies (and (or (and (< 1 x)
214
:rule-classes (:linear :rewrite))
218
(implies (and (real/rationalp x)
220
(not (integerp (/ x))))
221
:rule-classes :type-prescription)
224
(implies (rationalp x)
225
(equal (integerp (* 1/2 (mod x 2)))
226
(integerp (* 1/2 x)))))
228
(defthm mod-1-integerp
229
(implies (case-split (acl2-numberp x))
230
(equal (integerp (mod x 1))
234
(implies (and (rationalp m)
237
(equal (mod (* k m) (* k n))
241
(equal (mod (* a n) n)
244
(defthm mod-when-y-is-complex-rationalp
245
(implies (complex-rationalp y)
247
(if (not (complex-rationalp x))
249
(if (not (rationalp (/ x y)))
251
(if (integerp (/ x y))
253
(+ x (* -1 y (floor (* x (/ y)) 1)))
256
(defthm mod-when-y-is-an-inverse
257
(implies (and (integerp (/ y))
264
(defthm rationalp-mod-ext
265
(implies (case-split (rationalp x))
266
(rationalp (mod x y)))
267
:rule-classes (:rewrite :type-prescription))
269
(defthm mod-integerp-when-y-is-power-of-2
270
(implies (integerp x)
271
(integerp (mod x (expt 2 i))))
272
:rule-classes (:rewrite :type-prescription))
275
(implies (and (case-split (natp k))
276
(case-split (natp n)))
277
(equal (mod (mod x (* k n)) n)
281
(implies (and (rationalp a)
284
(equal (mod (+ a (mod b n)) n)
288
(implies (and (rationalp a)
291
(equal (mod (+ (mod a n) (mod b n)) n)
295
(implies (and (case-split (rationalp a))
296
(case-split (rationalp b))
298
(equal (mod (- a (mod b n)) n)
301
(defthm mod-does-nothing
302
(implies (and (< m n)
304
(case-split (rationalp m)))
309
(implies (and (<= 0 m)
310
(case-split (rationalp m))
313
:rule-classes :linear)
315
(defthm mod-sums-cancel-1
316
(implies (and (case-split (<= 0 y))
317
(case-split (rationalp k))
318
(case-split (rationalp y))
319
(case-split (rationalp x1))
320
(case-split (rationalp x2)))
321
(equal (equal (mod (+ k x1) y) (mod (+ k x2) y))
322
(equal (mod x1 y) (mod x2 y)))))
324
; We write (mod (+ k x) y) rather than (mod (+ x k) y); otherwise it ;
325
; gets re-written by |(+ x y)|
326
(defthm mod-sums-cancel-5-ext
327
(implies (and (case-split (<= 0 y))
328
(case-split (rationalp k))
329
(case-split (rationalp y))
330
(case-split (rationalp x)))
331
(equal (equal (mod k y) (mod (+ k x) y))
332
(equal 0 (mod x y)))))
334
(defthm mod-mod-2-thm
335
(implies (and (<= y1 y2)
336
(case-split (< 0 y1))
337
(case-split (acl2-numberp x))
338
(case-split (rationalp y1))
339
(case-split (rationalp y2))
340
(case-split (not (equal y1 0))))
341
(equal (mod (mod x y1) y2)
344
(defthm mod-mod-2-not-equal-ext
345
(implies (acl2-numberp m)
346
(not (equal (mod m 2) (mod (1+ m) 2))))
347
:hints (("Goal" :use ((:instance mod-mod-2-not-equal)))))
349
(defthm mod-quotient-integerp
350
(implies (and (integerp (* y k))
354
(equal (integerp (* k (mod x y)))
355
(integerp (* k x)))))
357
(defthm mod-1-sum-integer
358
(implies (and (rationalp x)
360
(equal (integerp (+ x (mod y 1)))
361
(integerp (+ x y)))))
364
(implies (and (integerp (/ y1 y2))
365
(case-split (not (equal y2 0)))
366
(case-split (rationalp y1))
367
(case-split (rationalp y2)))
368
(equal (mod (mod x y1) y2)
371
(defthm mod-sum-elim-second
372
(implies (and (case-split (not (complex-rationalp x1)))
373
(case-split (not (complex-rationalp x2)))
375
(equal (mod (+ x1 (mod x2 y)) y)
378
(defthm mod-sum-elim-second-gen
379
(implies (and (integerp (/ y2 y))
380
(case-split (not (complex-rationalp x1)))
381
(case-split (not (complex-rationalp x2)))
382
(case-split (not (equal y 0)))
383
(case-split (rationalp y))
385
(equal (mod (+ x1 (mod x2 y2)) y)
388
(defthm mod-sum-elim-both
389
(implies (and (case-split (not (complex-rationalp a)))
390
(case-split (not (complex-rationalp b)))
392
(equal (mod (+ (mod a y) (mod b y)) y)
395
(defthm mod-drop-irrelevant-first-term
396
(implies (and (integerp (* k (/ y)))
397
(case-split (not (equal y 0)))
398
(case-split (rationalp y))
399
(case-split (not (complex-rationalp x)))
401
(equal (mod (+ k x) y)
405
(implies (and (integerp a)
406
(case-split (not (complex-rationalp x)))
407
(case-split (not (complex-rationalp y)))
409
(equal (mod (+ x (* a y)) y)
412
(defthm mod-complex-rationalp-rewrite
413
(implies (case-split (rationalp y))
414
(equal (complex-rationalp (mod x y))
415
(complex-rationalp x))))
417
(defthm mod-upper-bound-less-tight-rewrite
418
(implies (and (case-split (< 0 y))
419
(case-split (not (complex-rationalp x)))
420
(case-split (not (complex-rationalp y)))
424
(defthm mod-upper-bound-3
425
(implies (and (<= y z)
427
(case-split (not (complex-rationalp x)))
428
(case-split (not (complex-rationalp y)))
432
(defthm mod-non-negative-linear
433
(implies (and (case-split (< 0 y))
434
(case-split (not (complex-rationalp x)))
435
(case-split (not (complex-rationalp y)))
438
:rule-classes ((:linear :trigger-terms ((mod x y)))))
440
(defthm mod-integerp-2
441
(implies (and (integerp y)
442
(case-split (acl2-numberp x)))
443
(equal (integerp (mod x y))
446
(defthm mod-rational-when-y-is-rational-rewrite
447
(implies (and (rationalp y)
448
(case-split (acl2-numberp x)))
449
(equal (rationalp (mod x y))
452
(defthm mod-force-equal-ext ; rule-classes nil
453
(implies (and (< (abs (- a b)) n)
457
(iff (equal (mod a n) (mod b n))
459
:hints (("Goal" :use ((:instance mod-force-equal)))))
461
(defthm mod-equal-int-ext ; rule-classes nil
462
(implies (and (equal (mod a n) (mod b n))
465
;(integerp (/ (- a b) n)))
466
; arithmetic-3 rewrites the above line to this one
467
(integerp (+ (* a (/ n)) (- (* b (/ n))))))
468
:hints (("Goal" :use ((:instance mod-equal-int)))))
470
(defthm mod-equal-int-reverse-ext ; rule-classes nil
471
(implies (and ; (integerp (/ (- a b) n))
472
; arithmetic-3 rewrites the above line to this one
473
(integerp (+ (* a (/ n)) (- (* b (/ n)))))
478
(equal (mod a n) (mod b n)))
479
:hints (("Goal" :use ((:instance mod-equal-int-reverse)))))
482
(implies (and (rationalp x)
483
(integerp (* 1/2 x)))
484
(and (integerp (- x 1))
485
(not (integerp (* 1/2 (- x 1)))))))
487
(defthm expt-2-is-not-odd
488
(implies (and (evenp x)
491
(equal (equal (expt 2 i)
495
(defthm expt2-integer
496
(implies (case-split (integerp i))
497
(equal (integerp (expt 2 i))
500
(defthm expt-bigger-than-i
501
(implies (integerp i)
504
(defthm expt2-inverse-integer
505
(implies (case-split (integerp i))
506
(equal (integerp (/ (expt 2 i)))
510
(implies (and (integerp i1)
512
(equal (equal (expt 2 i1) (expt 2 i2))
515
(defthm expt-between-one-and-two
516
(implies (and (<= 1 (expt 2 i))
518
(equal (expt 2 i) 1)))
520
(defthm expt-prod-integer-3-terms-2-ext
521
(implies (and (<= (+ j l) i)
526
(integerp (* (expt 2 i) (/ (expt 2 j)) (/ (expt 2 l))))))
528
(defthm complex-rationalp-prod
529
(implies (and (rationalp k)
530
(case-split (not (equal k 0)))
532
(and (equal (complex-rationalp (* k x))
533
(complex-rationalp x))
534
(equal (complex-rationalp (* x k))
535
(complex-rationalp x)))))
537
(defthm product-greater-than-zero-ext
538
(implies (or (case-split (not (complex-rationalp x)))
539
(case-split (not (complex-rationalp y))))
541
(or (and (< 0 x) (< 0 y))
542
(and (< y 0) (< x 0))))))
544
(defthm product-less-than-zero
545
(implies (case-split (or (not (complex-rationalp x))
546
(not (complex-rationalp y))))
552
(if (not (acl2-numberp x))
556
(defthm quotient-not-integerp
557
(implies (and (< i j)
562
(case-split (rationalp j)))
563
(not (integerp (/ i j)))))
565
(defthm rationalp-product-when-one-arg-is-rational
566
(implies (and (rationalp x)
567
(case-split (not (equal x 0)))
568
(case-split (acl2-numberp y))
570
(and (equal (rationalp (* x y))
572
(equal (rationalp (* y x))
575
(defthm rationalp-sum-when-one-arg-is-rational
576
(implies (and (rationalp x)
577
(case-split (acl2-numberp y)))
578
(and (equal (rationalp (+ x y))
580
(equal (rationalp (+ y x))
583
(defthm rationalp-unary-divide
584
(implies (case-split (acl2-numberp x))
585
(equal (rationalp (/ x))
588
(defthm complex-rationalp-+-when-second-term-is-not-complex
589
(implies (not (complex-rationalp y))
590
(equal (complex-rationalp (+ x y))
591
(complex-rationalp x))))
593
(defthm complex-rationalp-+-when-first-term-is-not-complex
594
(implies (not (complex-rationalp x))
595
(equal (complex-rationalp (+ x y))
596
(complex-rationalp y))))
598
(defthm fraction-less-than-1
599
(implies (and (< (abs m) (abs n))
605
(defthm floor-with-i-not-rational
606
(implies (not (rationalp i))
608
(if (and (complex-rationalp i) (complex-rationalp j) (rationalp (/ i j)))
612
(defthm floor-with-j-not-rational
613
(implies (not (rationalp j))
615
(if (and (complex-rationalp i) (complex-rationalp j) (rationalp (/ i j)))
619
(defthm floor-of-rational-and-complex
620
(implies (and (rationalp i)
622
(case-split (acl2-numberp j)))
623
(and (equal (floor i j)
628
(defthm floor-when-arg-quotient-isnt-rational
629
(implies (not (rationalp (* i (/ j))))
630
(equal (floor i j) 0)))
632
(defthm floor-non-negative-integerp-type-prescription
633
(implies (and (<= 0 i)
635
(case-split (not (complex-rationalp j)))
637
(and (<= 0 (floor i j))
638
(integerp (floor i j))))
639
:rule-classes (:type-prescription))
641
(defthm floor-non-negative
642
(implies (and (<= 0 i)
644
(case-split (not (complex-rationalp i)))
648
(defthm floor-equal-i-over-j-rewrite
649
(implies (and (case-split (not (equal j 0)))
650
(case-split (rationalp i))
651
(case-split (rationalp j))
653
(equal (equal (* j (floor i j)) i)
654
(integerp (* i (/ j))))))
656
(defthm integerp-sum-of-odds-over-2
657
(implies (and (rationalp x)
662
(equal (integerp (+ x y))
663
(and (integerp (* 2 y))
668
(implies (and (< m (+ (* a n) r))
671
(case-split (rationalp m))
672
(case-split (rationalp n))
675
:rule-classes :linear)
678
(defthm mod-force-ext
679
(implies (and (<= (* a n) m)
685
(= (mod m n) (- m (* a n))))
686
:hints (("Goal" :use ((:instance mod-force)))))
688
(defthm mod-equal-0-ext
689
(implies (and (case-split (rationalp y))
690
(case-split (not (equal y 0))))
691
(equal (equal (mod x y) 0)
692
(integerp (* (/ y) x))))
693
:hints (("Goal" :in-theory (enable mod-equal-0))))
695
(defthm mod-integerp-2-2
696
(implies (and (integerp y)
698
(integerp (mod x (/ y)))))
700
(local (include-book "rtl/rel6/arithmetic/extra-rules" :dir :system)) ; for exp-invert
702
(defthm exp-invert-ext
703
(implies (and (integerp n)
705
(<= (/ (- 1 (expt 2 n)))
706
(1+ (expt 2 (1+ n)))))
707
:hints (("Goal" :use ((:instance exp-invert)))))
709
(defthm mod-integerp-when-y-is-an-inverse
710
(implies (and (integerp (/ y))
712
(integerp (mod x y))))
714
#| ; expensive: more than doubles execution time!
716
(implies (and (rationalp x)
717
(integerp (* 2 x x)))
719
:hints (("Goal" :use ((:instance x-2xx)))))
727
(local (include-book "arithmetic-2/meta/expt" :dir :system))
728
(local (include-book "arithmetic-2/meta/integerp" :dir :system))
730
(defthm expt-1-linear-b
731
(implies (and (<= 0 x)
737
:rule-classes :linear)
739
(defthm expt-1-linear-d
740
(implies (and (<= 0 x)
746
:rule-classes :linear)
748
(defthm expt-1-linear-h
749
(implies (and (< 0 x)
755
:rule-classes :linear)
757
(defthm nintegerp-expt
758
(implies (and (real/rationalp x)
762
(not (integerp (expt x n))))
763
:hints (("Goal" :use nintegerp-expt-helper))
764
:rule-classes :type-prescription)
772
; Expensive: adds ~9 seconds to test suite. Gain: 1.
773
(local (include-book "arithmetic-3/bind-free/top" :dir :system))
774
(local (include-book "arithmetic-3/floor-mod/floor-mod" :dir :system))
776
(defthm mod-x-y-=-x---y
777
(implies (and (and (rationalp x)
785
(equal (mod x y) (- x y)))
786
:hints ((nonlinearp-default-hint stable-under-simplificationp hist pspv))
787
:rule-classes ((:rewrite :backchain-limit-lst 0)
790
(implies (and (rationalp x)
793
(equal (equal (mod x y) (- x y))