So, we define a big grid using this python:

c = new_context("grid play") def ket_elt(j,i): return ket("grid: " + str(j) + " " + str(i)) # Makes use of the fact that context.learn() ignores rules that are the empty ket |>. def ket_elt_bd(j,i,I,J): # finite universe model: if i <= 0 or j <= 0 or i > I or j > J: return ket("",0) # torus model: # i = (i - 1)%I + 1 # j = (j - 1)%J + 1 return ket("grid: " + str(j) + " " + str(i)) def create_grid(c,I,J): c.learn("dim-1","grid",str(I)) c.learn("dim-2","grid",str(J)) for j in range(1,J+1): for i in range(1,I+1): elt = ket_elt(j,i) c.add_learn("elements","grid",elt) c.learn("N",elt,ket_elt_bd(j-1,i,I,J)) c.learn("NE",elt,ket_elt_bd(j-1,i+1,I,J)) c.learn("E",elt,ket_elt_bd(j,i+1,I,J)) c.learn("SE",elt,ket_elt_bd(j+1,i+1,I,J)) c.learn("S",elt,ket_elt_bd(j+1,i,I,J)) c.learn("SW",elt,ket_elt_bd(j+1,i-1,I,J)) c.learn("W",elt,ket_elt_bd(j,i-1,I,J)) c.learn("NW",elt,ket_elt_bd(j-1,i-1,I,J))And once we run this, we have example grid locations such as:

supported-ops |grid: 4 39> => |op: N> + |op: NE> + |op: E> + |op: SE> + |op: S> + |op: SW> + |op: W> + |op: NW> N |grid: 4 39> => |grid: 3 39> NE |grid: 4 39> => |grid: 3 40> E |grid: 4 39> => |grid: 4 40> SE |grid: 4 39> => |grid: 5 40> S |grid: 4 39> => |grid: 5 39> SW |grid: 4 39> => |grid: 5 38> W |grid: 4 39> => |grid: 4 38> NW |grid: 4 39> => |grid: 3 38> supported-ops |grid: 4 40> => |op: N> + |op: NE> + |op: E> + |op: SE> + |op: S> + |op: SW> + |op: W> + |op: NW> N |grid: 4 40> => |grid: 3 40> NE |grid: 4 40> => |grid: 3 41> E |grid: 4 40> => |grid: 4 41> SE |grid: 4 40> => |grid: 5 41> S |grid: 4 40> => |grid: 5 40> SW |grid: 4 40> => |grid: 5 39> W |grid: 4 40> => |grid: 4 39> NW |grid: 4 40> => |grid: 3 39>So, what is the point of this? Well, once you have a grid defined (or more generally, any topology of interest. eg for a mobile robot in a hospital you can map out the locations of corridors and walls), you can then associate objects with locations.

eg:

value |grid: 4 25> => |39>

building |grid: 30 22> => |building: hotel>

smell |grid: 5 7> => |smell: dead fish>

place |grid: 13 17> => |my place of work>

place |grid: 57 97> => |my home>

eg, "what is two steps north of the hotel?"

N N inverse-building |building: hotel>

eg, "what is seven steps SE of the dead fish smell?"

SE^7 inverse-smell |smell: dead fish>

And you can use it to update your knowledge of position (say when dead-reckoning):

|current location> => inverse-building |building: hotel>

I guess that is about it. This is a very powerful construct, and I don't mean just a grid topology, I mean for the case of more general topologies (eg a calendar!).

Update: Indeed, we can define a near current location too.

Something like:

-- and for other topologies, we define different near operators. sa: near |grid: *> #=> |_self> + N|_self> + NE|_self> + E|_self> + SE|_self> + S|_self> + SW|_self> + W|_self> + NW|_self> sa: building |grid: 4 40> => |building: cafe> sa: create inverse sa: current |location> => inverse-building |building: cafe> sa: near-current |location> => near inverse-building |building: cafe> -- now ask: sa: current |location> |grid: 4 40> sa: near-current |location> |grid: 4 40> + |grid: 3 40> + |grid: 3 41> + |grid: 4 41> + |grid: 5 41> + |grid: 5 40> + |grid: 5 39> + |grid: 4 39> + |grid: 3 39> -- alternatively, we can save a step: sa: near current |location> |grid: 4 40> + |grid: 3 40> + |grid: 3 41> + |grid: 4 41> + |grid: 5 41> + |grid: 5 40> + |grid: 5 39> + |grid: 4 39> + |grid: 3 39> -- "what is 13 steps NW of your current location?" NW^13 current |location>Neat!

Update: And we can easily enough define alias's for north and so on:

north |*> #=> N |_self> north-east |*> #=> NE |_self> east |*> #=> E |_self> south-east |*> #=> SE |_self> south |*> #=> S |_self> south-west |*> #=> SW|_self> west |*> #=> W |_self> north-west |*> #=> NW|_self>Update: an explanation about what I mean by a calendar topology. So, just like grid elements can be linked by north, south, east, west, and so on. A calendar has next-hour, previous-hour, tomorrow, yesterday, next-week, next-thursday, last-friday, etc. Then we build up a generic calendar, with time/date slots all linked by those operators, and then later you associate appointments, and so on with each calendar slot.

## No comments:

## Post a Comment