Re: [sl4] Rolf's gambit revisited

From: Matt Mahoney (matmahoney@yahoo.com)
Date: Tue Jan 13 2009 - 07:39:22 MST


--- On Mon, 1/12/09, Benja Fallenstein <benja.fallenstein@gmail.com> wrote:

> Hi Matt,
>
> On Mon, Jan 12, 2009 at 7:21 PM, Matt Mahoney
> <matmahoney@yahoo.com> wrote:
> > Perhaps you could write a simple program of two agents
> simulating each other and prove me wrong.
>
> Fair enough. Here goes.
>
> The following is a Python program of two agents, one
> guessing a number
> and the other one telling whether the guess is high or low,
> conducting
> a dialog by simulating each other. The program as given is
> the
> guesser; to get the verifier (which behaves the same way
> except that
> it prints "Running the verifier" instead of
> "Running the guesser" --
> but they have different main loops that just happen to do
> the same
> thing), change the last line from "exec guesser"
> to "exec verifier."
>
> =====
> verifier = '''
> guesserState = {'verifier':verifier,
> 'guesser':guesser, 'number':number}
> isFirstStep = True
>
> def stepVerifier():
> global verifierSays, isFirstStep
>
> if isFirstStep: exec guesser in guesserState;
> isFirstStep = False
> else: exec 'stepGuesser()' in guesserState
>
> if guesserState['guesserSays'] < number:
> verifierSays = "Too low."
> elif guesserState['guesserSays'] == number:
> verifierSays = "Correct!"
> else:
> verifierSays = "Too high."
>
> if __name__ == '__main__':
> print "Running the verifier!"
> while True:
> stepVerifier()
> print "Guess:",
> guesserState['guesserSays']
> print "->", verifierSays
> if verifierSays == "Correct!": break
> '''
>
> guesser = '''
> low = 1; high = 10
> verifierState = {'verifier':verifier,
> 'guesser':guesser, 'number':number}
> isFirstStep = True
>
> guesserSays = 5
>
> def stepGuesser():
> global low, high, guesserSays, isFirstStep
>
> if isFirstStep: exec verifier in verifierState;
> isFirstStep = False
> exec 'stepVerifier()' in verifierState
>
> if verifierState['verifierSays'] == "Too
> low.":
> low = guesserSays + 1
> elif verifierState['verifierSays'] == "Too
> high.":
> high = guesserSays - 1
>
> guesserSays = low + ((high-low) % 2)
>
>
> if __name__ == '__main__':
> print "Running the guesser!"
> while True:
> print "Guess:", guesserSays
> stepGuesser()
> print "->",
> verifierState['verifierSays']
> if verifierState['verifierSays'] ==
> "Correct!": break
> '''
>
> from random import choice
> number = choice(range(1,11))
> exec guesser
> =====
>
> Is this convincing, or do you see something in it that you
> don't think
> carries over to the situation under discussion?
>
> (It's possible to get rid of the exec on the outer
> level by turning
> this into a less magical quine-- compare to the difference
> between
>
> http://users.aims.ac.za/~mackay/python/quine/quine3.py
>
> and
>
> http://users.aims.ac.za/~mackay/python/quine/quine4a.py )
>
> Thanks,
> - Benja

You're right. I see how this program could be turned into a quine pair where each program knows the other's source code.

-- Matt Mahoney, matmahoney@yahoo.com



This archive was generated by hypermail 2.1.5 : Wed Jul 17 2013 - 04:01:03 MDT