./../../src/wolfram.lsp

## assoc-list/wolfram [ Classes ]

[ Top ] [ assoc-list ] [ Classes ]

NAME

     rhythm

     File:             wolfram.lsp

     Class Hierarchy:  named-object -> linked-named-object -> sclist ->
                       circular-sclist -> assoc-list -> wolfram

     Version:          1.0.12

     Project:          slippery chicken (algorithmic composition)

     Purpose:          Implementation of the wolfram class for one-dimensional
                       binary cellular automata introduced by Stephen Wolfram in
                       1983. The rule number is the decimal representation of
                       the binary number indicated by the eight transition rules
                       (i.e. the results given the triplet test cases; see the
                       rules slot below).

     Author:           Michael Edwards: m@michael-edwards.org

     Creation date:    7th June 2017, Edinburgh

     $$ Last modified:  17:16:57 Mon Feb 10 2020 CET

     SVN ID: $Id: wolfram.lsp 6210 2017-04-07 11:42:29Z medward2 $

## wolfram/defwolfram [ Methods ]

[ Top ] [ wolfram ] [ Methods ]

DATE

     June 6th 2017, Edinburgh

DESCRIPTION

     Define your own Wolfram function to create an object with the flavour in
     the rules passed. See below for several examples.

     In addition, the name of the newly created function will be added to an
     internal list of all functions defined by this macro, so that (try-all) can
     be called (see below).

ARGUMENTS

     - the name of the function you're defining (symbol)
     - the list of rules

OPTIONAL ARGUMENTS

     - the default width (integer>0) for the Wolfram object that will be created
     - the default initial-state: 1 or 0.

RETURN VALUE

     the name of the function (symbol), just as with defun.

SYNOPSIS

    (defmacro defwolfram (fun rules &optional (w 100) (is 0))

## wolfram/generate [ Methods ]

[ Top ] [ wolfram ] [ Methods ]

DATE

     June 6th 2017, Edinburgh

DESCRIPTION

     Generate the cellular automata rows using the given rules. N.B. Each time
     this method is called, the results (data slot) of the previous calls are
     deleted.

ARGUMENTS

     - the wolfram object
     - the number of generations (rows) to generate

OPTIONAL ARGUMENTS

     <start> is the value of the middle cell of the first row (or just to the
     left of middle, if width is an even number). All cells to the left and
     right of it will be in <initial-state>. This should be 0 or 1 only.

RETURN VALUE

     The data slot, which will be the rows in the form of a list of
     named-objects containing the ID (starting from 1) and the list of cell
     values.

SYNOPSIS

    (defmethod generate ((w wolfram) generations &optional (start 1))

## wolfram/make-wolfram-r110 [ Functions ]

[ Top ] [ wolfram ] [ Functions ]

DATE

     June 7th 2017, Edinburgh.

DESCRIPTION

     #b01101110 = 110
     This is the one Wolfram suggests might be Turing complete. This was proved
     in 2000. "Rule 110, like the Game of Life, exhibits what Wolfram calls
     "Class 4 behavior", which is neither completely stable nor completely
     chaotic. Localized structures appear and interact in various
     complicated-looking ways" (https://en.wikipedia.org/wiki/Rule_110)

ARGUMENTS

     none required

OPTIONAL ARGUMENTS

     - the width of a row. Default = 100.
     - the initial state of the object. Default = 0.

RETURN VALUE

     the function name as a symbol but when called a wolfram object with the
     given rules.

EXAMPLE

    so this one only goes up to column 7 when called with width of 12:
          .
         ..
        ...
       .. .
      .....
     ..   .
    ...  ..
    . . ...
    ..... .
    .   ...
    .  .. .
    . .....
    ...   .
    . .  ..
    ... ...
    . ... .
    then the last 2 lines repeat

    but called with width of 60:
                                  .
                                 ..
                                ...
                               .. .
                              .....
                             ..   .
                            ...  ..
                           .. . ...
                          ....... .
                         ..     ...
                        ...    .. .
                       .. .   .....
                      .....  ..   .
                     ..   . ...  ..
                    ...  .... . ...
                   .. . ..  ..... .
                  ........ ..   ...
                 ..      ....  .. .
                ...     ..  . .....
               .. .    ... ....   .
              .....   .. ...  .  ..
             ..   .  ..... . .. ...
            ...  .. ..   ........ .
           .. . ......  ..      ...
          .......    . ...     .. .
         ..     .   .... .    .....
        ...    ..  ..  ...   ..   .
       .. .   ... ... .. .  ...  ..
      .....  .. ... ...... .. . ...
     ..   . ..... ...    ........ .
    ...  ....   ... .   ..      ...
    . . ..  .  .. ...  ...     .. .
    ...... .. ..... . .. .    .....
    .    ......   ........   ..   .
    .   ..    .  ..      .  ...  ..
    .  ...   .. ...     .. .. . ...
    . .. .  ..... .    .......... .
    ...... ..   ...   ..        ...
    .    ....  .. .  ...       .. .
    .   ..  . ..... .. .      .....
    .  ... ....   ......     ..   .
    . .. ...  .  ..    .    ...  ..
    ...... . .. ...   ..   .. . ...
    .    ........ .  ...  ....... .
    .   ..      ... .. . ..     ...
    .  ...     .. .........    .. .
    . .. .    .....       .   .....
    ......   ..   .      ..  ..   .
    .    .  ...  ..     ... ...  ..
    .   .. .. . ...    .. ... . ...
    .  .......... .   ..... ..... .
    . ..        ...  ..   ...   ...
    ....       .. . ...  .. .  .. .
    .  .      ....... . ..... .....
    . ..     ..     .....   ...   .
    |#
    (defwolfram make-wolfram-r110
        '(((1 1 1) 0) ((1 1 0) 1) ((1 0 1) 1) ((1 0 0) 0) ((0 1 1) 1)
          ((0 1 0) 1) ((0 0 1) 1) ((0 0 0) 0)))

## wolfram/make-wolfram-r126 [ Functions ]

[ Top ] [ wolfram ] [ Functions ]

DATE

     June 6th 2017, Edinburgh.

DESCRIPTION

     #b01111110 = 126

ARGUMENTS

     none required

OPTIONAL ARGUMENTS

     - the width of a row. Default = 100.
     - the initial state of the object. Default = 0.

RETURN VALUE

     the function name as a symbol but when called a wolfram object with the
     given rules.

EXAMPLE

    width: 12, initial-state: 0
          .
         ...
        .. ..
       .......
      ..     ..
     ....   ....
    ..  .. ..  .
    ............
    .          .
    ..        ..
    ...      ...
    . ..    .. .
    .....  .....
    .   ....   .
    .. ..  .. ..
    ............
    using 1, the following repeats but not forever
    ............

    .          .
    ..        ..
     ..      ..
    ....    ....
       ..  ..
    . ........ .
    ...      ...
      ..    ..
    .....  .....
        ....
    .  ..  ..  .

SYNOPSIS

    (defwolfram make-wolfram-r126
        '(((1 1 1) 0) ((1 1 0) 1) ((1 0 1) 1) ((1 0 0) 1) ((0 1 1) 1)
          ((0 1 0) 1) ((0 0 1) 1) ((0 0 0) 0)))

