#|
ACL2     !>(let*      ((foo     '(1     2     3     .      bar))
(alist  (list (cons 'bar foo))))
(%cdrs 7 foo alist))
(2 3 . BAR)
ACL2 !>
Seven   steps   forwards    gets   us  to  one   step   forward,
semi-circularly.

Glorious return to ACL2 game programming  (do you remember  last
time?)

ldbeth  asked  after  seeing  my #1=(1  2 3 .  #1#) wzard   game
structure whether I could represent circular lists without sharp
quote syntax. Well
(let   ((foo   '(1  2  3)))  (setf  (cdr   (last   foo))   foo))
but one of the As in ACL2 is Applicative,  so we don't have SETF
neither

so I have used an alist and not-true-listps  so when cdr returns
a     symbol     it     means     cdr-assoc      the      alist.
Since ACL2 enforces  single-threadedness,  I don't think there's
ever  a problem  except  for informality.   So  let's  add  some
formality. |#
(defun %cdrs (measure list alist)
(if (or (zp measure) (not (natp measure)))  list
(let ((next-measure  (- measure 1))
(next-list  (cdr (if (symbolp (cdr list))
(assoc (cdr list) alist)
list))))
(%cdrs next-measure next-list alist))))

;;;We  don't  have  to  worry  about  SETFability   since  we're
applicative.

;;;I'm figuring...  If it's a true list, %cdrs 1 is trivial  and
%cdrs n is (%cdrs (1- n) (%cdrs 1 list alist) alist) to get some
recursion going.

(defthm stepwise-nil-alist-%cdrs
(implies  (and (listp list) (equal alist nil) (equal n (length
list)))  (equal  (%cdrs  n list alist)  (%cdrs  1 (%cdrs  (1- n)
list alist) alist))))

;;;Since   we can reach  the end of a list  one step  at a  time
;;;can   we get from  what  I seem to have  called  (cons  b  e)
;;;to (cons e d) in the continuation alist?

(defthm last-cdr-symbol
(implies (and (symbolp  e) (equal list (append a (cons b e)))
(equal  alist (list (cons e d))))
(equal (%cdrs 1 (last list) alist) d)))

;;;So  we can mostly get through one im/proper  list, but can we
get to the next?

(defthm composite-%cdrs
(implies (and (listp a) (listp b) (not (null b)) (symbolp  foo)
(not (null foo)) (equal  list (append  a (cons whatever   foo)))
(equal alist (list (cons foo b))) (equal n (length  list)))
(equal (%cdrs n list alist) b)))

;;;There's    (always)   more  to  do  but  it  seems  like  our
faux-circularity is working. ;;;Oh that's actually equivalent to
the last one I guess.   Actually  all of them ;;;were   trivial.
#|
It took  me a while  to be able  to write  anything  at all acl2
would  accept  from me. Then I got back into the zone  of mostly
saying    trivial   things.    The   automated    prover    took
111      steps     for     the     admission      of      %cdrs,
2620 steps for STEPWISE-NIL-ALIST-%CDRS
1093 steps for LAST-CDR-SYMBOL
and
1778 for composite-%cdrs

I feel very efficient when my machine does thousands  of  things
for me.
|#