}
+//--------------------------------------------------------------------------------------------
+//--
+// Si las condiciones finales del entorno son iguales a las condiciones finales de alguna teoria y
+// solo una condicion inicial es distinta => agrego una nueva teoría igual (a la q cumple los requisitos
+// anteriormente detallados) pero tomando ANY en el valor de entrada en el cual difieren.
+void CSistemaAutonomo::heurisitca_generalizacion(CTeoria& t)
+{
+ CTeoria nt ; //Nueva Teoria
+ unsigned i ;
+ int count = 0;
+ int k = 0;
+ int j = 0;
+ int posicionCambio = -1;
+ bool seguir = true;
+ unsigned cantidadTeorias = 0;
+ std::string nombreTeoria;
+
+ cantidadTeorias = this->teorias.count();
+
+ for (i=0; i<cantidadTeorias; i++)
+ {
+ for (k=0; k<this->teorias[i].datos_finales.count(); k++)
+ {
+ //me fijo si las condiciones finales de la teoria se corresponden con la del entorno.
+ if((this->teorias[i].datos_finales[k] != ANY) && (this->p_entorno->datos.find(t.datos_finales.keys(k)) != ANY))
+ {
+ if(this->teorias[i].datos_finales[k] != this->p_entorno->datos.find(t.datos_finales.keys(k)))
+ {
+ count++;
+ }
+ }
+ }
+ if(count == 0)
+ { // si se corresponden (las condiciones finales son iguales) => me fijo si hay alguna condicion inicial q cambia.
+ for (j=0; j<this->teorias[i].datos_iniciales.count(); j++)
+ {
+ if((this->teorias[i].datos_iniciales[j] != ANY) && (this->p_entorno->datos.find(t.datos_iniciales.keys(j)) != ANY))
+ {
+ if(this->teorias[i].datos_iniciales[j] != this->p_entorno->datos.find(t.datos_iniciales.keys(j)))
+ {
+ posicionCambio = j;
+ count++;
+ }
+ }
+ }
+ if(count == 1)
+ {//si cambia solo una => creo una nueva teoria igual pero con ANY en la condicion q cambia.
+ nt = this->teorias[i];
+ nt.datos_iniciales[posicionCambio] = ANY;
+
+ // Agrego la teoria
+ nombreTeoria = teorias.count() ;
+ teorias.add (nombreTeoria.c_str(), nt) ;
+ }
+ }
+ posicionCambio = -1;
+ count = 0;
+ }
+}
//--------------------------------------------------------------------------------------------
//--
// Aplico heuristicas de observacion
this->heurisitca_observacion(t) ;
+ this->heurisitca_generalizacion(t);
}
//
// Si una teoria no se verifico como correcta, se crea una nueva quitandole las condiciones_finales que no se verifican.
void heurisitca_retraccion(CTeoria&) ;
+ //Heuristica de generalizacion.
+ // Si dentro de las teorias se encuentra unaque solo difiera de los datos del entorno en una condicíon inicial => se agrega una nueva teoria igual pero con ANY en esa condicion.
+ void heurisitca_generalizacion(CTeoria&);
public: