As you can probably tell, I’m back from my undeclared hiatus. I’ve got lots of stuff to talk about, and I’ll be starting with PyKoan, one small project I’ve been working on lately in my spare time.
A few weeks ago I stumbled upon an article in wikipedia, regarding a logic game. This game fascinated me, especially because of the “Godel Escher Bach” connection. Quoting from Wikipedia:
Zendo is a game of inductive logic designed by Kory Heath in which one player (the “Master”) creates a rule for structures (“koans”) to follow, and the other players (the “Students”) try to discover it by building and studying various koans which follow or break the rule. The first student to correctly state the rule wins.
As it happens I’m also taking a mathematical logic course this semester. Having read about the game, I wanted to write a similar computer game. Hence – PyKoan.
PyKoan is a game where the goal is to discover some logical rule, for example, “For each x holds x%2 == 0”. This rule is applied to a koan – a list of integers. An example koan that “has Buddha nature” (follows the rule) is [0,2,8]. One which doesn’t is [1].
To implement this idea, I wrote an implementation of an expression tree very similar to the one used in vial, but with a different implemented language. I also did some experimentation with the design. Since I’ve been talking a lot about expression trees without giving a full explanation, in a future post I’ll write about the implementation used in PyKoan.
So far I didn’t code a lot of the game, just the expression tree framework, and a simple rule builder. When using Python’s interactive prompt, one can get a taste of how the game might feel:
In [19]: r = rulegen.create_rule(rulegen.easy_grammer, rulegen.easy_grammer_start) In [20]: r.eval([]) Out[20]: False In [21]: r.eval([0]) Out[21]: False In [22]: r.eval([1]) Out[22]: False In [23]: r.eval([2]) Out[23]: True In [24]: r.eval([2,2]) Out[24]: True In [25]: r.eval([2,2,3]) Out[25]: True In [26]: r.eval([3]) Out[26]: False In [27]: r.eval([4]) Out[27]: False In [28]: print r x exists such that x == 2 |
Here is how I would generate such an expression manually:
In [3]: from exptree import exps In [4]: exps.Exists('x',exps.Eq('x',2)) Out[4]: exps.Exists(exps.Var(x), exps.Eq(exps.Var(x), exps.Imm(2))) In [5]: print _ x exists such that x == 2 |
The game has many interesting possibilities for research, for example, computer players. Other possibilities include “just” guessing koans (not the rule itself), creating interesting and playable rules, and so on. There’s a lot to do.
This time, instead of just publishing the (unfinished) code, I decided to do something different. I’ve opened a space in assembla, with public read access. I’m opening this project for participation: if you want to join then leave a comment, or send me an email.
(Since Assembla seems to be going through some connectivity issues right now, here’s a link to a copy).
Leave a Reply