Prolog II1 II. Estructuras de datos en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria.

Slides:



Advertisements
Presentaciones similares
I.A. Listas en Prolog Parte II.
Advertisements

I.A. Listas en Prolog.
Dra. Noemí L. Ruiz © Derechos Reservados
Desigualdades Una desigualdad es una oración conteniendo < (menor que), > (mayor que), ≤ (menor o igual que), ≥ (mayor o igual que) o ≠ (no es igual)
INTELIGENCIA ARTIFICIAL
Programación Lógica: Semántica
Arquitectura Tecnológica
Curso de Java Capitulo 6: Cadenas y Arrays Profesor:
Introducción a una Teoría de Categorías
Modelo Entidad-Relación
Unidad 5 Listas Enlazadas Bibliografía: Algoritmos y Estructuras de datos de Aguilar y Martinez. Unidad 9 Autor: Ing Rolando Simon Titiosky.
El Proceso de Investigación y la Medición
EL PROCESO DE VENTAS – Taller de Administración de Proyectos
Introducción al lenguaje de especificación JML
SQL Server Integration Services SSIS
Asignatura: Introducción a la programación
Estructuras de Datos (ARRAYS)
Programación II Ing. Diego J. Arcusin 3 – Uso del Shell.
EN EL ESTADO DE CAMPECHE BASE DE DATOS DE CONOCIMIENTOS
Fundamentos de Ingeniería de Software
Historia La base del C proviene del BCPL (lógica programable en codigo binario), escrito por Martin Richards, y del B escrito por Ken Thompson en 1970.
COLEGIO NACIONAL DE EDUCACIÓN PROFESIONAL TÉCNICA
CADENAS EN PHP.
Maestría en Bioinformática Bases de Datos y Sistemas de Información Fundamentos de Matemática Ing. Alfonso Vicente, PMP
Maestría en Bioinformática Bases de Datos y Sistemas de Información Fundamentos de Lógica Ing. Alfonso Vicente, PMP
Tema 2: Lenguaje PHP básico
Estructuras Compuestas.
2. INTRODUCCION A LA TEORIA DE LA PROBABILIDAD
Tipos de Datos.
5. Entrada y Salida en PROLOG
6. Operadores en PROLOG Definición de operadores propios
Tema: Funciones en Excel (II) Funciones de Texto
3. INTRODUCCIÓN A LA PROGRAMACIÓN
Teoría de lenguajes y compiladores
Objetivos Específicos de la Unidad
Herramientas para el acceso directo a memoria en C++
Manipulación de caracteres e hileras de texto
La estructura básica de los programas en java, algo a tener en cuenta y que debemos recordar siempre es el archivo debe llevar el nombre de la clase con.
Inteligencia artificial
Logic M.C. Juan Carlos Olivares Rojas February, 2009.
Prolog PROgramming in LOGic
Clases y objetos La unidad fundamental de programación OO son las clases. Conjunto de métodos y semántica Qué se va a hacer POO Clase: que define la implementación.
TÉCNICO EN PROGRAMACIÓN DE SOFTWARE Instructor: Ingeniero Adrián Guerrero Taborda
PROGRAMACIÓN LÓGICA.
EXPONENTES Y RADICALES
Semana 5 Subprogramas..
1 LENGUAJES LOGICOS IMPLEMENTACION CALCULO DE PREDICADOS PROLOG.
TIPOS Y ESTRUCTURAS BÁSICAS DE DATOS
ESTRUCTURAS DE DATOS I Conocer, comprender y analizar algunos de los principales tipos de estructuras de datos.
Inteligencia artificial
Inteligencia artificial
Inteligencia artificial
 Fue en el año 1945 cuando el matemático Jhon Von Neumann, fascinado por las posibilidades del ENIAC, demostró que una computadora podía tener una estructura.
