En aquest tema, explorarem tècniques avançades per a la resolució de restriccions en Prolog. La programació lògica amb restriccions (CLP) és una extensió de Prolog que permet treballar amb restriccions en lloc de simples fets i regles. Això és especialment útil en àrees com la programació matemàtica, la planificació i la intel·ligència artificial.
Conceptes Clau
- Introducció a CLP
- Definició: La programació lògica amb restriccions (CLP) combina la programació lògica amb la resolució de restriccions.
- Ús: Permet expressar problemes en termes de restriccions sobre variables, que poden ser resoltes per un motor de restriccions.
- Domini de les Variables
- Domini: El conjunt de valors possibles que una variable pot prendre.
- Tipus de dominis:
- Domini finit: Un conjunt finit de valors (per exemple, {1, 2, 3}).
- Domini infinit: Un conjunt infinit de valors (per exemple, tots els nombres enters).
- Tipus de Restriccions
- Restriccions aritmètiques: Relacions matemàtiques entre variables (per exemple, X + Y = Z).
- Restriccions lògiques: Relacions lògiques entre variables (per exemple, X > Y).
- Restriccions globals: Restriccions que involucren múltiples variables (per exemple, tots els elements d'una llista són diferents).
Exemples Pràctics
Exemple 1: Restriccions Aritmètiques
Explicació:
:- use_module(library(clpfd)).
: Carrega la biblioteca de restriccions finites.X + Y #= Z
: Defineix una restricció aritmètica.X #> 0
,Y #> 0
,Z #< 10
: Defineixen restriccions addicionals sobre les variables.
Exemple 2: Restriccions Globals
:- use_module(library(clpfd)). all_different_example(L) :- L = [X, Y, Z], all_different(L), L ins 1..3.
Explicació:
all_different(L)
: Assegura que tots els elements de la llistaL
són diferents.L ins 1..3
: Defineix el domini de les variables enL
com els valors de 1 a 3.
Exercicis Pràctics
Exercici 1: Quadrats Màgics
Crea un programa en Prolog que resolgui un quadrat màgic de 3x3, on la suma de cada fila, columna i diagonal és igual.
:- use_module(library(clpfd)). magic_square(Square) :- Square = [A, B, C, D, E, F, G, H, I], Square ins 1..9, all_different(Square), A + B + C #= 15, D + E + F #= 15, G + H + I #= 15, A + D + G #= 15, B + E + H #= 15, C + F + I #= 15, A + E + I #= 15, C + E + G #= 15.
Solució:
- Defineix les variables del quadrat màgic.
- Assegura que totes les variables són diferents.
- Defineix les restriccions per a les files, columnes i diagonals.
Exercici 2: Problema de les Vuit Reines
Crea un programa en Prolog que resolgui el problema de les vuit reines, on cap reina pot atacar una altra en un tauler de 8x8.
:- use_module(library(clpfd)). eight_queens(Queens) :- length(Queens, 8), Queens ins 1..8, all_different(Queens), safe_queens(Queens). safe_queens([]). safe_queens([Q|Qs]) :- safe_queens(Qs, Q, 1), safe_queens(Qs). safe_queens([], _, _). safe_queens([Q|Qs], Q0, D0) :- Q0 #\= Q, abs(Q0 - Q) #\= D0, D1 #= D0 + 1, safe_queens(Qs, Q0, D1).
Solució:
- Defineix les variables per a les posicions de les reines.
- Assegura que totes les reines estan en files diferents.
- Defineix les restriccions per a les diagonals.
Resum
En aquest tema, hem explorat tècniques avançades per a la resolució de restriccions en Prolog. Hem après sobre la programació lògica amb restriccions (CLP), els dominis de les variables, i els diferents tipus de restriccions. També hem vist exemples pràctics i exercicis per aplicar aquests conceptes. La resolució de restriccions és una eina poderosa que pot simplificar la solució de problemes complexos en Prolog.
Curs de Programació en Prolog
Mòdul 1: Introducció a Prolog
- Què és Prolog?
- Instal·lant Prolog
- Primers Passos en Prolog
- Sintaxi i Estructura Bàsiques
- Fets, Regles i Consultes
Mòdul 2: Programació Bàsica en Prolog
Mòdul 3: Estructures de Dades en Prolog
Mòdul 4: Programació Avançada en Prolog
- Unificació Avançada
- Tall i Negació
- Meta-Programació
- Gramàtiques de Claus Definides (DCGs)
- Programació Lògica amb Restriccions
Mòdul 5: Prolog en la Pràctica
- Entrada/Sortida de Fitxers
- Depuració de Programes Prolog
- Biblioteques Prolog
- Interfície amb Altres Llenguatges
- Construint una Aplicació Prolog