title: FOIL
text: # FOIL
  
  FOIL es un algoritmo usado en informática en el campo de la inteligencia artificial y más concretamente en el campo de la programación lógica inductiva (ILP) para aprender reglas de la lógica de primer orden que describan un predicado a partir de un conocimiento base y de un conjunto de ejemplos, denominado conjunto de entrenamiento, donde puede haber tanto ejemplos positivos como negativos. Este algoritmo es muy parecido al algoritmo de cobertura, usado para aprender reglas en la lógica proposicional.
  Consta de dos bucles anidados:
  * El externo se encarga de crear nuevas reglas, con cuerpo vacío y como cabeza el predicado que se desea aprender. Tras haber salido del bucle interno debe almacenar las reglas (se aprende una por iteración de este bucle, el externo) y quitar del conjunto de entrenamiento los ejemplos positivos cubiertos correctamente por la regla aprendida en cada iteración. Por tanto, este bucle es el encargado de realizar generalizaciones.
  * El bucle interno es el que lleva a cabo la especialización de las reglas creadas por el bucle externo mientras haya ejemplos negativos en el conjunto de entrenamiento cubiertos por la regla que se está especializando. Este bucle genera todos los literales posibles que se puedan incluir en el cuerpo de la regla y de todos ellos se añade el mejor.
  Una observación importante es que para aprender predicados (conceptos, funciones...) recursivos se debe permitir que se pueda añadir al cuerpo de la regla el predicado que se desea aprender, que es el que está en la cabeza de la regla.
  Es muy normal que a la hora de elegir el mejor literal se escoja el que mayor ganancia de información aporte. Este concepto de ganancia de información está relacionado con la entropía para conjuntos y basada en ésta.