Correo electrónico Internet
CONSULTAS SENCILLAS A LA BASE DE DATOS
Algoritmo Ing. Maria Rosana Heredia
IV. Aritmética en Prolog
DEFINICION  Las bases de datos son una colección organizada de información dividida en campos los cuales nos proporcionan datos detallados e individuales.
JENNIFER MONCALEANO VELASQUEZ PROGRAMACION EN PROLOG.
UNIVERSIDAD TECNICA PERTICULAR DE LOJA
SISTEMAS EXPERTOS LISTAS EN PROLOG Profesor: Joel Pérez González Abril 2010.

Presente un cuestionario con los aspectos mas importantes sobre los
Tipos de Datos.
Lenguaje de Programación LISP
Laboratorio de programación
REPÚBLICA BOLIVARIANA DE VENEZUELA MINISTERIO DEL PODER POPULAR PARA LA EDUCACION SUPERIOR UNIVERSIDAD VALLE DEL MOMBOY CARVAJAL EDO. TRUJILLO ENERO 2014.
M ODELO DE DATOS DE ENTIDAD - VÍNCULO El modelo de entidad-vínculo es un modelo de datos conceptual de uso muy extendido. Este modelo, y sus variantes,
Algorítmica y Programación
Equipo de Profesores del Curso. Funciones de Texto.
Transcripción de la presentación:

Prolog II1 II. Estructuras de datos en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

Prolog II2 Tipos de datos Datos Términos simplesEstructuras ConstantesVariables ÁtomosNúmeros

Prolog II3 Tipos de datos Datos Términos simplesEstructuras ConstantesVariables ÁtomosNúmeros maýusculas: A, B,... Z minúsculas: a, b,... z números: 0, 1, 2,... 9 car. especiales: + - * / <> = :. & _ ~ Cadenas de caracteres y números y _, que comiencen con minúscula pepe nil x25 a_ED miss_jones x_ Cadenas de caracteres especiales ===> :-: Ojo con predefinidos, p.e. :- Cadenas de caracteres encerrados entre comillas simples Pepe Esther Colero Ali Catados Números Enteros: 1, Reales: 1.00,

Prolog II4 Tipos de datos Datos Términos simplesEstructuras ConstantesVariables ÁtomosNúmeros Variables: Cadenas de caracteres, números y _, que comiencen con mayúscula o _ _pepe Nil _x25 A_ED _234 La variable anónima: cuando una variable aparece una sola vez no es necesario inventarnos un nombre para ella. con_hijo(X) :- progenitor(X, Y). con_hijo(X) :- progenitor(X, _). El contexto léxico de una variable es la cláusula. 1 ?- [user]. |: con_hijo(X) :- progenitor(X, Y). Warning: (user://1:9): Singleton variables: [Y]

Prolog II5 Tipos de datos Datos Términos simplesEstructuras ConstantesVariables ÁtomosNúmeros Estructuras: Objetos que contienen datos como componentes. Functores Listas

Prolog II6 Functor: Ejemplo: una estructura para representar la fecha. fecha( 13, octubre, 1998) FunctorArgumentos fecha 13octubre1998 Cualquier día de octubre de 1998: fecha( Dia, octubre, 1998) Functor

Prolog II7 Ejemplo: ficha( identidad( 'Luis', 'Perez', 'Martinez'), nacimiento( fecha( 10, 5, 1970), lugar('Teror', 'Gran Canaria')), direccion( calle( 'Perez Galdos', 41), poblacion( 'Las Palmas de Gran Canaria')), datos( , estudiante, )). ficha( identidad( 'Javier', 'Galindo', 'Martinez'), nacimiento( fecha( 1, 5, 1978), lugar('Guia', 'Gran Canaria')), direccion( calle( 'Ansite', 4), poblacion( 'Las Palmas de Gran Canaria')), datos( , estudiante, )). ficha( identidad( 'Maria', 'Garzon', 'Martin'), nacimiento( fecha( 1, 2, 1956), lugar('Guia', 'Gran Canaria')), direccion( calle( 'Gomera', 124), poblacion( 'Santa Brigida')), datos( , arquitecto, )).

Prolog II8 Ejemplo: ?- ficha( identidad( N, A1, A2), | nacimiento( _, lugar( 'Teror', 'Gran Canaria')), | _, _). N = 'Luis' A1 = 'Perez' A2 = 'Martinez' ; No El nombre y apellidos de las personas nacidas en Teror de Gran Canaria ficha( identidad( 'Luis', 'Perez', 'Martinez'), nacimiento( fecha( 10, 5, 1970), lugar('Teror', 'Gran Canaria')), direccion( calle( 'Perez Galdos', 41), poblacion( 'Las Palmas de Gran Canaria')), datos( , estudiante, )).

Prolog II9 A efectos de eficacia, resulta conveniente simplificar la estructura de representación ficha( 5123, identidad( 'Luis', 'Perez', 'Martinez')). nacimiento( 5123, fecha( 10, 5, 1970), lugar('Teror', 'Gran Canaria')). direccion( 5123, calle( 'Perez Galdos', 41), poblacion( 'Las Palmas de Gran Canaria')). datos( 5123, , estudiante, )).

