#|

 Copyright (C) 1994 by Robert S. Boyer, J Strother Moore, and Mike Green.  All
 Rights Reserved.

 This script is hereby placed in the public domain, and therefore unlimited
 editing and redistribution is permitted.

 NO WARRANTY

 Robert S. Boyer, J Strother Moore, and Mike Green PROVIDE 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 Robert S. Boyer, J Strother Moore, or Mike Green 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 "fortran" T)
(COMPILE-UNCOMPILED-DEFNS "tmp")
(PROVE-LEMMA ZPLUS-COMM1 (REWRITE)
             (EQUAL (ZPLUS X Y)
                    (ZPLUS Y X)))
(PROVE-LEMMA ZPLUS-COMM2 (REWRITE)
             (EQUAL (ZPLUS X (ZPLUS Y Z))
                    (ZPLUS Y (ZPLUS X Z))))
(PROVE-LEMMA ZPLUS-ASSOC (REWRITE)
             (EQUAL (ZPLUS (ZPLUS X Y)
                           Z)
                    (ZPLUS X (ZPLUS Y Z))))
(DISABLE ZPLUS)
(ADD-SHELL VEHICLE-STATE NIL VEHICLE-STATEP ((W (NONE-OF)
                                                ZERO)
                                             (Y (NONE-OF)
                                                ZERO)
                                             (V (NONE-OF)
                                                ZERO)))
(DEFN HD (X)
  (CAR X))
(DEFN TL (X)
  (CDR X))
(DEFN EMPTY (X)
  (NOT (LISTP X)))
(PROVE-LEMMA TL-REWRITE (REWRITE)
             (EQUAL (TL X)
                    (CDR X)))
(DISABLE TL)
(PROVE-LEMMA DOWN-ON-TL (REWRITE)
             (IMPLIES (NOT (EMPTY X))
                      (LESSP (COUNT (TL X))
                             (COUNT X))))
(DEFN RANDOM-DELTA-WS (LST)
  (IF (EMPTY LST)
      T
      (AND (OR (EQUAL (HD LST)
                      -1)
               (EQUAL (HD LST)
                      0)
               (EQUAL (HD LST)
                      1))
           (RANDOM-DELTA-WS (TL LST)))))
(DEFN CONTROLLER (SGN-Y SGN-OLD-Y)
  (ZPLUS (ZTIMES -3 SGN-Y)
         (ZTIMES 2 SGN-OLD-Y)))
(DISABLE CONTROLLER)
(DEFN SGN (X)
  (IF (NEGATIVEP X)
      (IF (EQUAL (NEGATIVE-GUTS X)
                 0)
          0 -1)
      (IF (ZEROP X)
          0 1)))
(DISABLE SGN)
(DEFN
  NEXT-STATE
  (DELTA-W STATE)
  (VEHICLE-STATE
    (ZPLUS (W STATE)
           DELTA-W)
    (ZPLUS (Y STATE)
           (ZPLUS (V STATE)
                  (ZPLUS (W STATE)
                         DELTA-W)))
    (ZPLUS (V STATE)
           (CONTROLLER (SGN (ZPLUS (Y STATE)
                                   (ZPLUS (V STATE)
                                          (ZPLUS (W STATE)
                                                 DELTA-W))))
                       (SGN (Y STATE))))))
(DEFN FINAL-STATE-OF-VEHICLE (DELTA-WS STATE)
  (IF (EMPTY DELTA-WS)
      STATE
      (FINAL-STATE-OF-VEHICLE (TL DELTA-WS)
                              (NEXT-STATE (HD DELTA-WS)
                                          STATE))))
