Prolog é unhalinguaxe de programación lóxica. O nome de Prolog provén deprogramation logique ("programación lóxica" en francés). Foi creada porAlain Colmerauer eRobert Kowalski sobre o1972 e é unha alternativa óLisp deseñado nos Estados Unidos. Foi un intento de criar unha linguaxe de programación que usase expresións lóxicas na vez de instrucións específicas do computador. En certa maneira, Prolog é un subconxunto dePlanner. As ideas de Planner foron máis tarde completamente desenvolvidas naScientific Community Metaphor.
Prolog é usada en moitos programas deintelixencia artificial e cómputo de linguaxes (especialmente anatural, para a cal foi deseñada). A súasintaxe esemántica considéranse moi simples e claras, xa que o obxectivo orixinal era fornecer unha ferramenta para lingüistas sen coñecementos en informática.
Os programas de Prolog están constituídos porcláusulas de Horn que constitúen regras do tipomodus ponens, e dicir "Se é verdade o antecedente entón e verdade o consecuente". Os conceptos fundamentais que implementa Prolog son a unificación, a recursividade pola cola (tail recursion) e a volta atrás (backtracking).
Prolog non empregatipos de datos da mesmo xeito que o fan a maioría das linguaxes. É preferible falar de elementos lóxicos de Prolog na vez de tipos de datos.
Son constantes de texto. Un átomo é unha secuencia de letras, números e o carácter '_', que comeza cunha letra minúscula. Usualmente, para representar un átomo non alfanumérico, escríbese entre apóstrofes (p. ex. 'átomo con espazos').
A maioría das implementacións de Prolog non distinguen entre enteiros e números reais.
As variables se denotan por unha cadea de letras, números e o carácter ('_'), e comeza cunha letra maiúscula. En Prolog unha variable non é un contedor ao que se lle poida asignar un valor coma na programación imperativa.
Os termos son a única maneira na que Prolog pode representar datos complexos. Un termo consiste nunha cabeza chamada funtor (que debe ser un átomo) e parámetros (sen restrición de tipos) listados entre parénteses e separados por comas. O número de parámetros chámase aridade do termo. Un termo e identificado pola súa cabeza e a aridade, usualmente escrito funtor/aridade.
Unha lista non é un tipo de datos autónomo, está definido recursivamente (usando o termo '.'/2):
- atom [] é a lista baleira
- seT e unha lista eH é un elemento, entón o termo '.'(H,T) é unha lista.
O primeiro elemento, chamado cabeza, éH, que está seguido dos contidos do resto da lista, designadoT ou cola. A lista [1,2,3] estaría representada internamente como '.'(1, '.'(2, '.'(3, []))). Un atallo sintáctico e [H |T], que e moi usado para construír regras. A lista enteira pode ser procesada procesando o primeiro elemento, e logo o resto da lista de maneirarecursiva.
Por conveniencia de programación, as listas poden ser construídas e desconstruídas de moitos xeitos:
- Enumeración de elementos: [abc, 1, f(x),Y, g(A,rst)]
- Precedido dun elemento: [abc |L1]
- Precedido de múltiplos elementos: [abc, 1, f(x) |L2]
- Termo: '.'(abc, '.'(1, '.'(f(x), '.'(Y, '.'(g(A,rst), [])))))
As cadeas se escriben usualmente como unha secuencia de caracteres entre comiñas. Normalmente se representan internamente como unha lista de códigos ASCII.
%%%% declaracións%%paide('xoan', 'maria'). % Xoán é pai de Maríapaide('pablo', 'xoan'). % Pablo é pai de Juanpaide('pablo', 'marcela').paide('carlos', 'debora').% A é fillo de B se B é pai de Afillode(A,B) :- paide(B,A).% A é avó de B se A é pai de C y C é pai de Bavode(A,B) :- paide(A,C), paide(C,B).% A e B son irmáns se o pai de A e tamén o pai de B e se A e B non son o mesmoirmande(A,B) :- paide(C,A) , paide(C,B), A \== B.% A e B son familiares se A é pai de B ou A é fillo de B ou A é irmán de Bfamiliarde(A,B) :- paide(A,B).familiarde(A,B) :- fillo(A,B).familiarde(A,B) :- irmande(A,B).%%%% consultas%%% Xoán e irmán de Marcela??- irmande('xoan', 'marcela').yes%Carlos é irmán de Xoán??- irmande('carlos', 'xoan').no% Pablo é avó de María??- avode('pablo', 'maria').yes% María é avoa de Pablo??- avode('maria', 'pablo').no