Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Práctica 3Práctica 3
Tutorial de (Visual Prolog)Tutorial de (Visual Prolog)
Parte IIParte II
Germán Vidal 2 IDR – Práctica 3
Curso 2007/08
Tipos de datos compuestos (1)Tipos de datos compuestos (1)
PREDICATESPREDICA...
Germán Vidal 3 IDR – Práctica 3
Curso 2007/08
Tipos de datos compuestos (2)Tipos de datos compuestos (2)
 Es posible usar...
Germán Vidal 4 IDR – Práctica 3
Curso 2007/08
Programación recursivaProgramación recursiva
 Intentad evitar la programaci...
Germán Vidal 5 IDR – Práctica 3
Curso 2007/08
Programación recursiva: EjemploProgramación recursiva: Ejemplo
fact(N,Fact)f...
Germán Vidal 6 IDR – Práctica 3
Curso 2007/08
Tipos de datos recursivos: Listas (1)Tipos de datos recursivos: Listas (1)
...
Germán Vidal 7 IDR – Práctica 3
Curso 2007/08
Tipos de datos recursivos: Listas (2)Tipos de datos recursivos: Listas (2)
...
Germán Vidal 8 IDR – Práctica 3
Curso 2007/08
Tipos de datos recursivos: Listas (3)Tipos de datos recursivos: Listas (3)
...
Germán Vidal 9 IDR – Práctica 3
Curso 2007/08
Tipos de datos recursivos: Listas (4)Tipos de datos recursivos: Listas (4)
...
Germán Vidal 10 IDR – Práctica 3
Curso 2007/08
Tipos de datos recursivos: Listas (5)Tipos de datos recursivos: Listas (5)
...
Germán Vidal 11 IDR – Práctica 3
Curso 2007/08
La base de datos interna (1)La base de datos interna (1)
 Declaración:Decl...