## wolfram/make-wolfram-r150 [ Functions ]

[ Top ] [ wolfram ] [ Functions ]

DATE

     June 7th 2017, Edinburgh.

DESCRIPTION

     #b10010110 = 150

ARGUMENTS

     none required

OPTIONAL ARGUMENTS

     - the width of a row. Default = 100.
     - the initial state of the object. Default = 0.

RETURN VALUE

     the function name as a symbol but when called a wolfram object with the
     given rules.

EXAMPLE

    width: 12, initial-state: 0
    non-repeating  but lovely patterns
          .
         ...
        . . .
       .. . ..
      .   .   .
     ... ... ...
    . .   .   .
    . .. ... ...
    .     .   .
    ..   ... ...
      . . .   .
     .. . .. ...
    .   .     .
    .. ...   ...
        . . . .
       .. . . ..
      .   . .
     ... .. ..
    . .       .
    . ..     ...
    .   .   . .
    .. ... .. ..
        .
       ...
      . . .
     .. . ..
    .   .   .
    .. ... ...
        .   . .
       ... .. ..
      . .
     .. ..
    .     .
    ..   ...
      . . . .
     .. . . ..
    .   . .   .
    .. .. .. ...
              .
             ...
            . .
           .. ..
          .
         ...
        . . .
       .. . ..
      .   .   .
     ... ... ...

SYNOPSIS

    (defwolfram make-wolfram-r150
        '(((1 1 1) 1) ((1 1 0) 0) ((1 0 1) 0) ((1 0 0) 1) ((0 1 1) 0)
          ((0 1 0) 1) ((0 0 1) 1) ((0 0 0) 0)))

## wolfram/make-wolfram-r151 [ Functions ]

[ Top ] [ wolfram ] [ Functions ]

DATE

     June 7th 2017, Edinburgh.

DESCRIPTION

     #b10010111 = 151

ARGUMENTS

     none required

