fbpx
Wikipedia

Prolog

Prolog (o PROLOG), proveniente del francés PROgrammation en LOGique,[1]​ es un lenguaje de programación lógico e interpretado usado habitualmente en el campo de la Inteligencia artificial.

Prolog
Desarrollador(es)
Alain Colmerauer y Philippe Roussel
Información general
Extensiones comunes pl, pro y P
Apareció en 1972
Diseñado por Alain Colmerauer, Robert Kowalski y Philippe Roussel
Influido por Planner

Historia

Se trata de un lenguaje de programación ideado a principios de los años 70 en la Universidad de Aix-Marseille I (Marsella, Francia) por Alain Colmerauer y Philippe Roussel. Nació de un proyecto que no tenía como objetivo la traducción de un lenguaje de programación, sino el tratamiento algorítmico de lenguajes naturales. Alain Colmerauer y Robert Pasero trabajaban en la parte del procesado del lenguaje natural y Jean Trudel y Philippe Roussel en la parte de deducción e inferencia del sistema. Interesado por el método de resolución SL, Philippe Roussel persuadió a su autor, Robert Kowalski para que colaborara con el proyecto, dando lugar a una versión preliminar del lenguaje Prolog a finales de 1971[2]​ y apareciendo la versión definitiva en 1972.[3]​ Esta primera versión de Prolog fue programada en ALGOL W.

Inicialmente se trataba de un lenguaje totalmente interpretado hasta que, en 1983, David H.D. Warren desarrolló un compilador capaz de traducir Prolog en un conjunto de instrucciones de una máquina abstracta denominada Warren Abstract Machine, o abreviadamente, WAM. Desde entonces Prolog es un lenguaje semi-interpretado.

Si bien en un principio se trataba de un lenguaje de uso reducido, la aparición de intérpretes del mismo para microordenadores de 8 bits (ej: micro-PROLOG) y para ordenadores domésticos de 16 bits (ej: Turbo Prolog de Borland, entre otros muchos), a lo largo de la década de 1980, contribuyó notablemente a su popularización.[4]​ Otro importante factor en su difusión fue la adopción del mismo para el desarrollo del proyecto de la quinta generación de computadoras a principios de la década de los 80,[5]​en cuyo contexto se desarrolló la implementación paralelizada del lenguaje llamada KL1 y del que deriva parte del desarrollo moderno de Prolog.

Las primeras versiones del lenguaje diferían, en sus diferentes implementaciones, en muchos aspectos de sus sintaxis, empleándose mayormente como forma normalizada el dialecto propuesto por la Universidad de Edimburgo,[6]​ hasta que en 1995 se estableció un estándar ISO (ISO/IEC 13211-1), llamado ISO-Prolog.

Prolog se enmarca en el paradigma de los lenguajes lógicos y declarativos, lo que lo diferencia enormemente de otros lenguajes más populares tales como Fortran, Pascal, C o Java.

Vuelta atrás (backtracking)

En los lenguajes de programación antes mencionados, las instrucciones se ejecutan normalmente en orden secuencial, es decir, una a continuación de otra, en el mismo orden en que están escritas, que sólo varía cuando se alcanza una instrucción de control (un bucle, una instrucción condicional o una transferencia).

Los programas en Prolog se componen de cláusulas de Horn que constituyen reglas del tipo "modus ponendo ponens", es decir, "Si es verdad el antecedente, entonces es verdad el consecuente". No obstante, la forma de escribir las cláusulas de Horn es al contrario de lo habitual. Primero se escribe el consecuente y luego el antecedente. El antecedente puede ser una conjunción de condiciones que se denomina secuencia de objetivos. Cada objetivo se separa con una coma y puede considerarse similar a una instrucción o llamada a procedimiento de los lenguajes imperativos. En Prolog no existen instrucciones de control. Su ejecución se basa en dos conceptos: la unificación y el backtracking.

Gracias a la unificación, cada objetivo determina un subconjunto de cláusulas susceptibles de ser ejecutadas. Cada una de ellas se denomina punto de elección. Prolog selecciona el primer punto de elección y sigue ejecutando el programa hasta determinar si el objetivo es verdadero o falso.