Prolog II10 ficha localizadoridentidad nombreapellido1apellido2 ficha ( 5123, identidad( 'Luis', 'Perez', 'Martinez')).

Prolog II11 Ejemplo (cont.): ?- ficha( X, identidad( N, A1, A2)), | nacimiento( X, _, lugar( 'Teror', _)), | direccion( X, _, poblacion('Las Palmas de Gran Canaria')). X = 5183 N = 'Luis' A1 = 'Perez' A2 = 'Martinez' ; No El nombre y apellidos de las personas nacidas en (cualquier) Teror y que residan en Las Palmas de Gran Canaria

Prolog II12 Ejemplo (cont.): ?- nacimiento(X,fecha(_, _, Año), _), | datos( X, _, _, Telefono), | Año > X = 5184 Año = 1978 Telefono = ; No El teléfono de todas las personas nacidas después de 1975

Prolog II13 Listas. (a,. ( b,. ( c, [ ] ))). (Cabeza, Cola ). a. b. c[ ]

Prolog II14 Listas (cont.) [a, b, c ] =. (a,. ( b,. ( c, [ ] ))) ?- Lista1 = [a, b, c], | Lista2 =.(a,.(b,.(c, []))). Lista1 = [a, b, c] Lista2 = [a, b, c] Yes. a. b. c [ ] abc

Prolog II15 Listas (cont.) [a, [b, c ], d ] = [ ] a b d c ?- display( [a, [b, c], d])..(a,.(.(b,.(c, [])),.(d, []))) Yes

Prolog II16 Listas (cont.) Las listas se manipulan dividiéndolas en cabeza y cola Lista [a,b,c] [a] [ ] [[el, gato], maulla ] [maulla, [el, gato ]] Cabeza a no tiene [el, gato] maulla Cola [ b,c ] [ ] no tiene [maulla] [[el, gato]]

Prolog II17 Listas (cont.) Las listas se manipulan dividiéndolas en cabeza y cola Lista [a,b,c] [a] [ ] [[el, gato], maulla ] [maulla, [el, gato ]] ?- [X|Y] = [a, b, c]. X = a Y = [b, c] Yes ?- [X|Y] = [a]. X = a Y = [] Yes ?- [X|Y] = []. No ?- [X|Y] = [[el, gato], maulla]. X = [el, gato] Y = [maulla] Yes ?- [X|Y] = [maulla, [el, gato]]. X = maulla Y = [[el, gato]] Yes

Prolog II18 Listas (cont.) Una operación básica: unificación de listas Lista1 [ X, Y, Z] [ gato ] [X, Y | Z ] [[el, Y], Z ] [ X, [ Y| Z ], U ] [ X, Y, X ] Lista2 [ se, ha, ido] [ X | Y ] [yo, bebo, vino ] [[X, ratón], [se, fué ]] [ a, [ b, c], u] [ a, b, c ] Unificación X = se Y = ha Z = ido Unificación X = gato Y = [ ] Unificación X = yo Y = bebo Z = [ vino ] Unificación X = el Y = ratón Z = [ se, fue ] Unificación X = a Y = b Z = [ c ] U = u Unificación No unificables