OPTIONAL ARGUMENTS

     - the width of a row. Default = 100.
     - the initial state of the object. Default = 0.

RETURN VALUE

     the function name as a symbol but when called a wolfram object with the
     given rules.

EXAMPLE

          .
    ............
     ..........
    . ........ .
    .  ......  .
    ... .... ...
     .   ..   .
    .....  .....
     ... .. ...
    . .      . .
    . ........ .
    .  ......  .
    then the last 7 lines repeat
    |#
    (defwolfram make-wolfram-r151
        '(((1 1 1) 1) ((1 1 0) 0) ((1 0 1) 0) ((1 0 0) 1) ((0 1 1) 0)
          ((0 1 0) 1) ((0 0 1) 1) ((0 0 0) 1)))

## wolfram/make-wolfram-r159 [ Functions ]

[ Top ] [ wolfram ] [ Functions ]

DATE

     June 7th 2017, Edinburgh.

DESCRIPTION

     #b10011111 = 159

ARGUMENTS

     none required

OPTIONAL ARGUMENTS

     - the width of a row. Default = 100.
     - the initial state of the object. Default = 0.

RETURN VALUE

     the function name as a symbol but when called a wolfram object with the
     given rules.

EXAMPLE

          .
    ............
    ...........
    .......... .
    .........  .
    ........ ...
    .......  ..
    ...... ... .
    .....  ..  .
    .... ... ...
    ...  ..  ..
    .. ... ... .
    .  ..  ..  .
    then the last 4 lines repeat
    |#
    (defwolfram make-wolfram-r159
        '(((1 1 1) 1) ((1 1 0) 0) ((1 0 1) 0) ((1 0 0) 1) ((0 1 1) 1)
          ((0 1 0) 1) ((0 0 1) 1) ((0 0 0) 1)))

## wolfram/make-wolfram-r190 [ Functions ]

[ Top ] [ wolfram ] [ Functions ]

DATE

     June 6th 2017, Edinburgh.

DESCRIPTION

     #b10111110 = 190

ARGUMENTS

     none required

OPTIONAL ARGUMENTS

     - the width of a row. Default = 100.
     - the initial state of the object. Default = 0.

RETURN VALUE

     the function name as a symbol but when called a wolfram object with the
     given rules.

EXAMPLE

    width: 12, initial-state: 0
          .
         ...
        ... .
       ... ...
      ... ... .
     ... ... ...
    ... ... ...
    .. ... ... .
    . ... ... ..
    .... ... ..
    ... ... .. .
    .. ... .. ..
    . ... .. ..
    .... .. .. .
    ... .. .. ..
    .. .. .. ..
    . .. .. .. .
    then last three rows repeat

SYNOPSIS

    (defwolfram make-wolfram-r190
        '(((1 1 1) 1) ((1 1 0) 0) ((1 0 1) 1) ((1 0 0) 1) ((0 1 1) 1)
          ((0 1 0) 1) ((0 0 1) 1) ((0 0 0) 0)))

## wolfram/make-wolfram-r25 [ Functions ]

[ Top ] [ wolfram ] [ Functions ]

DATE

     June 6th 2017, Edinburgh.

DESCRIPTION

     #b00011001 = 25

ARGUMENTS

     none required

OPTIONAL ARGUMENTS

     - the width of a row. Default = 100.
     - the initial state of the object. Default = 0.

RETURN VALUE

     the function name as a symbol but when called a wolfram object with the
     given rules.

EXAMPLE

    width: 12, initial-state: 0
          .
    .....  .....
    .    . .
     ...    ....
     .  ... .
      . .    ...
    .    ... .
     ... .    ..
     .    ... .
      ... .    .
    . .    ...
       ... .  ..
    .. .    . .
    .   ...    .
     .. .  ...
     .   . .  ..
      ..    . .
    . . ...    .
        .  ...
    ...  . .  ..
    .  .    . .
     .  ...    .
      . .  ...
    .    . .  ..
     ...    . .
     .  ...    .
      . .  ...
    .    . .  ..
    then last four rows repeat

    also very nice starting with 0 instead of 1 (no obvious repeats):
    (generate w 100 0)
    ............
    .
     ...........
     .
      ..........
    . .
       .........
    .. .
    .   ........
     .. .
     .   .......
      .. .
    . .   ......
       .. .
    .. .   .....
    .   .. .
     .. .   ....
     .   .. .
      .. .   ...
    . .   .. .
       .. .   ..
    .. .   .. .
    .   .. .   .
     .. .   ..
     .   .. . ..
      .. .    .
    . .   ...  .
       .. .  .
    .. .   .  ..
    .   ..  . .
     .. . .    .
     .     ...
      .... .  ..
    . .     . .
       ....    .
    .. .   ...

