Les Gramàtiques de Claus Definides (DCGs) són una característica poderosa de Prolog que permet descriure gramàtiques de manera clara i concisa. Són especialment útils per al processament de llenguatges naturals i la generació de parsers.
Què són les DCGs?
Les DCGs són una extensió de Prolog que permet definir regles gramaticals utilitzant una sintaxi més llegible i natural. Aquestes regles es poden utilitzar per analitzar o generar seqüències de símbols, com ara cadenes de text.
Avantatges de les DCGs:
- Claredat: Les regles gramaticals es poden escriure de manera més llegible.
- Integració: Les DCGs s'integren perfectament amb la resta del llenguatge Prolog.
- Potència: Permeten definir gramàtiques complexes de manera senzilla.
Sintaxi de les DCGs
La sintaxi bàsica d'una DCG en Prolog utilitza l'operador -->
per definir regles. A continuació es mostra un exemple simple d'una gramàtica que reconeix una seqüència de lletres 'a' seguides de lletres 'b':
Explicació del codi:
s --> [].
: Aquesta regla indica que una seqüència buida és una seqüència vàlida.s --> [a], s, [b].
: Aquesta regla indica que una seqüència que comença amb 'a', seguida d'una altra seqüèncias
i acabada amb 'b' és vàlida.
Exemple Pràctic
Vegem un exemple més complet d'una gramàtica que reconeix expressions aritmètiques simples:
expr --> term. expr --> term, [+], expr. term --> factor. term --> factor, [*], term. factor --> [X], { number(X) }. factor --> ['('], expr, [')'].
Explicació del codi:
expr --> term.
: Una expressió (expr
) pot ser un terme (term
).expr --> term, [+], expr.
: Una expressió pot ser un terme seguit d'un signe de suma i una altra expressió.term --> factor.
: Un terme pot ser un factor (factor
).term --> factor, [*], term.
: Un terme pot ser un factor seguit d'un signe de multiplicació i un altre terme.factor --> [X], { number(X) }.
: Un factor pot ser un nombre.factor --> ['('], expr, [')']
: Un factor pot ser una expressió entre parèntesis.
Exercicis Pràctics
Exercici 1: Reconèixer Nombres Binàris
Defineix una DCG que reconegui nombres binaris (seqüències de 0s i 1s).
Exercici 2: Reconèixer Nombres Naturals
Defineix una DCG que reconegui nombres naturals (seqüències de dígits).
digit(D) --> [D], { member(D, [0,1,2,3,4,5,6,7,8,9]) }. natural --> digit(_). natural --> digit(_), natural.
Exercici 3: Reconèixer Expressions Aritmètiques amb Restes
Amplia l'exemple d'expressions aritmètiques per incloure la resta (-
).
expr --> term. expr --> term, [+], expr. expr --> term, [-], expr. term --> factor. term --> factor, [*], term. factor --> [X], { number(X) }. factor --> ['('], expr, [')'].
Resum
Les DCGs són una eina poderosa en Prolog per definir i treballar amb gramàtiques. Permeten descriure regles gramaticals de manera clara i concisa, i s'integren perfectament amb la resta del llenguatge. Amb les DCGs, podem crear parsers i processadors de llenguatges de manera eficient i llegible.
En el següent tema, explorarem la Programació Lògica amb Restriccions, una altra característica avançada de Prolog que ens permet treballar amb problemes de restriccions de manera eficient.
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