La programmation par contraintes trouve son origine dans la programmation logique par contraintes , sous laquelle elle peut être exprimée. Cette dernière intègre des contraintes dans un programme logique . Cette variante de la programmation logique est due à Jaffar et Lassez , qui ont étendu en 1987 une classe spécifique de contraintes introduite dans Prolog II . Les premières implémentations de la programmation logique par contraintes furent Prolog III , CLP(R) et CHIP .
Au lieu de la programmation logique, les contraintes peuvent être combinées avec la programmation fonctionnelle , la réécriture de termes et les langages impératifs . Parmi les langages de programmation intégrant la gestion des contraintes, on trouve Oz (programmation fonctionnelle) et Kaleidoscope (programmation impérative). Le plus souvent, les contraintes sont implémentées dans les langages impératifs via des bibliothèques dédiées à la résolution de contraintes , qui sont des modules complémentaires pour un langage impératif existant.
de programmation logique ; le domaine a donc été initialement appelé programmation logique par contraintes . Les deux paradigmes partagent de nombreuses caractéristiques importantes, comme les variables logiques et le retour arrière . Aujourd'hui, la plupart des implémentations de Prolog incluent une ou plusieurs bibliothèques pour la programmation logique par contraintes.La différence entre les deux réside principalement dans leurs styles et leurs approches de la modélisation du monde. Certains problèmes se prêtent plus naturellement (et donc plus simples) à la programmation logique, tandis que d'autres se prêtent mieux à la programmation par contraintes.
La programmation par contraintes consiste à rechercher un état du monde où un grand nombre de contraintes sont satisfaites simultanément. Un problème est généralement formulé comme un état du monde contenant plusieurs variables inconnues. Le programme de programmation par contraintes recherche alors les valeurs de toutes ces variables.
La programmation par contraintes concurrentes temporelles (TCC) et la programmation par contraintes concurrentes temporelles non déterministes (MJV) sont des variantes de la programmation par contraintes qui peuvent gérer le temps.
Problème de satisfaction de contraintes
Il existe trois catégories de contraintes :
- contraintes extensionnelles : les contraintes sont définies en énumérant l’ensemble des valeurs qui les satisferaient ;
- contraintes arithmétiques : les contraintes sont définies par une expression arithmétique, c'est-à-dire en utilisant ;
- Contraintes logiques : les contraintes sont définies avec une sémantique explicite, par exemple : AllDifferent , AtMost , ...
L'affectation consiste à associer une variable à une valeur de son domaine. On parle d'affectation partielle lorsqu'un sous-ensemble des variables du problème est affecté. L'affectation est totale lorsque toutes les variables du problème sont affectées.