'Implementing an aima-python agent

I am using aima-python to implement a covid cleaning agent, this agent will go to each square and spray. If there is a an object present in the cell it will still spray such as table, chair etc. However, if there is a person in the next cell the robot cannot cross paths with the cell and must avoid entering a cell with a human. I have implemented most of the code and I think the code does as described above, I am however getting a 'TypeError: 'chair' object is not callable'. I can't see why I would be getting this, this is the same for all object present in my environment. I would really appreciate some assistance with this issue.(This program runs on jupyter notebook)

from agents import *
from random import choice

class DisinfectingRobot(Agent):
    location = [0,1]
    direction = Direction("down")

    def moveforward(self, success=True):
        '''moveforward possible only if success (i.e. valid destination location)'''
        if not success:
            return
        if self.direction.direction == Direction.R:
            self.location[0] += 1
        elif self.direction.direction == Direction.L:
            self.location[0] -= 1
        elif self.direction.direction == Direction.D:
            self.location[1] += 1
        elif self.direction.direction == Direction.U:
            self.location[1] -= 1

    def turn(self, d):
        if isinstance(thing,person):
            self.direction = self.direction + d
            return True
        return False
    
    def spray(self, thing):
        '''returns True upon success or False otherwise'''
        if isinstance(thing, Food):
            return True
        return False

    def program(percepts):
        '''Returns an action based on it's percepts'''
    
        for p in percepts: 
            if isinstance(p, chair):
                return 'spray'
            elif isinstance(p, table):
                return 'spray'
            elif isinstance(p,person):
                turn = False
                choice = random.choice((1,2))
            else: 
                choice = random.choice((1,2,3,4))
        
            if isinstance(p,Bump): # then check if you are at an edge and have to turn
                turn = False
                choice = random.choice((1,2));
            else:
                choice = random.choice((1,2,3,4)) # 1-right, 2-left, others-forward
        if choice == 1:
            return 'turnright'
        elif choice == 2:
            return 'turnleft'
        else:
            return 'moveforward'







 class chair(Thing):
    pass

class table(Thing):
    pass

class person(Thing):
    pass

class lab2D(GraphicEnvironment):
    def percept(self, agent):
        '''return a list of things that are in our agent's location'''
        things = self.list_things_at(agent.location)
        loc = copy.deepcopy(agent.location) # find out the target location
        #Check if agent is about to bump into a wall
        if agent.direction.direction == Direction.R:
            loc[0] += 1
        elif agent.direction.direction == Direction.L:
            loc[0] -= 1
        elif agent.direction.direction == Direction.D:
            loc[1] += 1
        elif agent.direction.direction == Direction.U:
            loc[1] -= 1
        if not self.is_inbounds(loc):
            things.append(Bump())
        return things

    def execute_action(self, agent, action):
         '''changes the state of the environment based on what the agent does.'''
         if action == 'turnright':
             print('{} decided to {} at location: {}'.format(str(agent)[1:-1], action, agent.location))
             agent.turn(Direction.R)
         elif action == 'turnleft':
             print('{} decided to {} at location: {}'.format(str(agent)[1:-1], action, agent.location))
             agent.turn(Direction.L)
         elif action == 'moveforward':
            print('{} decided to move {}wards at location: {}'.format(str(agent)[1:-1], agent.direction.direction, agent.location))
            agent.moveforward()
         elif action == "spray":
            items = self.list_things_at(agent.location, tclass=chair)
            if len(items) != 0:
                if agent.spray(items[0]):
                    print('{} sprayed {} at location: {}'
                      .format(str(agent)[1:-1], str(items[0])[1:-1], agent.location))       
         elif action == "turn":
            items = self.list_things_at(agent.location, tclass=person)
            if len(items) != 0:
                if agent.turn(items[0]):
                    print('{} turned because {} at location: {}'
                      .format(str(agent)[1:-1], str(items[0])[1:-1], agent.location))




lab = lab2D(5,5, color={'DisinfectingRobot': (128,128,128), 'chair': (153, 76, 0), 
'table': (230, 115, 40), 'person': (51,25,0)})
robot = DisinfectingRobot(program)
lab.add_thing(robot, [0,0])
chair = chair()
table = table()
person = person()
lab.add_thing(robot, [0,0])
lab.add_thing(table, [1,2])
lab.add_thing(chair, [0,1])
lab.add_thing(person,[5,1])
moretable = table()
morechair = chair()
moreperson = person
lab.add_thing(moretable, [2,4])
lab.add_thing(morechair, [4,3])
lab.add_thing(moreperson,[3,3])

print("robot started at [0,0], facing down. Time to disinfect!")
lab.run(100)


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source