# Programació lògica

La programació lògica consisteix en l'aplicació del corpus de coneixement sobre lògica per al disseny de llenguatges de programació; no ha de confondre's amb la disciplina de la lògica computacional.
La programació lògica és un tipus de paradigmes de programació dins del paradigma de programació declarativa. La resta dels subparadigmes de programació dins de la programació declarativa són: programació funcional, programació basada en restriccions, programes DSL (de domini específic) i híbrids. La programació lògica gira entorn del concepte de predicat, o relació entre elements. La programació funcional es basa en el concepte de funció (que no és més que una evolució dels predicats), de caràcter més matemàtic.

## Motivació

Històricament, els ordinadors s'han programat utilitzant llenguatges molt propers a les peculiaritats de la mateixa màquina: operacions aritmètiques simples, instruccions d'accés a memòria, etc. Un programa escrit d'aquesta manera pot ocultar totalment el seu propòsit a la comprensió d'un ésser humà, fins i tot un entrenat. Avui dia, aquests llenguatges pertanyents al paradigma de la programació imperativa han evolucionat de manera que ja no són tan críptics.
En canvi, la lògica matemàtica és la manera més senzilla, per a l'intel·lecte humà, d'expressar formalment problemes complexos i de resoldre'ls mitjançant l'aplicació de regles, hipòtesis i teoremes. Per aquest motiu el concepte de "programació lògica" resulta atractiu en diversos camps on la programació tradicional és un fracàs.

## Camps d'aplicació

La programació lògica troba el seu hàbitat natural en aplicacions d'intel·ligència artificial o relacionades:
* Sistemes experts, on un sistema d'informació imita les recomanacions d'un expert sobre algun domini de coneixement.
* Demostració automàtica de teoremes, on un programa genera nous teoremes sobre una teoria existent.
* Reconeixement de llenguatge natural, on un programa és capaç de comprendre (amb limitacions) la informació continguda en una expressió lingüística humana.
* Etc.
La programació lògica també s'utilitza en aplicacions més "mundanes" però de manera molt limitada, ja que la programació tradicional és més adequada a tasques de propòsit general.

## Fonaments

La majoria dels llenguatges de programació lògica es basen en la teoria lògica de primer ordre, encara que també incorporen alguns comportaments d'ordre superior. En aquest sentit, destaquen els llenguatges funcionals, ja que es basen en el càlcul lambda, que és l'única teoria lògica d'ordre superior que és demostradament computable (fins al moment).

## En què consisteix (exemple)

La programació lògica permet formalitzar fets del món real, per exemple:
i també regles o restriccions:
Davant de tal "programa" és possible establir hipòtesis que no són més que preguntes o incògnites, per exemple:
Gràcies al fet que la lògica de primer ordre és computable, l'ordinador serà capaç de verificar la hipòtesi, és a dir, respondre a les incògnites:
Observi's que el programa lògic no solament és capaç de respondre si una determinada hipòtesi és veritable o falsa, també és capaç de determinar quins valors de la incògnita fan certa la hipòtesi.
Aquest exemple és clarament acadèmic. No obstant això, considerem el següent exemple: el sistema de control de semàfors d'una ciutat.
L'estat de cadascun dels semàfors (verd, vermell o ambre) constitueix els fets del món real. El programa en si consisteix en unes poques regles de sentit comú: determinats semàfors no poden romandre simultàniament en verd, un semàfor solament pot transitar de verd a ambre i d'ambre a vermell, etc. La hipòtesi és l'estat en el qual haurien d'estar cadascun dels semàfors en el següent instant de temps.
Aquest és un exemple impossible de resoldre mitjançant programació tradicional, ja que la lògica subjacent al comportament dels semàfors en el seu conjunt queda emmascarada per simples ordres imperatives del tipus "canviar color de tal o tal altre semàfor".

## Llenguatges

El llenguatge de programació lògica per excel·lència és Prolog, que compta amb diverses variants. La més important és la programació lògica amb restriccions, que possibilita la resolució d'equacions lineals a més de la demostració d'hipòtesi.

## Bibliografia

Les següents referències bibliogràfiques corresponen a literatura en anglès:
* Foundations of Logic Programming, J.W. Lloyd, Springer-Verlag, 1991.
* Essentials of Logic Programming, C. Hogger, Clarendon Press, Oxford, 1990.
* Logic for Computer Science: Foundations of Automatic Theorem Proving, J.H. Gallier, John Wiley and Sons, 1987.
Existeixen poques referències a literatura en castellà:
* Lógica Informática, J. Cuena, Editorial Alianza, 1985.
* Programación Lógica. Teoria i Práctica, P. Julián, M. Alpont, Pearson Prentice Hall, 2007.