// function REFLEX-VACUUM-AGENT([location, status]) returns an
            // action
            public IAction Execute(IPercept percept)
            {
                LocalVacuumEnvironmentPercept vep = (LocalVacuumEnvironmentPercept)percept;

                // if status = Dirty then return Suck
                if (VacuumEnvironment.LocationState.Dirty == vep
                    .getLocationState())
                {
                    return(VacuumEnvironment.ACTION_SUCK);
                    // else if location = A then return Right
                }
                else if (VacuumEnvironment.LOCATION_A.Equals(vep
                                                             .getAgentLocation()))
                {
                    return(VacuumEnvironment.ACTION_MOVE_RIGHT);
                }
                else if (VacuumEnvironment.LOCATION_B.Equals(vep
                                                             .getAgentLocation()))
                {
                    // else if location = B then return Left
                    return(VacuumEnvironment.ACTION_MOVE_LEFT);
                }

                // Note: This should not be returned if the
                // environment is correct
                return(DynamicAction.NO_OP);
            }
            protected override DynamicState updateState(DynamicState state,
                                                        IAction anAction, IPercept percept, MODEL model)
            {
                LocalVacuumEnvironmentPercept vep = (LocalVacuumEnvironmentPercept)percept;

                state.SetAttribute(ATTRIBUTE_CURRENT_LOCATION,
                                   vep.getAgentLocation());
                state.SetAttribute(ATTRIBUTE_CURRENT_STATE,
                                   vep.getLocationState());
                // Keep track of the state of the different locations
                if (VacuumEnvironment.LOCATION_A.Equals(vep.getAgentLocation()))
                {
                    state.SetAttribute(ATTRIBUTE_STATE_LOCATION_A,
                                       vep.getLocationState());
                }
                else
                {
                    state.SetAttribute(ATTRIBUTE_STATE_LOCATION_B,
                                       vep.getLocationState());
                }
                return(state);
            }