SYNOPSIS

    (defwolfram make-wolfram-r25
        '(((1 1 1) 0) ((1 1 0) 0) ((1 0 1) 0) ((1 0 0) 1)
          ((0 1 1) 1) ((0 1 0) 0) ((0 0 1) 0) ((0 0 0) 1)))

## wolfram/make-wolfram-r30 [ Functions ]

[ Top ] [ wolfram ] [ Functions ]

DATE

     June 6th 2017, Edinburgh.

DESCRIPTION

     This is the default Wolfgram object: #b00011110 = 30

ARGUMENTS

     none required

OPTIONAL ARGUMENTS

     - the width of a row. Default = 100.
     - the initial state of the object. Default = 0.

RETURN VALUE

     the function name as a symbol but when called a wolfram object with the
     given rules.

EXAMPLE

    ;; so width: 12, initial-state: 0
    (let ((w (make-wolfram-r30 12 0)))
      (generate w 100)
      (print-matrix w :row-number nil :off "." :on 'X)
      (print-matrix w :row-number nil))
          .
         ...
        ..  .
       .. ....
      ..  .   .
     .. .... ...
    ..  .    .
    . ....  ...
    . .   ...  .
    . .. ..  ...
    . .  . ...
    . .... .  .
    . .    .....
    . ..  ..
    . . ... .
    . . .   ..
    . . .. .. .
    . . .  .  ..
    . . .......
    . . .      .
    . . ..    ..
    . . . .  ..
    . . . .... .
    . . . .    .
    . . . ..  ..
    . . . . ...
    . . . . .  .
    . . . . ....
    . . . . .
    . . . . ..
    . . . . . .
    . . . . . ..
    then last two rows repeat

SYNOPSIS

    (defwolfram make-wolfram-r30
        '(((1 1 1) 0) ((1 1 0) 0) ((1 0 1) 0) ((1 0 0) 1) ((0 1 1) 1)
          ((0 1 0) 1) ((0 0 1) 1) ((0 0 0) 0)))

## wolfram/make-wolfram-r62 [ Functions ]

[ Top ] [ wolfram ] [ Functions ]

DATE

     June 7th 2017, Edinburgh.

DESCRIPTION

     #b00111110 = 62

ARGUMENTS

     none required

OPTIONAL ARGUMENTS

     - the width of a row. Default = 100.
     - the initial state of the object. Default = 0.

RETURN VALUE

     the function name as a symbol but when called a wolfram object with the
     given rules.

EXAMPLE

          .
         ...
        ..  .
       .. ....
      .. ..   .
     .. .. . ...
    .. .. ....
    . .. ..   .
    ... .. . ...
    .  .. ....
    .... ..   .
    .   .. . ...
    .. .. ....
    . .. ..   .
    ... .. . ...
    .  .. ....
    then the last 6 lines repeat
    |#
    (defwolfram make-wolfram-r62
        '(((1 1 1) 0) ((1 1 0) 0) ((1 0 1) 1) ((1 0 0) 1) ((0 1 1) 1)
          ((0 1 0) 1) ((0 0 1) 1) ((0 0 0) 0)))

## wolfram/make-wolfram-r73 [ Functions ]

[ Top ] [ wolfram ] [ Functions ]

DATE

     June 8th 2017, Edinburgh.

DESCRIPTION

     #b01001001 = 73
     Suggested by Orestis Papadopoulos

ARGUMENTS

     none required

OPTIONAL ARGUMENTS

     - the width of a row. Default = 100.
     - the initial state of the object. Default = 0.

RETURN VALUE

     the function name as a symbol but when called a wolfram object with the
     given rules.

EXAMPLE

          .
    .....   ....
    .   . . .  .
      .
    .   ........
      . .      .
    .     ....
      ... .  . .
    . . .
          ......
    ..... .    .
    .   .   ..
      .   . .. .
    then the last 2 lines repeat
    |#
    (defwolfram make-wolfram-r73
        '(((1 1 1) 0) ((1 1 0) 1) ((1 0 1) 0) ((1 0 0) 0) ((0 1 1) 1)
          ((0 1 0) 0) ((0 0 1) 0) ((0 0 0) 1)))

## wolfram/make-wolfram-r82 [ Functions ]

[ Top ] [ wolfram ] [ Functions ]

DATE

     June 6th 2017, Edinburgh.

DESCRIPTION

     #b01010010 = 82

ARGUMENTS

     none required