(DEFN
  GOOD-STATEP
  (STATE)
  (IF
    (EQUAL (Y STATE)
           0)
    (OR (EQUAL (ZPLUS (V STATE)
                      (W STATE))
               -1)
        (EQUAL (ZPLUS (V STATE)
                      (W STATE))
               0)
        (EQUAL (ZPLUS (V STATE)
                      (W STATE))
               1))
    (IF
      (EQUAL (Y STATE)
             1)
      (OR (EQUAL (ZPLUS (V STATE)
                        (W STATE))
                 -2)
          (EQUAL (ZPLUS (V STATE)
                        (W STATE))
                 -3))
      (IF
        (EQUAL (Y STATE)
               2)
        (OR (EQUAL (ZPLUS (V STATE)
                          (W STATE))
                   -1)
            (EQUAL (ZPLUS (V STATE)
                          (W STATE))
                   -2))
        (IF (EQUAL (Y STATE)
                   3)
            (EQUAL (ZPLUS (V STATE)
                          (W STATE))
                   -1)
            (IF (EQUAL (Y STATE)
                       -3)
                (EQUAL (ZPLUS (V STATE)
                              (W STATE))
                       1)
                (IF (EQUAL (Y STATE)
                           -2)
                    (OR (EQUAL (ZPLUS (V STATE)
                                      (W STATE))
                               1)
                        (EQUAL (ZPLUS (V STATE)
                                      (W STATE))
                               2))
                    (IF (EQUAL (Y STATE)
                               -1)
                        (OR (EQUAL (ZPLUS (V STATE)
                                          (W STATE))
                                   2)
                            (EQUAL (ZPLUS (V STATE)
                                          (W STATE))
                                   3))
                        F))))))))
(PROVE-LEMMA NEXT-GOOD-STATE (REWRITE)
             (IMPLIES (AND (GOOD-STATEP STATE)
                           (OR (EQUAL R -1)
                               (EQUAL R 0)
                               (EQUAL R 1)))
                      (GOOD-STATEP (NEXT-STATE R STATE))))
(DEFN ZERO-DELTA-WS (LST)
  (IF (EMPTY LST)
      T
      (AND (EQUAL (HD LST)
                  0)
           (ZERO-DELTA-WS (TL LST)))))
(DEFN CONCAT (X Y)
  (IF (EMPTY X)
      Y
      (CONS (HD X)
            (CONCAT (TL X)
                    Y))))
(DEFN LENGTH (X)
  (IF (EMPTY X) 0 (ADD1 (LENGTH (TL X)))))
(PROVE-LEMMA LENGTH-0 (REWRITE)
             (EQUAL (EQUAL (LENGTH X)
                           0)
                    (EMPTY X)))
(PROVE-LEMMA
  DECOMPOSE-LIST-OF-LENGTH-4
  (REWRITE)
  (IMPLIES (ZERO-DELTA-WS LST)
           (EQUAL (LESSP (LENGTH LST)
                         4)
                  (NOT (EQUAL LST (CONCAT (QUOTE (0 0 0 0))
                                          (CDDDDR LST)))))))
(PROVE-LEMMA DRIFT-TO-0-IN-4 (REWRITE)
             (IMPLIES
               (GOOD-STATEP STATE)
               (EQUAL (Y (FINAL-STATE-OF-VEHICLE
                           (QUOTE (0 0 0 0))
                           STATE))
                      0)))
(PROVE-LEMMA
  CANCEL-WIND-IN-4
  (REWRITE)
  (IMPLIES (GOOD-STATEP STATE)
           (EQUAL (ZPLUS (V (FINAL-STATE-OF-VEHICLE
                              (QUOTE (0 0 0 0))
                              STATE))
                         (W (FINAL-STATE-OF-VEHICLE
                              (QUOTE (0 0 0 0))
                              STATE)))
                  0)))
(PROVE-LEMMA
  ONCE-0-ALWAYS-0
  (REWRITE)
  (IMPLIES
    (AND (ZERO-DELTA-WS LST)
         (EQUAL (Y STATE)
                0)
         (EQUAL (ZPLUS (W STATE)
                       (V STATE))
                0))
    (AND (EQUAL (Y (FINAL-STATE-OF-VEHICLE LST STATE))
                0)
         (EQUAL (ZPLUS (V (FINAL-STATE-OF-VEHICLE LST STATE))
                       (W (FINAL-STATE-OF-VEHICLE LST STATE)))
                0))))
