Successfully reported this slideshow.
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...
Prochain SlideShare
Chargement dans…5
×

Transparencias3

149 vues

Publié le

Publié dans : Business
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

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

×