Germán Vidal 12 IDR – Práctica 3
Curso 2007/08
La base de datos interna (2)La base de datos interna (2)
 Modificación (en...
Germán Vidal 13 IDR – Práctica 3
Curso 2007/08
La base de datos interna (3)La base de datos interna (3)
 Operaciones con ...
Germán Vidal 14 IDR – Práctica 3
Curso 2007/08
EjercicioEjercicio
 Repetir el mismo ejercicio de la sesión anterior (calc...
Upcoming SlideShare
Loading in …5
×

Transparencias3

165 views

Published on

Published in: Business
  • Be the first to comment

  • Be the first to like this

Transparencias3

  1. 1. Práctica 3Práctica 3 Tutorial de (Visual Prolog)Tutorial de (Visual Prolog) Parte IIParte II
  2. 2. Germán Vidal 2 IDR – Práctica 3 Curso 2007/08 Tipos de datos compuestos (1)Tipos de datos compuestos (1) PREDICATESPREDICATES biblioteca(integer,string,string,string,integer)biblioteca(integer,string,string,string,integer) CLAUSESCLAUSES biblioteca(6, “El cuervo”, “Edgar A.”, “Poe”, 1845).biblioteca(6, “El cuervo”, “Edgar A.”, “Poe”, 1845). DOMAINSDOMAINS libro = ficha(string,autor,integer)libro = ficha(string,autor,integer) autor = autor(string,string)autor = autor(string,string) PREDICATESPREDICATES biblioteca(integer,ficha)biblioteca(integer,ficha) CLAUSESCLAUSES biblioteca(6, libro(“El cuervo”, autor(“Edgar A.”, “Poe”), 1845)).biblioteca(6, libro(“El cuervo”, autor(“Edgar A.”, “Poe”), 1845)). Problema: demasiados parámetros (aparentemente) inconexos… Usamos functores libro autor
  3. 3. Germán Vidal 3 IDR – Práctica 3 Curso 2007/08 Tipos de datos compuestos (2)Tipos de datos compuestos (2)  Es posible usar “;” cuando hay tipos alternativos:Es posible usar “;” cuando hay tipos alternativos: DOMAINSDOMAINS dato = integer ; chardato = integer ; char Error! Los tipos alternativos requieren un functor diferenteError! Los tipos alternativos requieren un functor diferente DOMAINSDOMAINS dato = i(integer) ; c(char)dato = i(integer) ; c(char)  Ejemplos:Ejemplos: i(38), c(‘a’), i(-23), c(‘A’), …i(38), c(‘a’), i(-23), c(‘A’), … problema dialog_int …problema dialog_int …
  4. 4. Germán Vidal 4 IDR – Práctica 3 Curso 2007/08 Programación recursivaProgramación recursiva  Intentad evitar la programación iterativa…Intentad evitar la programación iterativa…  Si no hay más remedio:Si no hay más remedio: bucle :- generador de soluciones,bucle :- generador de soluciones, cuerpo del bucle,cuerpo del bucle, test.test. % o bien ‘fail’% o bien ‘fail’ bucle.bucle. % sólo si usamos fail% sólo si usamos fail  Si se parte de una especificación recursivaSi se parte de una especificación recursiva  Fácil:Fácil:  Convertir funciones en procedimientosConvertir funciones en procedimientos  Desanidar funcionesDesanidar funciones  Usar variables temporales (evitar N = N+1!)Usar variables temporales (evitar N = N+1!)  Si se parte de una especificación iterativaSi se parte de una especificación iterativa  Transformarla primero en una especificación recursiva!Transformarla primero en una especificación recursiva!
  5. 5. Germán Vidal 5 IDR – Práctica 3 Curso 2007/08 Programación recursiva: EjemploProgramación recursiva: Ejemplo fact(N,Fact)fact(N,Fact) P := 1;P := 1; I := 1;I := 1; WHILE I<= N DOWHILE I<= N DO P := P*I;P := P*I; I := I+1;I := I+1; Fact := PFact := P fact(N,Fact)fact(N,Fact) fact_aux(N,Fact,1,1)fact_aux(N,Fact,1,1) fact_aux(N,Fact,I,P)fact_aux(N,Fact,I,P) IF I <= NIF I <= N THEN P := P*I;THEN P := P*I; I := I+1;I := I+1; fact_aux(N,Fact,I,P)fact_aux(N,Fact,I,P) ELSE Fact := PELSE Fact := P fact(N,Fact) :- fact_aux(N,Fact,1,1).fact(N,Fact) :- fact_aux(N,Fact,1,1). fact_aux(N,Fact,I,P) :- I <= N, !,fact_aux(N,Fact,I,P) :- I <= N, !, NewP = P*I,NewP = P*I, NewI = I+1,NewI = I+1, fact_aux(N,Fact,I,P).fact_aux(N,Fact,I,P). fact_aux(N,Fact,I,P) :- Fact = P.fact_aux(N,Fact,I,P) :- Fact = P. fact(1,1).fact(1,1). fact(N,M) :-fact(N,M) :- NN = N-1,NN = N-1, fact(NN,MM),fact(NN,MM), M = MM*N.M = MM*N.
  6. 6. Germán Vidal 6 IDR – Práctica 3 Curso 2007/08 Tipos de datos recursivos: Listas (1)Tipos de datos recursivos: Listas (1)  Declaración:Declaración: DOMAINSDOMAINS lista_enteros = integer*lista_enteros = integer* matriz_enteros = lista_enteros*matriz_enteros = lista_enteros* elemento = i(integer) ; c(char)elemento = i(integer) ; c(char) lista_mixta = elemento*lista_mixta = elemento*  Predefinidos (en un proyecto Visual Prolog):Predefinidos (en un proyecto Visual Prolog):  ILISTILIST (lista de enteros)(lista de enteros)  SLISTSLIST (lista de strings)(lista de strings) Usadlos! (los alias dan errores…)Usadlos! (los alias dan errores…)
  7. 7. Germán Vidal 7 IDR – Práctica 3 Curso 2007/08 Tipos de datos recursivos: Listas (2)Tipos de datos recursivos: Listas (2)  Notación:Notación:  Enumeración:Enumeración: [1, 2, 3, 4][1, 2, 3, 4]  [Cabeza|Cola]:[Cabeza|Cola]: [[11 || [2, 3, 4][2, 3, 4]]] [[1, 21, 2 || [3, 4][3, 4]]] [[1, 2, 31, 2, 3 || [4][4]]] [[1, 2, 3, 41, 2, 3, 4 || [][]]] Siempre una secuencia de elementos separados por comas Siempre una lista
  8. 8. Germán Vidal 8 IDR – Práctica 3 Curso 2007/08 Tipos de datos recursivos: Listas (3)Tipos de datos recursivos: Listas (3)  Manipulación de listas:Manipulación de listas:  Puesto que es un tipo de datos recursivo, hay quePuesto que es un tipo de datos recursivo, hay que implementar procedimientos recursivos. Generalmente:implementar procedimientos recursivos. Generalmente:  Caso base:Caso base: [][] (lista vacía)(lista vacía)  Caso general:Caso general: [H|R][H|R] (lista no vacía)(lista no vacía)  Ejemplos:Ejemplos:  Escritura de listas:Escritura de listas: escribir([]).escribir([]). escribir([H|R]) :- write(H), nl, escribir(R).escribir([H|R]) :- write(H), nl, escribir(R).  Calcular el número de elementos:Calcular el número de elementos: nelem([],0).nelem([],0). nelem([H|R], N) :- nelem(R,M), N = M+1.nelem([H|R], N) :- nelem(R,M), N = M+1.
  9. 9. Germán Vidal 9 IDR – Práctica 3 Curso 2007/08 Tipos de datos recursivos: Listas (4)Tipos de datos recursivos: Listas (4)  Más ejemplos:Más ejemplos:  Comprobación de pertenencia:Comprobación de pertenencia: member(X,[X|_]).member(X,[X|_]). member(X,[_|R]) :- member(X,R).member(X,[_|R]) :- member(X,R).  Concatenar dos listas:Concatenar dos listas: append([], L, L).append([], L, L). append([H|R], L, [H|RL]) :- append(R, L, RL).append([H|R], L, [H|RL]) :- append(R, L, RL).
  10. 10. Germán Vidal 10 IDR – Práctica 3 Curso 2007/08 Tipos de datos recursivos: Listas (5)Tipos de datos recursivos: Listas (5)  Para obtener una lista con todas las soluciones a unPara obtener una lista con todas las soluciones a un procedimiento:procedimiento: findall(Var, Goal, Lista)findall(Var, Goal, Lista)  Ejemplo:Ejemplo: empleado(N,22,_)empleado(N,22,_) devuelvedevuelve N=juanN=juan yy N=rosaN=rosa findall(N,empleado(N,22,_),L)findall(N,empleado(N,22,_),L) devuelvedevuelve L=[juan,rosa]L=[juan,rosa]  Características deCaracterísticas de findallfindall::  VarVar debe aparecer endebe aparecer en GoalGoal  Si no hay ninguna soluciónSi no hay ninguna solución fallafalla (no devuelve nunca(no devuelve nunca [][]))  Puede contener repeticionesPuede contener repeticiones
  11. 11. Germán Vidal 11 IDR – Práctica 3 Curso 2007/08 La base de datos interna (1)La base de datos interna (1)  Declaración:Declaración: DATABASE – empleadosDATABASE – empleados empleado(string,integer,string)empleado(string,integer,string) % y se elimina de% y se elimina de % PREDICATES!% PREDICATES! CLAUSESCLAUSES % suele estar vacío...% suele estar vacío... empleado(“juan”, 22, “e1”).empleado(“juan”, 22, “e1”). empleado(“rosa”, 19, “e2”).empleado(“rosa”, 19, “e2”). ......  Consultas: como cualquier otro objetivo…Consultas: como cualquier otro objetivo… empleado(X,22,Y)empleado(X,22,Y) -> X=“juan”, Y=“e1”-> X=“juan”, Y=“e1” empleado(“juan”,23,_)empleado(“juan”,23,_) -> no (falla)-> no (falla) ......
  12. 12. Germán Vidal 12 IDR – Práctica 3 Curso 2007/08 La base de datos interna (2)La base de datos interna (2)  Modificación (en tiempo de ejecución):Modificación (en tiempo de ejecución):  Añadir nuevas tuplas:Añadir nuevas tuplas: assert, asserta, assertzassert, asserta, assertz assert(empleado(“pedro”, 20, “e3”))assert(empleado(“pedro”, 20, “e3”))  Eliminar tuplas:Eliminar tuplas: retractretract retract(empleado(“pedro”, 20, “e3”))retract(empleado(“pedro”, 20, “e3”)) retract(empleado(X,Y,Z))retract(empleado(X,Y,Z))  Eliminar todas las tuplas:Eliminar todas las tuplas: retractallretractall retractall(empleado(_, 20, _))retractall(empleado(_, 20, _)) Siempre sin variables! Elimina el primero, backtracking para seguir eliminando… Elimina todas los empleados cuya edad es 20 sin realizar backtracking
  13. 13. Germán Vidal 13 IDR – Práctica 3 Curso 2007/08 La base de datos interna (3)La base de datos interna (3)  Operaciones con la base de datos:Operaciones con la base de datos:  Almacenamiento de datos:Almacenamiento de datos: save(“fichero”, “nombre_BD”)save(“fichero”, “nombre_BD”) save(“miBD”,empleados)save(“miBD”,empleados)  Consulta:Consulta: consult(“fichero”, “nombre_BD”)consult(“fichero”, “nombre_BD”) consult(“miBD”,empleados)consult(“miBD”,empleados)  Antes de consultar una BD, hay que “limpiar” la actual:Antes de consultar una BD, hay que “limpiar” la actual: retractall(_, empleados)retractall(_, empleados)
  14. 14. Germán Vidal 14 IDR – Práctica 3 Curso 2007/08 EjercicioEjercicio  Repetir el mismo ejercicio de la sesión anterior (calcular elRepetir el mismo ejercicio de la sesión anterior (calcular el nombre del empleado más joven) empleando:nombre del empleado más joven) empleando:  Un procedimiento recursivoUn procedimiento recursivo  Los operadoresLos operadores assert/retractassert/retract,, findallfindall, etc, etc

×