En caso de ser falso entra en juego el backtracking, que consiste en deshacer todo lo ejecutado situando el programa en el mismo estado en el que estaba justo antes de llegar al punto de elección. Entonces se toma el siguiente punto de elección que estaba pendiente y se repite de nuevo el proceso. Todos los objetivos terminan su ejecución bien en éxito ("verdadero"), bien en fracaso ("falso").

Programación en Prolog

Existen dos tipos de cláusulas: Hechos y Reglas. Una regla es del tipo:

Cabeza :- Cuerpo. 

y se lee como "La cabeza es verdad si el cuerpo es verdad". El cuerpo de una regla consiste en llamadas a Predicado (lógica)predicados, que son llamados los objetivos de las reglas. El predicado ,/2 (es decir, un operador de paridad 2 (que recibe 2 argumentos) y de nombre , ) denota conjunción de objetivos, y el operador ;/2 denota disyunción. Conjunciones y disyunciones pueden sólo aparecer en el cuerpo, no en la cabeza de la regla. En realidad la disyunción no es un operador básico o predefinido, sino que está meta-programado así:

';' (A,_) :- A. ';' (_,B) :- B. 

Las cláusulas sin cuerpo (es decir, antecedente) son llamados hechos porque siempre son ciertos. Un ejemplo de un hecho es:

gato(tom). 

que es equivalente a la regla:

gato(tom) :- true. 

El predicado predefinido true/0 siempre es verdad.

Dado el hecho anterior, se puede preguntar:

¿Es Tom un gato?

?- gato(tom). Yes 

¿Qué cosas son gatos?

?- gato(X). X = Tom 

Debido a la naturaleza relacional de muchos predicados, pueden ser usados revertidos sus argumentos. Por ejemplo, length/2 puede ser usado para determinar el tamaño (longitud) de una lista: length([a,b,c], L), así como para generar un esqueleto de lista para un largo dado (length(X, 5)). Similarmente, append/3 puede ser usado también para unir o anexar dos listas: append([a,b], [c,d], X), así como para dividir una lista en dos partes: append(X, Y, [a,b,c,d]). Todo depende de qué argumentos sean variables libres y cuáles sean instanciados. En analogía con la programación imperativa, las variables libres son argumentos de salida y el resto son argumentos de entrada. Pero en Prolog, a diferencia de los lenguajes imperativos, dicho rol es intercambiable en la mayoría de los predicados. Esta característica se denomina reversibilidad, y las combinaciones válidas de argumentos de salida o entrada se denomina modos de uso. Por ejemplo, el predicado length/2 es reversible y tiene tres modos de uso: los dos argumentos instanciados, el primer argumento instanciado pero el otro no, y viceversa. El modo de uso con los dos argumentos sin instanciar no tiene mucho sentido, pero podría ser admitido según algunas implementaciones, en tal caso, generaría todas los esqueletos de lista de todas las longitudes posibles...

Por esta razón, una biblioteca relativamente pequeña de predicados basta para muchos programas en Prolog. Todos los predicados pueden también ser usados para realizar pruebas unitarias: las consultas pueden ser incrustados en programas y permitir pruebas automáticas de regresión en tiempo de compilación.

Como un lenguaje de propósito general, Prolog también posee varios predicados predefinidos para interacción con el sistema operativo, como entrada/salida, gráficos y comunicaciones de datos. Estos predicados no tienen un significado relacional y son sólo útiles por los efectos laterales que exhiben en el sistema. Por ejemplo, el predicado write/1 muestra un término en la pantalla, pero no tiene relevancia su valor de verdad o falsedad.

Expresiones

Prolog cuenta con operadores para la unificación y comparación, sea con evaluación o sea simbólica, como los siguientes:

  • X is Y %unificación con evaluación.
  • X = Y %unificación simbólica
  • X=:=Y %comparación con evaluación
  • X == Y %comparación simbólica.
?- X is 3+5. X = 8 ?- X = 3+5. X = 3+5 ?- 3+5 =:= 2+6. yes ?- 3+5 == 2+6. no ?- 3+5 == 3+5. yes 

Listas

La representación de hechos simples no es lo común en la clasificación de elementos, sino que se agrupan los elementos de un mismo tipo en una lista.

