worked example: eat-from-can

        use consume-reaction to open and then eat from a can
        current |state> => words-to-list |closed can and hungry>
        learn-state (*) #=> learn(|op: current>, |state>, |_self>)
        use |can opener> #=> learn-state consume-reaction(current |state>, |can opener> + |closed can>, |can opener> + |open can>)
        eat-from |can> #=> learn-state consume-reaction(current |state>, |open can> + |hungry>, |empty can> + |not hungry>)

        -- start without a can-opener:
        current |state>
            |closed can> + |hungry>

        -- trying to use a can opener doesn't change our state, since we don't have one:
        use |can opener>
            |closed can> + |hungry>
        -- let's add a can opener:
        current |state> +=> |can opener>
        -- now we can open our can:
        use |can opener>
            |can opener> + |hungry> + |open can>

        -- now we can eat from the open can:
        eat-from |can>
            |can opener> + |empty can> + |not hungry>

    source code:
        load eat-from-can.sw