Programmazione a vincoli
La programmazione a vincoli, detta anche programmazione con vincoli o constraint è un paradigma di programmazione dove le relazioni fra variabili possono essere dichiarate in forma di vincoli. I vincoli differiscono dalle primitive normalmente definite dagli altri linguaggi di programmazione per il fatto che non specificano azioni singole da eseguire passo-passo, ma piuttosto si limitano a specificare le proprietà di cui deve essere dotata la soluzione da trovare. I vincoli usati possono essere di vari tipi: quelli basati sul cosiddetto problema della soddisfazione dei vincoli (Constraint satisfaction problem o CSP), quelli risolvibili mediante semplici algoritmi (Simplex Algorithm) ed altri. I vincoli da applicare possono essere forniti embedded nel linguaggio di programmazione, oppure in librerie separate.
La programmazione a vincoli iniziò come programmazione logica a vincoli, introducendo vincoli integrati in un programma di tipo logico. Questa variante della programmazione logica fu opera di Jaffar e Lassez, che, nel 1987, svilupparono una classe di vincoli specificatamente progettata per essere usata nel linguaggio Prolog II. La prime implementazioni di programmazione logica a vincoli furono Prolog III, CLP(R), e CHIP. Attualmente esistono molti interpreti per programmi logici a vincoli, come per esempio GNU Prolog.
A differenza dalla programmazione logica, i vincoli possono essere inseriti nella programmazione funzionale, nella riscrittura e nei linguaggi imperativi. Nella programmazione funzionale i vincoli sono implementati ad esempio nel linguaggio di programmazione multi-paradigma Oz. Vincoli sono embedded (integrati) nel linguaggio imperativo Kaleidoscope. Nei linguaggi imperativi, tuttavia, i vincoli sono implementati principalmente mediante i cosiddetti constraint solving toolkits, che sono librerie separate, fornite insieme al linguaggio. ILOG CP Optimizer, è un esempio è di queste librerie per C++, Java e .NET.
Programmazione logica a vincoli
La programmazione a vincoli consiste nell'integrazione di vincoli all'interno di un linguaggio che funge da host. I primi linguaggi usati per fungere da host furono linguaggi di tipo logico, tanto che queste applicazioni vennero inizialmente chiamate programmazione logica a vincoli. I due paradigmi condividono molte importanti caratteristiche, come le variabili logiche ed il backtracking. Attualmente la maggior parte delle implementazioni di Prolog includono una o più librerie per supportare la programmazione logica a vincoli. Le differenze fra programi logici e programmi a vincoli è sostanzialmente determinata dallo stile usato per creare modelli di simulazione del mondo reale. A seconda dei casi uno dei due stili di programmazione risulta più semplice e "naturale" da adottare.
L'approccio su cui si fonda la programmazione a vincoli è cercare uno "stato" del "mondo" in cui un grande numero di vincoli sono contemporaneamente soddisfatti. Si assume che risolvere un "problema" equivalga a trovare un "mondo possibile" descritto da un numero (inizialmente sconosciuto) di variabili. Il programma va alla ricerca dei valori che, attribuiti alle variabili, meglio definiscono il "mondo" soggetto ai vincoli imposti.
La programmazione a vincoli temporal concurrent (TCC) e la programmazione a vincoli temporal concurrent non-deterministica (NTCC) sono varianti della programmazione a vincoli in cui entra in gioco la variabile tempo.
Lista di alcuni linguaggi di programmazione logica a vincoli:
- B-Prolog (Basato su Prolog, proprietario)
- CHIP V5 (Basato su Prolog, include anche C++ e librerie C, proprietario)
- Ciao Prolog (Basato su Prolog based, Free software: GPL/LGPL)
- ECLiPSe (Basato su Prolog, open source)
- SICStus (Basato su Prolog based, proprietario)
- GNU Prolog
- YAP Prolog
- SWI Prolog free, basato su Prolog, contiene molte librerie di risoluzione vincoli
Collegamenti esterni
- (EN) On-Line Guide to Constraint Programming
- (EN) Program Does Not Equal Program: Constraint Programming and its Relationship to Mathematical Programming
- (EN) Mozart (Oz based, Free software: X11 style)
- (EN) Cork Constraint Computation Centre (4C)
- (EN) Constraint Research and Reading Group (UTEP)
Voci correlate
]]