Prolog II19 Listas (cont.) Cadenas de caracteres como listas de códigos ASCII ?- name( lógica, X). X = [108, 243, 103, 105, 99, 97] Yes ?- name(X, [108,243,103,105,99,97]). X = lógica Yes

Prolog II20 Operaciones elementales en Listas El predicado eslista es cierto si su argumento es una lista. ?- eslista([ ]). Yes ?- eslista( [a | [b, d]] ). Yes Definición eslista( [ ] ). eslista( [ _ | _ ] ).

Prolog II21 Operaciones elementales en Listas El predicado pertenece es cierto si su primer argumento pertenece a la lista que aparece como segundo argumento. ?- pertenece(a, [x,y,a,z]). Yes ?- pertenece(X, [a,b,c]). X = a ; X = b ; X = c ; No Definición pertenece ( X, [X | _ ] ). pertenece ( X, [ _ | Y] ) :- pertenece (X, Y).

Prolog II22 ?- trace(pertenece). pertenece/2: call redo exit fail Yes ?- pertenece(a,[x,y,a,z]). T Call: ( 8) pertenece(a, [x, y, a, z]) T Call: ( 9) pertenece(a, [y, a, z]) T Call: ( 10) pertenece(a, [a, z]) T Exit: ( 10) pertenece(a, [a, z]) T Exit: ( 9) pertenece(a, [y, a, z]) T Exit: ( 8) pertenece(a, [x, y, a, z]) Yes pertenece ( X, [X | _ ] ). pertenece ( X, [ _ | Y] ) :- pertenece (X, Y).

Prolog II23 ?- trace(pertenece). pertenece/2: call redo exit fail Yes ?- pertenece(a,[s,d,e]). T Call: ( 7) pertenece(a, [s, d, e]) T Call: ( 8) pertenece(a, [d, e]) T Call: ( 9) pertenece(a, [e]) T Call: ( 10) pertenece(a, []) T Fail: ( 10) pertenece(a, []) T Fail: ( 9) pertenece(a, [e]) T Fail: ( 8) pertenece(a, [d, e]) T Fail: ( 7) pertenece(a, [s, d, e]) No pertenece ( X, [X | _ ] ). pertenece ( X, [ _ | Y] ) :- pertenece (X, Y).

Prolog II24 ?- pertenece(a,[f,a,c]). Yes Ojo: Mal definido pertenece ( X, [ _ | Y] ) :- pertenece (X, Y). pertenece ( X, [X | _ ] ). ?- trace(pertenece). pertenece/2: call redo exit fail Yes ?- pertenece(a,[f,a,c]). T Call: (6) pertenece(a, [f, a, c]) T Call: (7) pertenece(a, [a, c]) T Call: (8) pertenece(a, [c]) T Call: (9) pertenece(a, []) T Fail: (9) pertenece(a, []) T Redo: (8) pertenece(a, [c]) T Fail: (8) pertenece(a, [c]) T Redo: (7) pertenece(a, [a, c]) T Exit: (7) pertenece(a, [a, c]) T Exit: (6) pertenece(a, [f, a, c]) Yes

Prolog II25 Operaciones elementales en Listas El predicado incluir proporciona una lista que es concatenación de otras dos. ?- incluir( [yo, no], [soy, pepe], L). L = [yo, no, soy, pepe] Yes Definición incluir ( [], L, L). incluir ( [X | L1], L2, [ X | L3] ) :- incluir (L1, L2, L3). ?- incluir( X, [soy, pepe], [yo, soy, pepe]). X = [yo] Yes

