#| Copyright (C) 1994 by John Cowles. All Rights Reserved. This script is hereby placed in the public domain, and therefore unlimited editing and redistribution is permitted. NO WARRANTY John Cowles PROVIDES ABSOLUTELY NO WARRANTY. THE EVENT SCRIPT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SCRIPT IS WITH YOU. SHOULD THE SCRIPT PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. IN NO EVENT WILL John Cowles BE LIABLE TO YOU FOR ANY DAMAGES, ANY LOST PROFITS, LOST MONIES, OR OTHER SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THIS SCRIPT (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY THIRD PARTIES), EVEN IF YOU HAVE ADVISED US OF THE POSSIBILITY OF SUCH DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY.'' |# (NOTE-LIB "proveall" T) ; Sums of the Fibonacci Numbers ; by John R. Cowles ; Computer Science Department ; University of Wyoming ; Laramie, Wyoming 82071 ; This file naturally belongs over in the cowles subdirectory ; rather than in the basic subdirectory, but we put it here because ; it depends upon proveall, proveall is long, and we choose not ; to put operating system/directory syntax information into these files. ; This event list contains several interesting theorems ; about the Fibonacci numbers such as ; The SUM, from k=0 to k=n, of fib( k ) = fib( n+2 ) - 1. ; ; The SUM, from k=0 to k=n, of fib( 2*k+1 ) = fib( 2*n+2 ). ; Here fib( i ) is the ith Fibonacci number. (DEFN FIB ( N ) ; Compute the N'th Fibonacci number (IF (ZEROP N) 0 (IF (EQUAL N 1) 1 (PLUS (FIB (SUB1 N)) (FIB (SUB1 (SUB1 N))) )))) (DEFN NBR-CALLS-FIB ( N ) ; Compute number of calls to FIB used to compute (FIB N) (IF (ZEROP N) 1 (IF (EQUAL N 1) 1 (ADD1 (PLUS (NBR-CALLS-FIB (SUB1 N)) (NBR-CALLS-FIB (SUB1 (SUB1 N))) ))))) (DEFN NBR-PLUS-FIB ( N ) ; Compute number of additions used to compute (FIB N) (IF (ZEROP N) 0 (IF (EQUAL N 1) 0 (ADD1 (PLUS (NBR-PLUS-FIB (SUB1 N)) (NBR-PLUS-FIB (SUB1 (SUB1 N))) ))))) (PROVE-LEMMA NBR-CALLS-FIB&FIB NIL (EQUAL (ADD1 (NBR-CALLS-FIB N)) (TIMES 2 (FIB (ADD1 N))) )) (PROVE-LEMMA NBR-CALLS-FIB=FIB NIL (EQUAL (NBR-CALLS-FIB N) (SUB1 (TIMES 2 (FIB (ADD1 N)))) ) ; hint - The theorem prover can prove this ; lemma without the hint. However ; without the hint, the proof requires ; about 10 times the time and 5 times ; the space as the proofs of both the ; hint and this lemma using the hint. ( (USE (NBR-CALLS-FIB&FIB (N N)) ) )) (PROVE-LEMMA NBR-PLUS-FIB&FIB NIL (EQUAL (ADD1 (NBR-PLUS-FIB N)) (FIB (ADD1 N)) )) (PROVE-LEMMA NBR-PLUS-FIB=FIB ( REWRITE ) (EQUAL (NBR-PLUS-FIB N) (SUB1 (FIB (ADD1 N))) ) ; hint ( (USE (NBR-PLUS-FIB&FIB (N N)) ) )) (DEFN SUM-FIB ( N ) ; Compute the sum of the first N+1 Fibonacci nunbers (IF (ZEROP N) 0 (PLUS (SUM-FIB (SUB1 N)) (FIB N) ))) (PROVE-LEMMA SUM-FIB&FIB NIL (EQUAL (ADD1 (SUM-FIB N)) (FIB (ADD1 (ADD1 N))) )) (PROVE-LEMMA SUM-FIB=FIB ( REWRITE ) (EQUAL (SUM-FIB N) (SUB1 (FIB (ADD1 (ADD1 N)))) ) ; hint ( (USE (SUM-FIB&FIB (N N)) ) )) (PROVE-LEMMA SUM-FIB=NBR-PLUS-FIB NIL (EQUAL (SUM-FIB N) (NBR-PLUS-FIB (ADD1 N)) )) (DEFN SUM-FIB<2K> ( N ) ; Compute the sum of the first N+1 Fibonacci numbers ; which have even indices. (IF (ZEROP N) 0 (PLUS (SUM-FIB<2K> (SUB1 N)) (FIB (TIMES 2 N)) ))) (PROVE-LEMMA SUM-FIB<2K>&FIB NIL (EQUAL (ADD1 (SUM-FIB<2K> N)) (FIB (ADD1 (TIMES 2 N))) )) (PROVE-LEMMA SUM-FIB<2K>=FIB NIL (EQUAL (SUM-FIB<2K> N) (SUB1 (FIB (ADD1 (TIMES 2 N)))) ) ; hint ((USE (SUM-FIB<2K>&FIB (N N)) ) )) (DEFN SUM-FIB<2K+1> ( N ) ; Compute the sum of the first N+1 Fibonacci numbers ; which have odd indices (IF (ZEROP N) 1 (PLUS (SUM-FIB<2K+1> (SUB1 N)) (FIB (ADD1 (TIMES 2 N))) ))) (PROVE-LEMMA SUM-FIB<2K+1>=FIB NIL (EQUAL (SUM-FIB<2K+1> N) (FIB (ADD1 (ADD1 (TIMES 2 N)))) )) (DEFN SUM-FIB<3K> ( N ) ; Compute the sum of the first N+1 Fibonacci numbers ; which have indices divisible by 3 (IF (ZEROP N) 0 (PLUS (SUM-FIB<3K> (SUB1 N)) (FIB (TIMES 3 N)) ))) (PROVE-LEMMA SUM-FIB<3K>&FIB NIL (EQUAL (ADD1 (TIMES 2 (SUM-FIB<3K> N))) (FIB (ADD1 (ADD1 (TIMES 3 N)))) )) (PROVE-LEMMA SUM-FIB<3K>&FIB-1 NIL (EQUAL (TIMES 2 (SUM-FIB<3K> N)) (SUB1 (FIB (ADD1 (ADD1 (TIMES 3 N))))) ) ; hint ((USE (SUM-FIB<3K>&FIB (N N)) )) ) (PROVE-LEMMA SUM-FIB<3K>=FIB NIL (EQUAL (SUM-FIB<3K> N) (QUOTIENT (SUB1 (FIB (ADD1 (ADD1 (TIMES 3 N))))) 2 )) ; hint ((USE (SUM-FIB<3K>&FIB-1 (N N)) )) ) (DEFN SUM-FIB<3K+1> ( N ) ; Compute the sum of the first N+1 Fibonacci numbers ; which have indices congruent to 1 mod 3 (IF (ZEROP N) 1 (PLUS (SUM-FIB<3K+1> (SUB1 N)) (FIB (ADD1 (TIMES 3 N))) ))) (PROVE-LEMMA SUM-FIB<3K+1>&FIB NIL (EQUAL (TIMES 2 (SUM-FIB<3K+1> N)) (FIB (ADD1 (ADD1 (ADD1 (TIMES 3 N))))) )) (PROVE-LEMMA SUM-FIB<3K+1>=FIB NIL (EQUAL (SUM-FIB<3K+1> N) (QUOTIENT (FIB (ADD1 (ADD1 (ADD1 (TIMES 3 N))))) 2 )) ; hint ((USE (SUM-FIB<3K+1>&FIB (N N)))) ) (DEFN SUM-FIB<3K+2> ( N ) ; Compute the sum of the first N+1 Fibonacci numbers ; which have indices conguent to 2 mod 3 (IF (ZEROP N) 1 (PLUS (SUM-FIB<3K+2> (SUB1 N)) (FIB (ADD1 (ADD1 (TIMES 3 N)))) ))) (PROVE-LEMMA SUM-FIB<3K+2>&FIB NIL (EQUAL (ADD1 (TIMES 2 (SUM-FIB<3K+2> N))) (FIB (ADD1 (ADD1 (ADD1 (ADD1 (TIMES 3 N)))))) )) (PROVE-LEMMA SUM-FIB<3K+2>&FIB-1 NIL (EQUAL (TIMES 2 (SUM-FIB<3K+2> N)) (SUB1 (FIB (ADD1 (ADD1 (ADD1 (ADD1 (TIMES 3 N) )))))) ) ; hint ((USE (SUM-FIB<3K+2>&FIB (N N)))) ) (PROVE-LEMMA SUM-FIB<3K+2>=FIB NIL (EQUAL (SUM-FIB<3K+2> N) (QUOTIENT (SUB1 (FIB (ADD1 (ADD1 (ADD1 (ADD1 (TIMES 3 N) )))))) 2 )) ; hint ((USE (SUM-FIB<3K+2>&FIB-1 (N N)))) ) (PROVE-LEMMA FIB<2N+1>=FIB&FIB<2N+2>=FIB NIL (AND (EQUAL (FIB (ADD1 (TIMES 2 N))) (PLUS (TIMES (FIB N) (FIB N) ) (TIMES (FIB (ADD1 N)) (FIB (ADD1 N)) ))) (EQUAL (FIB (ADD1 (ADD1 (TIMES 2 N)))) (PLUS (TIMES (FIB N) (FIB (ADD1 N)) ) (TIMES (FIB (ADD1 N)) (FIB (ADD1 (ADD1 N))) )))) ; hint - The theorem prover can prove this lemma ; without the hint. The time for the proof ; without the hint is about 5 times the time ; required using the hint. ((INDUCT (SUM-FIB N))) ) (PROVE-LEMMA FIB<2N+1>=FIB NIL (EQUAL (FIB (ADD1 (TIMES 2 N))) (PLUS (TIMES (FIB N) (FIB N) ) (TIMES (FIB (ADD1 N)) (FIB (ADD1 N)) ))) ; hint ((USE (FIB<2N+1>=FIB&FIB<2N+2>=FIB (N N)))) ) (PROVE-LEMMA FIB<2N+2>=FIB NIL (EQUAL (FIB (ADD1 (ADD1 (TIMES 2 N)))) (PLUS (TIMES (FIB N) (FIB (ADD1 N)) ) (TIMES (FIB (ADD1 N)) (FIB (ADD1 (ADD1 N))) ))) ; hint ((USE (FIB<2N+1>=FIB&FIB<2N+2>=FIB (N N)))) ) (DEFN SUM-FIB<4K> ( N ) ; Compute the sum of the first N+1 Fibonacci numbers ; which have indices divisible by 4 (IF (ZEROP N) 0 (PLUS (SUM-FIB<4K> (SUB1 N)) (FIB (TIMES 4 N)) ))) (DEFN SUM-FIB<4K+1> ( N ) ; Compute the sum of the first N+1 Fibonacci numbers ; which have indices congruent to 1 mod 4 (IF (ZEROP N) 1 (PLUS (SUM-FIB<4K+1> (SUB1 N)) (FIB (ADD1 (TIMES 4 N))) ))) (DEFN SUM-FIB<4K+2> ( N ) ; Compute the sum of the first N+1 Fibonacci numbers ; which have indices congruent to 2 mod 4 (IF (ZEROP N) 1 (PLUS (SUM-FIB<4K+2> (SUB1 N)) (FIB (ADD1 (ADD1 (TIMES 4 N)))) ))) (DEFN SUM-FIB<4K+3> ( N ) ; Compute the sum of the first N+1 Fibonacci numbers ; which have indices congruent to 3 mod 4 (IF (ZEROP N) 2 (PLUS (SUM-FIB<4K+3> (SUB1 N)) (FIB (ADD1 (ADD1 (ADD1 (TIMES 4 N))))) ))) (PROVE-LEMMA TIMES-4=TIMES-2-2 ( REWRITE ) (EQUAL (TIMES 4 N) (TIMES 2 2 N) )) (PROVE-LEMMA FIB<4N+1>=FIB<2N> ( REWRITE ) (EQUAL (FIB (ADD1 (TIMES 4 N))) (PLUS (TIMES (FIB (TIMES 2 N)) (FIB (TIMES 2 N)) ) (TIMES (FIB (ADD1 (TIMES 2 N))) (FIB (ADD1 (TIMES 2 N))) ))) ; hint ((USE (FIB<2N+1>=FIB (N (TIMES 2 N))))) ) (PROVE-LEMMA SUM-FIB<4K+1>=FIB<2N> NIL (EQUAL (SUM-FIB<4K+1> N) (TIMES (FIB (ADD1 (TIMES 2 N))) (FIB (ADD1 (ADD1 (TIMES 2 N)))) )) ; hint ((DISABLE TIMES-4=TIMES-2-2)) ) (PROVE-LEMMA FIB<4N+2>=FIB<2N> ( REWRITE ) (EQUAL (FIB (ADD1 (ADD1 (TIMES 4 N)))) (PLUS (TIMES (FIB (TIMES 2 N)) (FIB (ADD1 (TIMES 2 N))) ) (TIMES (FIB (ADD1 (TIMES 2 N))) (FIB (ADD1 (ADD1 (TIMES 2 N)))) ))) ; hint ((USE (FIB<2N+2>=FIB (N (TIMES 2 N))))) ) (PROVE-LEMMA SUM-FIB<4K+2>=FIB<2N> NIL (EQUAL (SUM-FIB<4K+2> N) (TIMES (FIB (ADD1 (ADD1 (TIMES 2 N)))) (FIB (ADD1 (ADD1 (TIMES 2 N)))) )) ; hint ((DISABLE TIMES-4=TIMES-2-2)) ) (PROVE-LEMMA FIB<4N+3>=FIB<2N> ( REWRITE ) (EQUAL (FIB (ADD1 (ADD1 (ADD1 (TIMES 4 N))))) (PLUS (TIMES (FIB (ADD1 (TIMES 2 N))) (FIB (ADD1 (TIMES 2 N))) ) (TIMES (FIB (ADD1 (ADD1 (TIMES 2 N)))) (FIB (ADD1 (ADD1 (TIMES 2 N))))))) ; hint ((USE (FIB<2N+1>=FIB (N (ADD1 (TIMES 2 N)))))) ) (PROVE-LEMMA SUM-FIB<4K+3>=FIB<2N> NIL (EQUAL (SUM-FIB<4K+3> N) (TIMES (FIB (ADD1 (ADD1 (ADD1 (TIMES 2 N))))) (FIB (ADD1 (ADD1 (TIMES 2 N)))) )) ; hint ((DISABLE TIMES-4=TIMES-2-2)) ) (PROVE-LEMMA FIB<2N>=FIB NIL (IMPLIES (LESSP 0 N) (EQUAL (FIB (TIMES 2 N)) (PLUS (TIMES (FIB (SUB1 N)) (FIB N) ) (TIMES (FIB N) (FIB (ADD1 N)) )))) ; hint ((USE (FIB<2N+2>=FIB (N (SUB1 N))))) ) (PROVE-LEMMA FIB<4N>=FIB<2N> ( REWRITE ) (IMPLIES (LESSP 0 N) (EQUAL (FIB (TIMES 4 N)) (PLUS (TIMES (FIB (SUB1 (TIMES 2 N))) (FIB (TIMES 2 N)) ) (TIMES (FIB (TIMES 2 N)) (FIB (ADD1 (TIMES 2 N))) )))) ; hint ((USE (FIB<2N>=FIB (N (TIMES 2 N))))) ) (PROVE-LEMMA SUM-FIB<4K>=FIB<2N> NIL (EQUAL (SUM-FIB<4K> N) (TIMES (FIB (TIMES 2 N)) (FIB (ADD1 (ADD1 (TIMES 2 N)))) )) ; hint ((DISABLE TIMES-4=TIMES-2-2)) )