Las listas son colecciones de elementos en Prolog. Una lista se divide en dos partes: Cabeza. Es el primer elemento de la lista. Cola. Es una lista con el resto de los elementos de la lista. La cabeza y la cola de una lista se separan con el símbolo "|".

Ejemplos de código Prolog

Ejemplo simple

%% %% declaraciones %% padrede('Juan', 'María'). % Juan es padre de María padrede('Pablo', 'Juan'). % Pablo es padre de Juan padrede('Pablo', 'Marcela'). % Pablo es padre de Marcela padrede('Carlos', 'Débora'). % Carlos es padre de Débora % A es hijo de B si B es padre de A hijode(A,B) :- padrede(B,A). % A es abuelo de B si A es padre de C y C es padre B abuelode(A,B) :- padrede(A,C), padrede(C,B). % A y B son hermanos si el padre de A es también el padre de B y si A y B no son lo mismo hermanode(A,B) :- padrede(C,A) , padrede(C,B), A \== B. % A y B son familiares si A es padre de B o A es hijo de B o A es hermano de B familiarde(A,B) :- padrede(A,B). familiarde(A,B) :- hijode(A,B). familiarde(A,B) :- hermanode(A,B). %% %% consultas %% % ¿Juan es hermano de Marcela? ?- hermanode('Juan', 'Marcela'). yes % ¿Carlos es hermano de Juan? ?- hermanode('Carlos', 'Juan'). no % ¿Pablo es abuelo de María? ?- abuelode('Pablo', 'María'). yes % ¿María es abuela de Pablo? ?- abuelode('María', 'Pablo'). no 

Factorial de un número

% La sintaxis es factorial(N, F) -> Factorial de N es F (el resultado se guarda en F) factorial(0, 1). factorial(1, 1). factorial(N, F) :- N>0, N1 is N - 1, factorial(N1, F1), F is N * F1. %el factorial se llama recursivamente dejando el resultado en F 

Término de Fibonacci de un número

% La sintaxis es fibonacci(N, F) -> Término N de la sucesión (el resultado se guarda en F). fibonacci(0, 0) :-!. fibonacci(1, 1) :-!. fibonacci(N ,F) :-N1 is N - 1, fibonacci(N1, F1),N2 is N - 2, fibonacci(N2, F2), F is F1 + F2. %el fibonacci se llama recursivamente dejando el resultado en F. 

Usos de Listas en Prolog

Creación y consulta de listas

plantas([manzana, naranja, limón, espinaca, gardenia, alfalfa, pino]). lista([1,2,3]). ?-lista([H|T]). H=1 T=[2,3] ?-lista([H,J|T]). H=1 J=2 T=[3] 

Longitud de una lista

% Si queremos hallar la longitud de una lista. % La longitud de una lista vacía es 0. % La longitud de cualquier lista es la longitud de la cola + 1. longitud([],0). longitud([_|T],N):-longitud(T,N0), N is N0 + 1. ?- longitud([a,b,c],L). L = 3 ?- longitud([a,b,c],4). No 

Búsqueda de un elemento

% Si queremos determinar si un elemento pertenece a una lista. % El elemento pertenece a la lista si coincide con la cabeza de la lista. % El elemento pertenece a la lista si se encuentra en la cola de la lista. pertenece(X,[X|_]) . pertenece(X,[_|R]):- pertenece(X,R). ?- pertenece(b,[a,b,c]). Yes ?- pertenece(b,[a,[b,c]]). No ?- pertenece([b,c],[a,[b,c]]). Yes ?- pertenece(X,[a,b]). X = a ; X = b 

Eliminar elemento de una lista

% Si queremos eliminar un elemento de la lista. % Si X es la cabeza de la lista, la cola T es la lista sin X % Si X no es la cabeza de la lista, conservamos la cabeza de la lista  % como parte de la respuesta y continuamos eliminando X de la cola T. elimina(X,[X|T],T). elimina(X,[H|T],[H|T1]):- elimina(X,T,T1). ?- elimina(1,[1,2,3,4],R). R = [2,3,4] ?- elimina(1,R,[2,3]). R = [1, 2, 3] ; R = [2, 1, 3] ; R = [2, 3, 1] ?- elimina(X,[1,2,3],Y). X = 1, Y = [2,3] ; X = 2, Y = [1,3] ; X = 3, Y = [1,2] 

