You are on page 1of 74

PARADIGMA.
• Thomas Kuhn : "… muestras aceptadas de métodos
prácticos en la ciencia …“

• Adam Smith : "Un conjunto compartido de hechos
asumidos. Agua para el pez, el paradigma explica el
mundo y permite predecir su comportamiento. Estando en
medio del paradigma, es difícil imaginar otro".

PARADIGMA
• Willis Hartman : "… la manera básica de percibir, pensar,
valorar y hacer cosas asociadas con una visión particular
de la realidad."

• Marilyn Ferguson : "… un marco de pensamiento … un
esquema para entender y explicar ciertos aspectos de la
realidad".

y establecen lo debido para tener éxito dentro de esos límites". . y una tendencia FUERTE a aferrarnos a ellas. • Para tener en cuenta: Los seres humanos tenemos paradigmas con POCAS reglas.PARADIGMA • Joel Barker : " … un conjunto de reglas que definen límites.

.

.

.

.

.

.

.

SWI PROLOG .

• Desarrollado a partir de trabajos en demostración automática de teoremas • Aplicado inicialmente en problemas de Procesamiento del Lenguaje Natural • Permite un prototipado más rápido que con muchos lenguajes porque es mucho más proximo a la especificación lógica del programa.¿Qué es Prolog? • Prolog = PROgramming in LOGic. .

¿Qué es Prolog? Lenguaje de Programación Computación simbólica y no-numérica Para resolver problemas que involucran • OBJETOS • RELACIONES .

Para programar en Prolog: Declarar hechos sobre objetos y sus relaciones Declarar reglas sobre los objetos y sus relaciones Hacer preguntas sobre los objetos y sus relaciones .

