+//--------------------------------------------------------------------------------------------
+//--
+void CSistemaAutonomo::plan()
+{
+ double p = 1.0;
+ m_plan.clear();
+ if (teorias.count() > max_teorias) purgar_teorias();
+#ifdef DEBUG
+ std::cout << "SA: Planificando...\n";
+ std::cout << "SA: \tentorno:\n" << p_entorno->datos << "\n";
+ std::cout << "SA: \tteorias:\n" << teorias << "\n";
+ std::cout << "SA: \tdatos finales:\n" << m_datos_finales << "\n";
+#endif // DEBUG
+ planificar(p_entorno->datos, m_datos_finales, m_plan, p);
+#ifdef DEBUG
+ std::cout << "SA: \tplan:\n" << m_plan << "\n";
+#endif // DEBUG
+ curr_theory = m_plan.begin();
+#ifdef DEBUG
+ if (curr_theory == m_plan.end())
+ std::cout << "SA: No hay teorías\n";
+ else
+ std::cout << "SA: curr teoria: " << **curr_theory << "\n";
+#endif // DEBUG
+}
+
+//--------------------------------------------------------------------------------------------
+//--
+bool CSistemaAutonomo::has_next_theory()
+{
+ return curr_theory != m_plan.end();
+}
+
+//--------------------------------------------------------------------------------------------
+//--
+CTeoria* CSistemaAutonomo::get_next_theory()
+{
+ if (curr_theory == m_plan.end())
+ {
+ m_datos_finales.clear();
+ return 0;
+ }
+ else
+ {
+#ifdef DEBUG
+ std::cout << "SA: ejecuta teoria: " << **(curr_theory) << "\n";
+#endif // DEBUG
+ return *(curr_theory++);
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//--
+bool CSistemaAutonomo::validate_theory(CTeoria* t)
+{
+ bool result ;
+
+ // Aumento k (cantidad de veces que se probó la teoría
+ ++t->k;
+
+#ifdef DEBUG
+ std::cout << "SA: Entorno de verificacion:\n" << p_entorno->datos;
+#endif // DEBUG
+
+ // Verifico
+ result = verificar_condicion(t->datos_finales) ;
+
+ // Si se ejecuto bien la teoria incremento el p
+ if (result) t->p++ ;
+
+ // Si fallo la teoria
+ if (!result)
+ {
+ // Aplico heuristicas de observacion
+#ifdef DEBUG
+ std::cout << "SA: No verifica, aplicando heuristicas...\n";
+ std::cout << "SA: Aplicando heuristica de observacion\n";
+#endif // DEBUG
+ this->heuristca_observacion(*t) ;
+#ifdef DEBUG
+ std::cout << "SA: Aplicando heuristica de generalizacion\n";
+#endif // DEBUG
+ this->heuristca_generalizacion(*t);
+#ifdef DEBUG
+ std::cout << "SA: Aplicando heuristica de retraccion\n";
+#endif // DEBUG
+ // Aplico heuristicas de correccion
+ this->heuristca_retraccion(*t) ;
+ }
+#ifdef DEBUG
+ else std::cout << "SA: Verifica!\n";
+#endif // DEBUG
+
+ return result;
+}