Prolog II26 ?- incluir([yo],[soy, pepe],L). T Call: ( 7) incluir([yo], [soy, pepe], _G242) T Call: ( 8) incluir([], [soy, pepe], _G344) T Exit: ( 8) incluir([], [soy, pepe], [soy, pepe]) T Exit: ( 7) incluir([yo], [soy, pepe], [yo, soy, pepe]) L = [yo, soy, pepe] Yes Definición incluir ( [], L, L). incluir ( [X | L1], L2, [ X | L3] ) :- incluir (L1, L2, L3). incluir/3 es equivalente al predicado predefinido append/3

Prolog II27 Operaciones elementales en Listas El predicado cuenta devuelve el número de ocurrencias de un elemento en una lista simple (sin estructura). ?- cuenta( a, [t,r,a,g,a], N). N = 2 ; No Definición cuenta( _, [], 0). cuenta(X, [X | Y], N) :- cuenta(X,Y,Z), N is Z+1. cuenta(X, [W| Y], Z) :- X \== W, cuenta(X,Y,Z). ¿ Es necesario ?

Prolog II28 cuenta( _, [], 0). cuenta(X, [X | Y], N) :- cuenta(X,Y,Z), N is Z+1. cuenta(X, [W| Y], Z) :- X \== W, cuenta(X,Y,Z). ?- cuenta( a, [t,r,a,g,a], N). N = 2 ; No cuenta( _, [], 0). cuenta(X, [X | Y], N) :- cuenta(X,Y,Z), N is Z+1. cuenta(X, [W| Y], Z) :- cuenta(X,Y,Z). ?- cuenta( a, [t,r,a,g,a], N). N = 2 ; N = 1 ; N = 0 ; No

Prolog II29 Operaciones elementales en Listas El predicado elimina elimina todas las ocurrencias de un elemento en una lista simple (sin estructura). ?- elimina( i, [e,l,i,m,i,n,a], R). R = [e, l, m, n, a] Yes Definición elimina( _, [ ], [ ]). elimina( X, [X | Y], R) :- elimina( X, Y, R). elimina( X, [W| Y], [W | R]) :- X \== W, elimina( X, Y, R).

Prolog II30 Operaciones elementales en Listas El predicado sustituye todas las ocurrencias de un elemento (1er arg.) por el 2º argumento en una lista simple (sin estructura). ?- sustituye( i, a, [e,l,i,m,i,n,a], R). R = [e, l, a, m, a, n, a] Yes Definición sustituye( _, _, [ ], [ ]). sustituye( X, Y, [X | U], [Y | V]) :- sustituye( X, Y, U, V). sustituye( X, Y, [Z | U], [Z | V]) :- X \== Z, sustituye( X, Y, U, V).

Prolog II31 Operaciones elementales en Listas El predicado reverso devuelve la lista inversa de una dada. ?- reverso( [1,2,3,4,5], R). R = [5, 4, 3, 2, 1] Yes Definición reverso( L1, L2):- rev( L1, [ ], L2). rev( [ ], L, L). rev( [X | Y], L1, L2) :- rev( Y, [X | L1], L2).

Prolog II32 ?- trace(rev), trace(reverso). rev/3: call redo exit fail reverso/2: call redo exit fail Yes ?- reverso([1,2,3,4,5],R). T Call: ( 8) reverso([1, 2, 3, 4, 5], _G217) T Call: ( 9) rev([1, 2, 3, 4, 5], [], _G217) T Call: ( 10) rev([2, 3, 4, 5], [1], _G217) T Call: ( 11) rev([3, 4, 5], [2, 1], _G217) T Call: ( 12) rev([4, 5], [3, 2, 1], _G217) T Call: ( 13) rev([5], [4, 3, 2, 1], _G217) T Call: ( 14) rev([], [5, 4, 3, 2, 1], _G217) T Exit: ( 14) rev([], [5, 4, 3, 2, 1], [5, 4, 3, 2, 1]) T Exit: ( 13) rev([5], [4, 3, 2, 1], [5, 4, 3, 2, 1]) T Exit: ( 12) rev([4, 5], [3, 2, 1], [5, 4, 3, 2, 1]) T Exit: ( 11) rev([3, 4, 5], [2, 1], [5, 4, 3, 2, 1]) T Exit: ( 10) rev([2, 3, 4, 5], [1], [5, 4, 3, 2, 1]) T Exit: ( 9) rev([1, 2, 3, 4, 5], [], [5, 4, 3, 2, 1]) T Exit: ( 8) reverso([1, 2, 3, 4, 5], [5, 4, 3, 2, 1]) R = [5, 4, 3, 2, 1] Yes reverso( L1, L2):- rev( L1, [ ], L2). rev( [ ], L, L). rev( [X | Y], L1, L2) :- rev( Y, [X | L1], L2).