Objetos: raquel. teresa). Hechos “Raquel es hija de teresa” es_hija (raquel. Relación: hija Observar: • Minúsculas • El punto final . teresa.

teresa). miguel cláusulas . miguel). teresa). progenitor (teresa. pedro maria Ejemplo: progenitor (pedro. progenitor (raquel. teresa elena progenitor (maria. raquel). elena). jorge raquel progenitor (teresa. progenitor (maria. jorge).

X = teresa . raquel).progenitor (teresa. No miguel .progenitor (X. miguel). raquel). No teresa elena ?. pedro maria Yes ?. Y). No jorge raquel ?.progenitor (jorge. Y = jorge .?.progenitor (teresa. Y = raquel .

X = pedro Y = teresa . pedro maria ?. X = maria Y = teresa .progenitor (X. jorge raquel X = teresa Y = raquel . Y). miguel No . teresa elena X = maria Y = elena . X = teresa Y = jorge . X = raquel Y = miguel .

PoM).progenitor (PoM. jorge). progenitor (Abuelo. teresa elena PoM = teresa Abuelo = pedro . pedro maria ¿Quién es abuelo de jorge? ?. PoM = teresa jorge raquel Abuelo = maria . No miguel .

Hijo = teresa jorge raquel Nieto = raquel . pedro maria ¿Quién es nieto de pedro? ?. No miguel . teresa elena Hijo = teresa Nieto = jorge . Hijo). progenitor (Hijo. Nieto).progenitor (pedro.

jorge). X = teresa jorge raquel Y = maria . X).progenitor (X. progenitor (Y. pedro maria ¿Quién es abuelo de jorge? ?. teresa elena X = teresa Y = pedro . No miguel .

progenitor (pedro. X). progenitor (teresa. raquel). miguel). jorge). progenitor (Y. La base de hechos . teresa). progenitor (teresa. elena).progenitor (X. X = teresa progenitor (maria. Paso 1. jorge). progenitor (raquel. ¿Quién es abuelo de jorge? ?. teresa). teresa). progenitor (maria.

progenitor (teresa. jorge). Respuesta progenitor (raquel. raquel). progenitor (teresa. ¿Quién es abuelo de jorge? ?.progenitor (X. Y = pedro La base de hechos . progenitor (maria. X = teresa. Paso 2. progenitor (Y. teresa). teresa). miguel). teresa). Y = pedro progenitor (pedro. jorge). progenitor (maria. elena).

Y = maria progenitor (maria. teresa). Respuesta progenitor (raquel. elena). jorge). X = teresa. progenitor (teresa.progenitor (X. miguel). jorge). Paso 3. raquel). progenitor (pedro. teresa). progenitor (teresa. ¿Quién es abuelo de jorge? ?. Y = maria La base de hechos . progenitor (Y. teresa). progenitor (maria.

teresa). progenitor (Y. teresa). raquel). progenitor (teresa. teresa). X). progenitor (pedro. ¿Quién es abuelo de jorge? ?. miguel).progenitor (X. Backtrack La base de hechos . jorge). Paso 4. progenitor (teresa. progenitor (maria. jorge). progenitor (maria. elena). progenitor (raquel.

teresa). progenitor (pedro. jorge). progenitor (raquel. Paso 5. X). jorge). Aquí progenitor (teresa. ¿Quién es abuelo de jorge? ?. progenitor (maria. miguel). teresa). elena). progenitor (teresa. No La base de hechos .progenitor (X. progenitor (maria. progenitor (Y. raquel).

.X). SI Y es progenitor de X Entonces X es descendiente de Y.Reglas Para todos X e Y.progenitor(Y. X X es descendiente de Y SI Y es progenitor de X.Y) :. progenitor descendiente descendiente(X. Y cabeza cuerpo Para todos X e Y.

mujer(X). La coma significa Relación unaria conjunción (Y) . W).Ejemplo: la relación madre Para todos X y W. W) :. W progenitor(X. mujer X X es madre de W SI X es progenitor de W Y progenitor madre X es mujer madre (X.

Z hombre (X). progenitor (W. .Ejemplo: la relación abuelo Para todos X y Z. W). Z). hombre X X es abuelo de Z SI progenitor X es progenitor de W y W es progenitor de Z y W abuelo X es hombre abuelo (X. Z) :- progenitor progenitor (X.

Ejemplo: la relación hermana Para todos X y W. X). . progenitor(Z. W) :- progenitor(Z. W). Z progenitor progenitor X es hermana de W SI Z es progenitor de X y W. y X es mujer X W hermana mujer hermana (X. mujer(X).

teresa elena hombre(jorge). jorge). mujer(teresa). miguel No .hermana(X. Añadimos estos hechos. mujer(maria). mujer(elena). hombre(miguel). jorge raquel ¿Quién es hermana de jorge? ?. pedro maria hombre(pedro). X = raquel . mujer(raquel).

X = teresa .. pedro maria ¿Quién es hermana de teresa? ?..hermana(X. No jorge raquel miguel . teresa). teresa elena X = teresa . X = elena .Un pequeño problema .

Programa: pedro maria
progenitor(pedro, teresa).
progenitor(maria, teresa).
progenitor(maria, elena).
progenitor(teresa, jorge).
progenitor(teresa, raquel).
progenitor(raquel, miguel). teresa elena
hombre(pedro).
mujer(maria).
mujer(elena).
mujer(teresa).
hombre(jorge). jorge raquel
mujer(raquel).
hombre(miguel).

hermana(X, W) :-
progenitor(Z, X), progenitor(Z, W), miguel
mujer(X).

Ejemplo: la relación antepasado X

Para todos X y Z, progenitor
antepasado
X es antepasado de Z SI
W
X es progenitor de W y
W es antepasado de Z y

antepasado (X, Z) :-
antepasado
progenitor (X, W),
antepasado (W, Z). ...

Una definición recursiva Z

Ejemplo: la relación antepasado X

?- antepasado(X, jorge). progenitor
antepasado
No
W

antepasado
antepasado (X, Z) :-
progenitor (X, W), ...
antepasado (W, Z).

Z

progenitor antepasado X = teresa . Z). Z). Z) :- progenitor(X.antepasado(X. antepasado (W. progenitor (X. W)... X = pedro . Z . X = maria . jorge).Ejemplo: la relación antepasado X ?. antepasado antepasado (X. W No antepasado(X. Z) :- .

sobrino.. primos. teresa elena juan tio. sobrina.. y ensayarla sobre jorge raquel jose la base de datos de la figura miguel . pedro maria Ejercicios Definir las relaciones tia. .

Tipos de datos Datos Términos simples Estructuras Constantes Variables Átomos Números .

===> encerrados entre Números números: a_EDcomillas 0. 3 10000 car. Z x25 Cadenas minúsculas: a. B..* / <> = : . dez caracteres .. que Datos comiencen con minúscula Cadenas de caracteres pepe especiales Términos simples Estructuras maýusculas: nil <-->A. ‘Pepe’ . Tipos de datos Cadenas de caracteres y números y _... 1... & _ ~ Reales: 1. -0.093 x_ ‘Ana Zapana’ p. :- Átomos Números ‘Ali Catari’ . miss_jones especiales: Ojo con+ predefinidos.e.00. 2. b. . . 9 simples Constantes Variables :-: Enteros: 1.

Warning: (user://1:9): Datosde caracteres. Nil con_hijo(X) :. Estructuras una sola vez no es necesario _pepe inventarnos un nombre para ella. Y). 1 ?.progenitor(X. Y).[user]. Cadenas Singleton variables: [Y] números y _. Tipos de datos Variables: |: con_hijo(X) :. _). Constantes _x25 Variables con_hijo(X) :.progenitor(X. A_ED _234 Átomos Números .progenitor(X. El contexto léxico deque unacomiencen con mayúscula o _ La variable anónima: cuando una variable aparece Términosvariable simples es la cláusula.

Átomos Números • Functores • Listas . Tipos de datos Datos Términos simples Estructuras Constantes Variables Estructuras: Objetos que contienen datos como componentes.

octubre. octubre. “Cualquier día de Functor octubre de 1998”: Functor: fecha( Dia. 1998) Ejemplo: una estructura para representar la fecha. fecha( 13. 1998) fecha Functor Argumentos 13 octubre 1998 .

1956). lugar(‘Ayaviri'. ‘Puno')). lugar(‘Azángaro'. 5. 124). 128234)). 'Martinez'). . poblacion( ‘Juliaca')). 241). direccion( calle( ‘Los Andes'. ficha( identidad( 'Javier'. 'García'. ficha( identidad( 'Maria'. lugar(‘Puno'. 'Galindo'. poblacion( ‘Juliaca')). datos( 89234347. datos( 42234347. 2. 'Mamani'). 5. datos( 42232787. 'Martinez'). ingeniero. 1970). direccion( calle( ‘San Martín'. 92823)). poblacion( ‘Juliaca')). 128234)). estudiante. nacimiento( fecha( 1. nacimiento( fecha( 10. 1978). ‘Puno')). direccion( calle( ‘Los Alamos'. ‘Puno')). nacimiento( fecha( 1. 421). estudiante. 'Perez'. Ejemplo: ficha( identidad( 'Luis'.

poblacion( ‘Juliaca')). Ayaviri. . ‘Puno')). lugar( ‘Ayaviri'. N = 'Luis' A1 = 'Perez' A2 = 'Martinez' . 'Martinez'). | _. 5. 128234)). nacimiento( fecha( 10.Ejemplo: ?. _). | nacimiento( _. 241). ‘Puno')).ficha( identidad( N. No ficha( identidad( 'Luis'. 'Perez'. 1970). datos( 42232787. El nombre y apellidos de las personas nacidas en lugar(‘Ayaviri'. Puno direccion( calle( ‘San Martín'. A1. estudiante. A2).

identidad( 'Luis'. 'Martinez')). lugar('Ayaviri'. nacimiento( 5123. fecha( 10. 'Perez'. direccion( 5123. 5. poblacion( ‘Juliaca')). resulta conveniente simplificar la estructura de representación ficha( 5123. 1970). estudiante. 42232787. calle( ‘San Martín'. . 128234)). 241).A efectos de eficacia. ‘Puno')). datos( 5123.

ficha localizador identidad nombre apellido1 apellido2 . identidad( 'Luis'.ficha ( 5123. 'Martinez')). 'Perez'.

Ejemplo (cont. A2)). poblacion(‘Juliaca')). _)). No . | direccion( X. _. lugar( ‘Ayaviri'. identidad( N. X = 5183 N = 'Luis' A1 = 'Perez' A2 = 'Martinez' . A1. | nacimiento( X.): El nombre y apellidos de las personas nacidas en (cualquier) Ayaviri y que residan en Juliaca ?. _.ficha( X.

( c. (Cabeza. . . ( b.Listas . Cola ) b . c [] . (a. a . [ ] ))) . .

b.Lista1 = [a. ( b. c]. . b. b. a b c c [] .(a. | Lista2 = . . . [a. c ] = [] b . ( c. Yes a . . . []))).(b. b. c] . [ ] ))) Lista1 = [a. (a.(c. Listas (cont. c] Lista2 = [a.) ?.

(. d]). [b.(c. [b. [])).(d. . c].) [a.(b. []))) Yes . . d ] = [] a [] d b c ?. c ]. Listas (cont. . .display( [a.(a.

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

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

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

) Cadenas de caracteres como listas de códigos ASCII ?.name(X.105.243.name( lógica. X). 99.103. 105. 103. [108.99.Listas (cont. 97] Yes ?.97]). X = lógica Yes . 243. X = [108.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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