Programación lóxica

A **programación lóxica** consiste na aplicación do *corpus* de coñecemento sobre lóxica para o deseño de linguaxes de programación; non debe confundirse coa disciplina da lóxica computacional.

A programación lóxica comprende dúas paradigmas de programación: a programación declarativa e a programación funcional.
A programación declarativa xira en torno ao concepto de **predicado**, ou relación entre elementos. A programación funcional baséase no concepto de **función** (que non é máis que unha evolución dos predicados), de corte máis matemático.

## Motivación 
Historicamente, os ordenadoré programáronse utilizando linguaxes moi próximos ás peculiaridades da propia máquina: operacións aritméticas simples, instrucións de acceso a memoria etc. Un programa escrito deste xeito pode ocultar totalmente o seu propósito á comprensión dun ser humano, ata un adestrado. Hoxe día, estas linguaxes pertencentes ao paradigma da Programación imperativa evolucionaron de maneira que xa non son tan crípticos.

En cambio, a lóxica matemática é o xeito máis sinxelo, para o intelecto humano, de expresar formalmente problemas complexos e de resolvelos mediante a aplicación de regras, hipóteses e teoremas. Por iso é polo que o concepto de programación "lóxica" resulte atractivo en diversos campos onde a programación tradicional é un fracaso.

## Campos de aplicación 
A programación lóxica atopa o seu * hábitat * natural en aplicacións de intelixencia artificial ou relacionadas:
* Sistemas expertos, onde un sistema de información imita as recomendacións dun experto sobre algún dominio de coñecemento.
* Demostración automática de teoremas, onde un programa xera novos teoremas sobre unha teoría existente.
* Recoñecemento de linguaxe natural, onde un programa é capaz de comprender (con limitacións) a información contida nunha expresión lingüística humana.
* Etc.

A programación lóxica tamén se utiliza en aplicacións máis "mundanas" pero de xeito moi limitado, xa que a programación tradicional é máis adecuada a tarefas de propósito xeral.

## Fundamentos 
A maioría das linguaxes de programación lóxica baséanse na teoría lóxica de primeira orde, aínda que tamén incorporan algúns comportamentos de orde superior. Neste sentido, destacan as linguaxes funcionais, xa que se basean no cálculo lambda, que é a única teoría lóxica de orde superior que é demostradamente computable (ata o momento).

## En que consiste (exemplo) 
A programación lóxica permite formalizar feitos do mundo real, por exemplo:

```
as aves voan
  os pingüíns non voan
  "pichurri" é unha ave
  "sandokan" é un can
  "alegría" é unha ave
```

e tamén regras ou restricións:

```
unha mascota voa se é unha ave e non é un pingüín
```

Ante devandito "programa" é posible establecer hipótese que non son máis que preguntas ou incógnitas, por exemplo:

```
¿ "pichurri" voa ?
   ¿ que mascotas voan ?
```

Grazas a que a lóxica de primeira orde é computable, o ordenador será capaz de verificar a hipótese, é dicir, responder ás incógnitas:

```
É certo que "pichurri" voa.
   "pichurri" e "alegría" voan.
```

Obsérvese que o programa lóxico non soamente é capaz de responder se unha determinada hipótese é verdadeira ou falsa. Tamén é capaz de determinar que valores da incógnita fan certa a hipótese.

Este exemplo é claramente académico. Con todo, consideremos o seguinte exemplo: o sistema de control de semáforos dunha cidade.

O estado de cada un dos semáforos (verde, vermello ou ámbar) constitúe os feitos do mundo real. O programa en si consiste nunhas poucas regras de sentido común: determinados semáforos non poden permanecer simultaneamente en verde, un semáforo soamente pode transitar de verde a ámbar e de ámbar a vermello etc. A hipótese é o estado no que deberían estar cada un dos semáforos no seguinte instante de tempo.

Este é un exemplo imposible de resolver mediante programación tradicional, xa que a lóxica subxacente ao comportamento dos semáforos no seu conxunto queda enmascarada por simples ordes imperativas do tipo "cambiar cor de tal ou cal semáforo".

## Linguaxes 
A linguaxe de programación lóxica por excelencia é Prolog, que conta con diversas variantes. A máis importante é a *programación lóxica con restricións* (véxase artigo sobre programación con restricións), que posibilita a resolución de ecuacións lineais ademais da demostración de hipótese.

## Bibliografía 
As seguintes referencias bibliográficas corresponden a literatura en inglé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.

Existen poucas referencias a literatura en castelán:
* **Lóxica Informática**, J. Cuena, Editorial Alianza, 1985.

## Véxase tamén 
* Paradigma de programación.
* Programación con restricións.
* Programación funcional.
* Lóxica matemática.

## Ligazóns externas 
* CLIP group, Universidade Politécnica de Madrid.
* *Logic Programming* Virtual Library entry (en inglés).
* Association for Logic Programming (ALP) (en inglés).