(PROVE-LEMMA FINAL-STATE-OF-VEHICLE-CONCAT (REWRITE)
             (EQUAL (FINAL-STATE-OF-VEHICLE (CONCAT A B)
                                            STATE)
                    (FINAL-STATE-OF-VEHICLE
                      B
                      (FINAL-STATE-OF-VEHICLE A STATE))))
(PROVE-LEMMA ZERO-DELTA-WS-CONCAT (REWRITE)
             (EQUAL (ZERO-DELTA-WS (CONCAT (QUOTE (0 0 0 0))
                                           V))
                    (ZERO-DELTA-WS V)))
(DISABLE CONCAT)
(DISABLE NEXT-STATE)
(PROVE-LEMMA GOOD-STATEP-BOUNDED-ABOVE (REWRITE)
             (IMPLIES (GOOD-STATEP STATE)
                      (NOT (ZLESSP 3 (Y STATE)))))
(PROVE-LEMMA GOOD-STATEP-BOUNDED-BELOW (REWRITE)
             (IMPLIES (GOOD-STATEP STATE)
                      (NOT (ZLESSP (Y STATE)
                                   -3))))
(DISABLE GOOD-STATEP)
(PROVE-LEMMA ZLESSP-IS-LESSP (REWRITE)
             (IMPLIES (AND (NUMBERP X)
                           (NUMBERP Y))
                      (EQUAL (ZLESSP X Y)
                             (LESSP X Y))))
(DISABLE ZLESSP)
(DEFN FSV (D S)
  (IF (EMPTY D)
      S
      (FSV (TL D)
           (NEXT-STATE (HD D)
                       S))))
(PROVE-LEMMA ALL-GOOD-STATES (REWRITE)
                       (IMPLIES (AND (RANDOM-DELTA-WS LST)
                                     (GOOD-STATEP STATE))
                                (GOOD-STATEP
                                  (FINAL-STATE-OF-VEHICLE LST STATE)))
                       ((INDUCT (FSV LST STATE))))
(PROVE-LEMMA VEHICLE-STAYS-WITHIN-3-OF-COURSE NIL
             (IMPLIES
               (AND (RANDOM-DELTA-WS LST)
                    (EQUAL STATE (FINAL-STATE-OF-VEHICLE
                                   LST
                                   (VEHICLE-STATE 0 0 0))))
               (AND (ZLESSEQP -3 (Y STATE))
                    (ZLESSEQP (Y STATE)
                              3))))
(DISABLE FINAL-STATE-OF-VEHICLE)
(PROVE-LEMMA ZERO-DELTA-WS-CDDDDR (REWRITE)
             (IMPLIES (ZERO-DELTA-WS X)
                      (ZERO-DELTA-WS (CDDDDR X))))
(PROVE-LEMMA GOOD-STATES-FIND-AND-STAY-AT-0 (REWRITE)
             (IMPLIES
               (AND (GOOD-STATEP STATE)
                    (ZERO-DELTA-WS LST2)
                    (NOT (LESSP (LENGTH LST2)
                                4)))
               (EQUAL (Y (FINAL-STATE-OF-VEHICLE LST2 STATE))
                      0)))
(PROVE-LEMMA VEHICLE-GETS-ON-COURSE-IN-STEADY-WIND NIL
             (IMPLIES
               (AND (RANDOM-DELTA-WS LST1)
                    (ZERO-DELTA-WS LST2)
                    (ZGREATEREQP (LENGTH LST2)
                                 4)
                    (EQUAL STATE (FINAL-STATE-OF-VEHICLE
                                   (CONCAT LST1 LST2)
                                   (VEHICLE-STATE 0 0 0))))
               (EQUAL (Y STATE)
                      0))
             NIL)
