Programación con restricciones
De Wikipedia, la enciclopedia libre
La Programación con restricciones es un paradigma de la programación en informática, donde las relaciones entre las variables son expresadas en terminos de restricciones. Actualmente es usada como una tecnología de software para la descripción y resolución problemas combinatorios particularmente difíciles, especialmente en las areas de planificación y calendarización.
Este paradigma representa uno de los desarrollos más fascinantes en los lenguajes de programación desde 1990 y no es sorprendente que recientemente haya sido identificada por la ACM (Asociación de Maquinaria Computacional) como una dirección estratégica en la investigación en computación.
Básicamente es un paradigma de programación, en la cual se especifica un conjunto de restricciones, las cuales deben satisfacer una solución, en vez de especificar los pasos para obtener dicha solución.
La programación con restricciones se relaciona mucho con la programación lógica. De hecho cualquier programa lógico puede ser traducido en programa basado con restricciones y viceversa. Muchas veces los programas lógicos son traducidos a programas basados en restricciones debido a que la resolución de un programa basado en restricciones se puede desempeñar mejor que su contraparte.
La diferencia entre ambos se debe principalmente en sus estilos y enfoques en el modelamiento de mundo. Para ciertos problemas es más natural (y por ende más simple) escribirlos como programas lógicos, mientras que en otros es más natural escribirlos como programas basados en restricciones.
El enfoque de la programación con restricciones se basa principalmen en buscar un estado en el cual una gran cantidad de restricciones sean satisfechas simultáneamente. Un problema se define típicamente como un estado de la realidad en el cual existe un número de variables con valor desconocido. Un programa basado en restricciones busca dichos valores para todas las variables.
Algunos dominios de aplicación de este paradigma son
- Dominios booleanos, donde solo existen restricciones del tipo verdadero/falso
- Dominios en variables enteras y racionales
- Dominios lineales, donde solo se describen y analizan funciones lineales
- Dominios finitos, donde las restricciones son definidas en conjuntos finitos
- Dominios mixtos, los cuales involucran dos o más de los anteriores
Los lenguajes basados en restricciones son típicamente incrustados en un lenguaje host. El prmer lenguaje host usado fue Prolog, es por esta razón que este campo fue llamado inicialmente Programación Lógica con Restricciones. Ambos paradigmas comparten características muy similares, tales como las variables lógicas (una vez que una variable es asignada a un valor, no puede ser cambiado), o backtracking.
La programación con restricciones puede ser vista como un lenguaje propio o como librerías para ser usadas en algún lenguaje de programación regular. Algunos lenguajes populares basados en restricciones son:
- B-Prolog (Basado en Prolog , proprietario)
- CHIP V5 (Basado en Prolog, también existen librerías en C y C++ , proprietario)
- Ciao Prolog (Basado en Prolog , software libre: GPL/LGPL)
- ECLiPSe (Basado en Prolog , proprietario)
- Mozart ( Basado en Oz , software libre: X11)
- SICStus (Basado en Prolog ,proprietario)
Algunas librerías populares:
- Choco (Java, software libre: X11 )
- Disolver (C++, proprietaria)
- Gecode (C++ ,software libre: X11 )
- ILOG CP (C++ , proprietaria)
- Koalog Constraint Solver (Java , proprietaria)