Concatenar listas

% Si queremos concatenar dos listas lista.  % Concatenar una lista vacía con L es L. % Concatenar X|L1 con L2 es poner el primer  % elemento de la primera lista (X) más la  % concatenación del resto de la lista (L1) con L2 concatenar([],L,L). concatenar([X|L1],L2,[X|L3]):-concatenar(L1,L2,L3). ?- concatenar([1,2],[3,4],R). R = [1, 2, 3, 4]. ?- concatenar(X,Y,[1,2]). X = [], Y = [1,2] ; X = [1], Y = [2] ; X = [1,2], Y = [] 

Comprobar si una lista es la inversa de otra

% Si queremos calcular la inversa de una lista.  % La inversa de una lista vacía es una lista vacía. % La inversa de H|T es la inversa de T concatenada con H. inversa([],[]). inversa([H|T],L):- inversa(T,R), concatenar(R,[H],L). ?- inversa([a,b,c,d],[d,c,b,a]). Yes/Si 
% Utilizando un parámetro acumulador. inver(L1,L2):-inver(L1,L2,[]). inver([],L,L). inver([H|T],L,S):-inver(T,L,[H|S]). ?- inver([a,b,c,d],[d,c,b,a]). Yes 

Referencias

  1. Colmerauer, Alain y Roussel, Philippe. La naissance de Prolog, julio de 1992
  2. BERGIN, Thomas J. y GIBSON, Richard G., History of Programming Languages II, New York, ACM Press, Addison-Wesley, 1996, ISBN 0-201-89502-1
  3. Kowalski, R. A. The early years of logic programming. 
  4. El lenguaje PROLOG, artículo en el periódico ABC del 12 de octubre de 1986
  5. Aplicaciones de la Inteligencia Artificial en la Actividad Empresarial, la Ciencia y la Industria, de Wendy B. Rauch-Hindin, página 644 y siguientes, ISBN 84-87189-07-5, en Google Books.
  6. A falta de una especificación formal del Prolog de Edimburgo se ha utilizado sobre todo como referencia el DEC-10 PROLOG Manual de Bowen (1982) o el Programming in Prolog de Clocksin y Mellish.

Véase también

Enlaces externos

  • Ciao-prolog compilador/Intérprete eficience distribuido bajo GPL/LGPL.
  • Strawberry Prolog, compilador libre de Prolog
  • Laboratorio de programación lógica de la Universidad Politécnica de Madrid.
  • Learn Prolog Now! (tutorial gratuito)
  •   Datos: Q163468