OPTIONAL ARGUMENTS

     - the width of a row. Default = 100.
     - the initial state of the object. Default = 0.

RETURN VALUE

     the function name as a symbol but when called a wolfram object with the
     given rules.

EXAMPLE

    width: 12, initial-state: 0
    non-repeating  but lovely patterns
          .
         . .
        .   .
       . . . .
      .       .
     . .     . .
    .   .   .
     . . . . .
    .         .
     .       . .
    . .     .
       .   . .
      . . .   .
     .     . . .
    . .   .
       . . .
      .     .
     . .   . .
    .   . .   .
     . .   . . .
    .   . .
     . .   .
    .   . . .
     . .     .
    .   .   . .
     . . . .   .
    .       . .
     .     .   .
    . .   . . .
       . .     .
      .   .   .
     . . . . . .
    .
     .
    . .

SYNOPSIS

    (defwolfram make-wolfram-r82
        '(((1 1 1) 0) ((1 1 0) 1) ((1 0 1) 0) ((1 0 0) 1) ((0 1 1) 0)
          ((0 1 0) 0) ((0 0 1) 1) ((0 0 0) 0)))

## wolfram/make-wolfram-r93 [ Functions ]

[ Top ] [ wolfram ] [ Functions ]

DATE

     June 7th 2017, Edinburgh.

DESCRIPTION

     #b01011101 = 93

ARGUMENTS

     none required

OPTIONAL ARGUMENTS

     - the width of a row. Default = 100.
     - the initial state of the object. Default = 0.

RETURN VALUE

     the function name as a symbol but when called a wolfram object with the
     given rules.

EXAMPLE

          .
    ..... ......
    .   ...    .
    ... . .... .
    . .....  ...
    ...   .. . .
    . ... ......
    ... ...    .
    . ... .... .
    ... ...  ...
    . ... .. . .
    ... ........
    . ...      .
    ... ...... .
    . ...    ...
    ... .... . .
    . ...  .....
    ... .. .   .
    . ........ .
    ...      ...
    . ...... . .
    ...    .....
    . .... .   .
    ...  ..... .
    . .. .   ...
    ........ . .
    .      .....
    ...... .   .
    .    ..... .
    .... .   ...
    .  ..... . .
    .. .   .....
    ...... .   .
    .    ..... .
    then the last 5 lines repeat
    |#
    (defwolfram make-wolfram-r93
        '(((1 1 1) 0) ((1 1 0) 0) ((1 0 1) 0) ((1 0 0) 1) ((0 1 1) 1)
          ((0 1 0) 1) ((0 0 1) 0) ((0 0 0) 1)))

## wolfram/print-matrix [ Methods ]

[ Top ] [ wolfram ] [ Methods ]

DATE

     June 6th 2017, Edinburgh

DESCRIPTION

     Print the state of the cells to the terminal. On and off could
     theoretically be any object but of course single characters are
     clearest. See the defwolfram definitions below for examples.

ARGUMENTS

     - the wolfram object

OPTIONAL ARGUMENTS

     keyword arguments:
     - :stream. The stream to print to. Default t which means it prints to the
       terminal.
     - :on. what to print when a cell has the value 1. Default: the . character
     - :off. what to print when a cell has the value 0. Default: space
     - :row-number: whether to print row numbers. Default t.

RETURN VALUE

     T

SYNOPSIS

    (defmethod print-matrix ((w wolfram) &key (stream t) (on #\.) (off #\ )
                                           (row-number nil))

## wolfram/try-all [ Functions ]

[ Top ] [ wolfram ] [ Functions ]

DATE

     June 10th 2017, Edinburgh

DESCRIPTION

     Try all of the Wolfram rules defined via defwolfram. An instance of each
     rule set defined will be created, the rows will be generated, and
     print-matrix will be called. This allows you to see and compare the results
     of each rule set using the same parameters.

ARGUMENTS

     none required

OPTIONAL ARGUMENTS

     keyword arguments:
     :width. The width slot (number of columns) for the Wolfram objects. Any
     positive ingeger. Default = 100.
     :initial-state. The initial-state (i.e. default) slot for the Wolfram
     objects. 0 or 1. Default = 0.
     :start. The value of the middle cell of the first row. See generate method
     for more details. 0 or 1. Default = 1.
     :generations. The number of rows to generate. Any positive integer. Default
     = 30.
     :stream, :on, :off, :row-number: see print-matrix method.

RETURN VALUE

     T

SYNOPSIS

    (defun try-all (&key (width 100) (initial-state 0) (start 1) (generations 30)
                      (stream t) (on #\.) (off #\ ) (row-number nil))