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 llistaLsón diferents.L ins 1..3: Defineix el domini de les variables enLcom 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