Prolog II33 Operaciones elementales en Listas El predicado sublista que comprueba si una lista (1 er arg.) es parte de otra dada (2º arg.). ?- sublista( [a,s,f], [b,e,a,s,f,g,h]). Yes Definición sublista( S, L):- append( L1, L2, L), append(S, L3, L2). Definición sublista( S, L):- append( _, L2, L), append(S, _, L2). L1SL3 L L2

Prolog II34 ?- sublista( [a,s,f], [b,e,a,s,f,g,h]). [debug] ?- sublista( [a,s,f], [b,e,a,s,f,g,h]). T Call: (6) sublista([a, s, f], [b, e, a, s, f, g, h]) Call: (6) sublista([a, s, f], [b, e, a, s, f, g, h]) ? creep Call: (7) append(_G598, _G599, [b, e, a, s, f, g, h]) ? creep Exit: (7) append([], [b, e, a, s, f, g, h], [b, e, a, s, f, g, h]) ? creep Call: (7) append([a, s, f], _G599, [b, e, a, s, f, g, h]) ? creep Fail: (7) append([a, s, f], _G599, [b, e, a, s, f, g, h]) ? creep Exit: (7) append([b], [e, a, s, f, g, h], [b, e, a, s, f, g, h]) ? creep Call: (7) append([a, s, f], _G602, [e, a, s, f, g, h]) ? creep Fail: (7) append([a, s, f], _G602, [e, a, s, f, g, h]) ? creep Exit: (7) append([b, e], [a, s, f, g, h], [b, e, a, s, f, g, h]) ? creep Call: (7) append([a, s, f], _G605, [a, s, f, g, h]) ? creep Exit: (7) append([a, s, f], [g, h], [a, s, f, g, h]) ? creep T Exit: (6) sublista([a, s, f], [b, e, a, s, f, g, h]) Exit: (6) sublista([a, s, f], [b, e, a, s, f, g, h]) ? creep Yes sublista( S, L):- append( _, L2, L), append(S, _, L2).

Prolog II35 Operaciones elementales en Listas El predicado aplana transforma una lista compleja, que puede contener a otras listas como elementos, en una lista sin estructura. Definición aplana([H|T], Lp):- aplana(H, Hp), aplana(T, Tp), append(Hp, Tp, Lp). aplana([], []). aplana(X, [X]). ?- aplana([a, [ [b], c] ], L). L = [a, b, c] Yes

Prolog II36 2 ?- trace(aplana). % aplana/2: [call, redo, exit, fail] Yes [debug] 3 ?- aplana([a,[b]],Lp). T Call: (7) aplana([a, [b]], _G486) T Call: (8) aplana(a, _L171) T Exit: (8) aplana(a, [a]) T Call: (8) aplana([[b]], _L172) T Call: (9) aplana([b], _L192) T Call: (10) aplana(b, _L213) T Exit: (10) aplana(b, [b]) T Call: (10) aplana([], _L214) T Exit: (10) aplana([], []) T Exit: (9) aplana([b], [b]) T Call: (9) aplana([], _L193) T Exit: (9) aplana([], []) T Exit: (8) aplana([[b]], [b]) T Exit: (7) aplana([a, [b]], [a, b]) Lp = [a, b] ; T Redo: (9) aplana([], _L193) T Exit: (9) aplana([], [[]]) T Exit: (8) aplana([[b]], [b, []]) T Exit: (7) aplana([a, [b]], [a, b, []]) Lp = [a, b, []] ; … Esta definición produce basura en el backtracking. aplana([H|T], Lp):- aplana(H, Hp), aplana(T, Tp), append(Hp, Tp, Lp). aplana([], []). aplana(X, [X]). Además, el uso de append/3 hace que sea muy ineficiente.

