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

  1. 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.

  1. 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).

  1. 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

:- use_module(library(clpfd)).

solve(X, Y, Z) :-
    X + Y #= Z,
    X #> 0,
    Y #> 0,
    Z #< 10.

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 llista L són diferents.
  • L ins 1..3: Defineix el domini de les variables en L 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.

© Copyright 2024. Tots els drets reservats