prolog, prolog, proveniente, francés, programmation, logique, lenguaje, programación, lógico, interpretado, usado, habitualmente, campo, inteligencia, artificial, desarrollador, alain, colmerauer, philippe, rousselinformación, generalextensiones, comunespl, pa. Prolog o PROLOG proveniente del frances PROgrammation en LOGique 1 es un lenguaje de programacion logico e interpretado usado habitualmente en el campo de la Inteligencia artificial PrologDesarrollador es Alain Colmerauer y Philippe RousselInformacion generalExtensiones comunespl pro y PAparecio en1972Disenado porAlain Colmerauer Robert Kowalski y Philippe RousselInfluido porPlanner editar datos en Wikidata Indice 1 Historia 2 Vuelta atras backtracking 3 Programacion en Prolog 4 Expresiones 5 Listas 6 Ejemplos de codigo Prolog 6 1 Ejemplo simple 6 2 Factorial de un numero 6 3 Termino de Fibonacci de un numero 6 4 Usos de Listas en Prolog 6 4 1 Creacion y consulta de listas 6 4 2 Longitud de una lista 6 4 3 Busqueda de un elemento 6 4 4 Eliminar elemento de una lista 6 4 5 Concatenar listas 6 4 6 Comprobar si una lista es la inversa de otra 7 Referencias 8 Vease tambien 9 Enlaces externosHistoria EditarSe trata de un lenguaje de programacion ideado a principios de los anos 70 en la Universidad de Aix Marseille I Marsella Francia por Alain Colmerauer y Philippe Roussel Nacio de un proyecto que no tenia como objetivo la traduccion de un lenguaje de programacion sino el tratamiento algoritmico de lenguajes naturales Alain Colmerauer y Robert Pasero trabajaban en la parte del procesado del lenguaje natural y Jean Trudel y Philippe Roussel en la parte de deduccion e inferencia del sistema Interesado por el metodo de resolucion SL Philippe Roussel persuadio a su autor Robert Kowalski para que colaborara con el proyecto dando lugar a una version preliminar del lenguaje Prolog a finales de 1971 2 y apareciendo la version definitiva en 1972 3 Esta primera version de Prolog fue programada en ALGOL W Inicialmente se trataba de un lenguaje totalmente interpretado hasta que en 1983 David H D Warren desarrollo un compilador capaz de traducir Prolog en un conjunto de instrucciones de una maquina abstracta denominada Warren Abstract Machine o abreviadamente WAM Desde entonces Prolog es un lenguaje semi interpretado Si bien en un principio se trataba de un lenguaje de uso reducido la aparicion de interpretes del mismo para microordenadores de 8 bits ej micro PROLOG y para ordenadores domesticos de 16 bits ej Turbo Prolog de Borland entre otros muchos a lo largo de la decada de 1980 contribuyo notablemente a su popularizacion 4 Otro importante factor en su difusion fue la adopcion del mismo para el desarrollo del proyecto de la quinta generacion de computadoras a principios de la decada de los 80 5 en cuyo contexto se desarrollo la implementacion paralelizada del lenguaje llamada KL1 y del que deriva parte del desarrollo moderno de Prolog Las primeras versiones del lenguaje diferian en sus diferentes implementaciones en muchos aspectos de sus sintaxis empleandose mayormente como forma normalizada el dialecto propuesto por la Universidad de Edimburgo 6 hasta que en 1995 se establecio un estandar ISO ISO IEC 13211 1 llamado ISO Prolog Prolog se enmarca en el paradigma de los lenguajes logicos y declarativos lo que lo diferencia enormemente de otros lenguajes mas populares tales como Fortran Pascal C o Java Vuelta atras backtracking EditarArticulo principal Vuelta atras En los lenguajes de programacion antes mencionados las instrucciones se ejecutan normalmente en orden secuencial es decir una a continuacion de otra en el mismo orden en que estan escritas que solo varia cuando se alcanza una instruccion de control un bucle una instruccion condicional o una transferencia Los programas en Prolog se componen de clausulas de Horn que constituyen reglas del tipo modus ponendo ponens es decir Si es verdad el antecedente entonces es verdad el consecuente No obstante la forma de escribir las clausulas de Horn es al contrario de lo habitual Primero se escribe el consecuente y luego el antecedente El antecedente puede ser una conjuncion de condiciones que se denomina secuencia de objetivos Cada objetivo se separa con una coma y puede considerarse similar a una instruccion o llamada a procedimiento de los lenguajes imperativos En Prolog no existen instrucciones de control Su ejecucion se basa en dos conceptos la unificacion y el backtracking Gracias a la unificacion cada objetivo determina un subconjunto de clausulas susceptibles de ser ejecutadas Cada una de ellas se denomina punto de eleccion Prolog selecciona el primer punto de eleccion y sigue ejecutando el programa hasta determinar si el objetivo es verdadero o falso En caso de ser falso entra en juego el backtracking que consiste en deshacer todo lo ejecutado situando el programa en el mismo estado en el que estaba justo antes de llegar al punto de eleccion Entonces se toma el siguiente punto de eleccion que estaba pendiente y se repite de nuevo el proceso Todos los objetivos terminan su ejecucion bien en exito verdadero bien en fracaso falso Programacion en Prolog EditarExisten dos tipos de clausulas Hechos y Reglas Una regla es del tipo Cabeza Cuerpo y se lee como La cabeza es verdad si el cuerpo es verdad El cuerpo de una regla consiste en llamadas a Predicado logica predicados que son llamados los objetivos de las reglas El predicado 2 es decir un operador de paridad 2 que recibe 2 argumentos y de nombre denota conjuncion de objetivos y el operador 2 denota disyuncion Conjunciones y disyunciones pueden solo aparecer en el cuerpo no en la cabeza de la regla En realidad la disyuncion no es un operador basico o predefinido sino que esta meta programado asi A A B B Las clausulas sin cuerpo es decir antecedente son llamados hechos porque siempre son ciertos Un ejemplo de un hecho es gato tom que es equivalente a la regla gato tom true El predicado predefinido true 0 siempre es verdad Dado el hecho anterior se puede preguntar Es Tom un gato gato tom Yes Que cosas son gatos gato X X Tom Debido a la naturaleza relacional de muchos predicados pueden ser usados revertidos sus argumentos Por ejemplo length 2 puede ser usado para determinar el tamano longitud de una lista length a b c L asi como para generar un esqueleto de lista para un largo dado length X 5 Similarmente append 3 puede ser usado tambien para unir o anexar dos listas append a b c d X asi como para dividir una lista en dos partes append X Y a b c d Todo depende de que argumentos sean variables libres y cuales sean instanciados En analogia con la programacion imperativa las variables libres son argumentos de salida y el resto son argumentos de entrada Pero en Prolog a diferencia de los lenguajes imperativos dicho rol es intercambiable en la mayoria de los predicados Esta caracteristica se denomina reversibilidad y las combinaciones validas de argumentos de salida o entrada se denomina modos de uso Por ejemplo el predicado length 2 es reversible y tiene tres modos de uso los dos argumentos instanciados el primer argumento instanciado pero el otro no y viceversa El modo de uso con los dos argumentos sin instanciar no tiene mucho sentido pero podria ser admitido segun algunas implementaciones en tal caso generaria todas los esqueletos de lista de todas las longitudes posibles Por esta razon una biblioteca relativamente pequena de predicados basta para muchos programas en Prolog Todos los predicados pueden tambien ser usados para realizar pruebas unitarias las consultas pueden ser incrustados en programas y permitir pruebas automaticas de regresion en tiempo de compilacion Como un lenguaje de proposito general Prolog tambien posee varios predicados predefinidos para interaccion con el sistema operativo como entrada salida graficos y comunicaciones de datos Estos predicados no tienen un significado relacional y son solo utiles por los efectos laterales que exhiben en el sistema Por ejemplo el predicado write 1 muestra un termino en la pantalla pero no tiene relevancia su valor de verdad o falsedad Expresiones EditarProlog cuenta con operadores para la unificacion y comparacion sea con evaluacion o sea simbolica como los siguientes b X is Y b unificacion con evaluacion b X Y b unificacion simbolica b X Y b comparacion con evaluacion b X Y b comparacion simbolica X is 3 5 X 8 X 3 5 X 3 5 3 5 2 6 yes 3 5 2 6 no 3 5 3 5 yesListas EditarLa representacion de hechos simples no es lo comun en la clasificacion de elementos sino que se agrupan los elementos de un mismo tipo en una lista Las listas son colecciones de elementos en Prolog Una lista se divide en dos partes Cabeza Es el primer elemento de la lista Cola Es una lista con el resto de los elementos de la lista La cabeza y la cola de una lista se separan con el simbolo Ejemplos de codigo Prolog EditarEjemplo simple Editar declaraciones padrede Juan Maria Juan es padre de Maria padrede Pablo Juan Pablo es padre de Juan padrede Pablo Marcela Pablo es padre de Marcela padrede Carlos Debora Carlos es padre de Debora A es hijo de B si B es padre de A hijode A B padrede B A A es abuelo de B si A es padre de C y C es padre B abuelode A B padrede A C padrede C B A y B son hermanos si el padre de A es tambien el padre de B y si A y B no son lo mismo hermanode A B padrede C A padrede C B A B A y B son familiares si A es padre de B o A es hijo de B o A es hermano de B familiarde A B padrede A B familiarde A B hijode A B familiarde A B hermanode A B consultas Juan es hermano de Marcela hermanode Juan Marcela yes Carlos es hermano de Juan hermanode Carlos Juan no Pablo es abuelo de Maria abuelode Pablo Maria yes Maria es abuela de Pablo abuelode Maria Pablo no Factorial de un numero Editar La sintaxis es factorial N F gt Factorial de N es F el resultado se guarda en F factorial 0 1 factorial 1 1 factorial N F N gt 0 N1 is N 1 factorial N1 F1 F is N F1 el factorial se llama recursivamente dejando el resultado en F Termino de Fibonacci de un numero Editar La sintaxis es fibonacci N F gt Termino N de la sucesion el resultado se guarda en F fibonacci 0 0 fibonacci 1 1 fibonacci N F N1 is N 1 fibonacci N1 F1 N2 is N 2 fibonacci N2 F2 F is F1 F2 el fibonacci se llama recursivamente dejando el resultado en F Usos de Listas en Prolog Editar Creacion y consulta de listas Editar plantas manzana naranja limon espinaca gardenia alfalfa pino lista 1 2 3 lista H T H 1 T 2 3 lista H J T H 1 J 2 T 3 Longitud de una lista Editar Si queremos hallar la longitud de una lista La longitud de una lista vacia es 0 La longitud de cualquier lista es la longitud de la cola 1 longitud 0 longitud T N longitud T N0 N is N0 1 longitud a b c L L 3 longitud a b c 4 No Busqueda de un elemento Editar Si queremos determinar si un elemento pertenece a una lista El elemento pertenece a la lista si coincide con la cabeza de la lista El elemento pertenece a la lista si se encuentra en la cola de la lista pertenece X X pertenece X R pertenece X R pertenece b a b c Yes pertenece b a b c No pertenece b c a b c Yes pertenece X a b X a X b Eliminar elemento de una lista Editar Si queremos eliminar un elemento de la lista Si X es la cabeza de la lista la cola T es la lista sin X Si X no es la cabeza de la lista conservamos la cabeza de la lista como parte de la respuesta y continuamos eliminando X de la cola T elimina X X T T elimina X H T H T1 elimina X T T1 elimina 1 1 2 3 4 R R 2 3 4 elimina 1 R 2 3 R 1 2 3 R 2 1 3 R 2 3 1 elimina X 1 2 3 Y X 1 Y 2 3 X 2 Y 1 3 X 3 Y 1 2 Concatenar listas Editar Si queremos concatenar dos listas lista Concatenar una lista vacia con L es L Concatenar X L1 con L2 es poner el primer elemento de la primera lista X mas la concatenacion del resto de la lista L1 con L2 concatenar L L concatenar X L1 L2 X L3 concatenar L1 L2 L3 concatenar 1 2 3 4 R R 1 2 3 4 concatenar X Y 1 2 X Y 1 2 X 1 Y 2 X 1 2 Y Comprobar si una lista es la inversa de otra Editar Si queremos calcular la inversa de una lista La inversa de una lista vacia es una lista vacia La inversa de H T es la inversa de T concatenada con H inversa inversa H T L inversa T R concatenar R H L inversa a b c d d c b a Yes Si Utilizando un parametro acumulador inver L1 L2 inver L1 L2 inver L L inver H T L S inver T L H S inver a b c d d c b a YesReferencias Editar Colmerauer Alain y Roussel Philippe La naissance de Prolog julio de 1992 BERGIN Thomas J y GIBSON Richard G History of Programming Languages II New York ACM Press Addison Wesley 1996 ISBN 0 201 89502 1 Kowalski R A The early years of logic programming El lenguaje PROLOG articulo en el periodico ABC del 12 de octubre de 1986 Aplicaciones de la Inteligencia Artificial en la Actividad Empresarial la Ciencia y la Industria de Wendy B Rauch Hindin pagina 644 y siguientes ISBN 84 87189 07 5 en Google Books A falta de una especificacion formal del Prolog de Edimburgo se ha utilizado sobre todo como referencia el DEC 10 PROLOG Manual de Bowen 1982 o el Programming in Prolog de Clocksin y Mellish Vease tambien EditarSWI Prolog GNU Prolog P Programacion logica Probador de teoremas logicosEnlaces externos EditarCiao prolog compilador Interprete eficience distribuido bajo GPL LGPL Strawberry Prolog compilador libre de Prolog Laboratorio de programacion logica de la Universidad Politecnica de Madrid Learn Prolog Now tutorial gratuito Datos Q163468 Obtenido de https es wikipedia org w index php title Prolog amp oldid 142707398, wikipedia, wiki, leyendo, leer, libro, biblioteca,

español

, española, descargar, gratis, descargar gratis, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, imagen, música, canción, película, libro, juego, juegos