Prolog II37 2 ?- trace(aplana2). % aplana2/2: [call, redo, exit, fail] [debug] 11 ?- aplana2([a,[b]],Lp). T Call: (8) aplana2([a, [b]], _G501) T Call: (9) aplana2([a, [b]], [], _G501) T Call: (10) aplana2(a, [], _L189) T Exit: (10) aplana2(a, [], [a]) T Call: (10) aplana2([[b]], [a], _G501) T Call: (11) aplana2([b], [a], _L210) T Call: (12) aplana2(b, [a], _L231) T Exit: (12) aplana2(b, [a], [b, a]) T Call: (12) aplana2([], [b, a], _L210) T Exit: (12) aplana2([], [b, a], [b, a]) T Exit: (11) aplana2([b], [a], [b, a]) T Call: (11) aplana2([], [b, a], _G501) T Exit: (11) aplana2([], [b, a], [b, a]) T Exit: (10) aplana2([[b]], [a], [b, a]) T Exit: (9) aplana2([a, [b]], [], [b, a]) T Exit: (8) aplana2([a, [b]], [b, a]) Lp = [b, a] ; T Redo: (11) aplana2([], [b, a], _G501) T Exit: (11) aplana2([], [b, a], [[], b, a]) T Exit: (10) aplana2([[b]], [a], [[], b, a]) T Exit: (9) aplana2([a, [b]], [], [[], b, a]) T Exit: (8) aplana2([a, [b]], [[], b, a]) Lp = [[], b, a] … Una nueva definición que es más eficiente. aplana2(L,LP):- aplana2(L,[],LP). aplana2([H|T],A,LP):- aplana2(H,A,HA), aplana2(T,HA,LP). aplana2([],A,A). aplana2(X,A,[X|A]). Problema: La lista resulta invertida

Prolog II38 % Execution Aborted 12 ?- trace(aplana3). % aplana3/2: [call, redo, exit, fail] % aplana3/3: [call, redo, exit, fail] Yes [debug] 13 ?- aplana3([a,[b]],Lp). T Call: (8) aplana3([a, [b]], _G501) T Call: (9) aplana3([a, [b]], [], _G501) T Call: (10) aplana3([[b]], [], _L189) T Call: (11) aplana3([], [], _L210) T Exit: (11) aplana3([], [], []) T Call: (11) aplana3([b], [], _L189) T Call: (12) aplana3([], [], _L249) T Exit: (12) aplana3([], [], []) T Call: (12) aplana3(b, [], _L189) T Exit: (12) aplana3(b, [], [b]) T Exit: (11) aplana3([b], [], [b]) T Exit: (10) aplana3([[b]], [], [b]) T Call: (10) aplana3(a, [b], _G501) T Exit: (10) aplana3(a, [b], [a, b]) T Exit: (9) aplana3([a, [b]], [], [a, b]) T Exit: (8) aplana3([a, [b]], [a, b]) Lp = [a, b] ; … Lp = [a, b, []] … Un pequeño arreglo es suficiente … aplana3(L,LP):- aplana3(L,[],LP). aplana3([H|T],A,LP):- aplana3(T,A,HA), aplana3(H,HA,LP). aplana3([ ],A,A). aplana3(X,A,[X|A]). para que la lista salga en el orden correcto.

Prolog II39 Sumario. Los objetos simples en Prolog: átomos, variables y números. Las estructuras sirven para representar objetos compuestos. Las estructuras se construyen por medio de functores. Cada functor se define por su nombre y aridad. La misma variable en dos cláusulas representa dos cosas diferentes. El ámbito léxico de una variable es la cláusula. La lista es una estructura versátil, compuesta de cabeza y cola.