La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Práctica 3 Tutorial de (Visual Prolog) Parte II. Germán Vidal 2IDR – Práctica 3 Curso 2007/08 Tipos de datos compuestos (1) PREDICATESbiblioteca(integer,string,string,string,integer)CLAUSES.

Presentaciones similares


Presentación del tema: "Práctica 3 Tutorial de (Visual Prolog) Parte II. Germán Vidal 2IDR – Práctica 3 Curso 2007/08 Tipos de datos compuestos (1) PREDICATESbiblioteca(integer,string,string,string,integer)CLAUSES."— Transcripción de la presentación:

1 Práctica 3 Tutorial de (Visual Prolog) Parte II

2 Germán Vidal 2IDR – Práctica 3 Curso 2007/08 Tipos de datos compuestos (1) PREDICATESbiblioteca(integer,string,string,string,integer)CLAUSES biblioteca(6, “El cuervo”, “Edgar A.”, “Poe”, 1845). DOMAINS libro = ficha(string,autor,integer) autor = autor(string,string) PREDICATESbiblioteca(integer,ficha)CLAUSES biblioteca(6, libro(“El cuervo”, autor(“Edgar A.”, “Poe”), 1845)). Problema: demasiados parámetros (aparentemente) inconexos… Usamos functores libro autor

3 Germán Vidal 3IDR – Práctica 3 Curso 2007/08 Tipos de datos compuestos (2) Es posible usar “;” cuando hay tipos alternativos: Es posible usar “;” cuando hay tipos alternativos:DOMAINS dato = integer ; char Error! Los tipos alternativos requieren un functor diferente DOMAINS dato = i(integer) ; c(char) Ejemplos: Ejemplos: i(38), c(‘a’), i(-23), c(‘A’), … problema dialog_int …

4 Germán Vidal 4IDR – Práctica 3 Curso 2007/08 Programació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, cuerpo del bucle, cuerpo del bucle, test. % o bien ‘fail’ test. % o bien ‘fail’ bucle. % sólo si usamos fail Si se parte de una especificación recursiva Si se parte de una especificación recursiva Fácil: Fácil: Convertir funciones en procedimientos Convertir funciones en procedimientos Desanidar funciones Desanidar funciones Usar variables temporales (evitar N = N+1!) Usar variables temporales (evitar N = N+1!) Si se parte de una especificación iterativa Si se parte de una especificación iterativa Transformarla primero en una especificación recursiva! Transformarla primero en una especificación recursiva!

5 Germán Vidal 5IDR – Práctica 3 Curso 2007/08 Programación recursiva: Ejemplo fact(N,Fact) P := 1; I := 1; WHILE I<= N DO P := P*I; I := I+1; Fact := P fact(N,Fact) fact_aux(N,Fact,1,1) fact_aux(N,Fact,1,1)fact_aux(N,Fact,I,P) IF I <= N IF 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 := P fact(N,Fact) :- fact_aux(N,Fact,1,1). 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(1,1). fact(N,M) :- NN = N-1, fact(NN,MM), M = MM*N.

6 Germán Vidal 6IDR – Práctica 3 Curso 2007/08 Tipos de datos recursivos: Listas (1) Declaración: Declaración:DOMAINS lista_enteros = integer* matriz_enteros = lista_enteros* elemento = i(integer) ; c(char) lista_mixta = elemento* Predefinidos (en un proyecto Visual Prolog): Predefinidos (en un proyecto Visual Prolog): ILIST (lista de enteros) ILIST (lista de enteros) SLIST (lista de strings) SLIST (lista de strings) Usadlos! (los alias dan errores…)

7 Germán Vidal 7IDR – Práctica 3 Curso 2007/08 Tipos de datos recursivos: Listas (2) Notación: Notación: Enumeración: [1, 2, 3, 4] Enumeración: [1, 2, 3, 4] [Cabeza|Cola]: [1 | [2, 3, 4]] [Cabeza|Cola]: [1 | [2, 3, 4]] [1, 2 | [3, 4]] [1, 2, 3 | [4]] [1, 2, 3, 4 | []] Siempre una secuencia de elementos separados por comas Siempre una lista

8 Germán Vidal 8IDR – Práctica 3 Curso 2007/08 Tipos de datos recursivos: Listas (3) Manipulación de listas: Manipulación de listas: Puesto que es un tipo de datos recursivo, hay que implementar procedimientos recursivos. Generalmente: Puesto que es un tipo de datos recursivo, hay que implementar procedimientos recursivos. Generalmente: Caso base: [] (lista vacía) Caso base: [] (lista vacía) Caso general: [H|R] (lista no vacía) Caso general: [H|R] (lista no vacía) Ejemplos: Ejemplos: Escritura de listas: Escritura de listas:escribir([]). escribir([H|R]) :- write(H), nl, escribir(R). Calcular el número de elementos: Calcular el número de elementos:nelem([],0). nelem([H|R], N) :- nelem(R,M), N = M+1.

9 Germán Vidal 9IDR – Práctica 3 Curso 2007/08 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,[_|R]) :- member(X,R). Concatenar dos listas: Concatenar dos listas: append([], L, L). append([H|R], L, [H|RL]) :- append(R, L, RL).

10 Germán Vidal 10IDR – Práctica 3 Curso 2007/08 Tipos de datos recursivos: Listas (5) Para obtener una lista con todas las soluciones a un procedimiento: Para obtener una lista con todas las soluciones a un procedimiento: findall(Var, Goal, Lista) Ejemplo: empleado(N,22,_) devuelve N=juan y N=rosa Ejemplo: empleado(N,22,_) devuelve N=juan y N=rosa findall(N,empleado(N,22,_),L) devuelve L=[juan,rosa] Características de findall : Características de findall : Var debe aparecer en Goal Var debe aparecer en Goal Si no hay ninguna solución falla (no devuelve nunca [] ) Si no hay ninguna solución falla (no devuelve nunca [] ) Puede contener repeticiones Puede contener repeticiones

11 Germán Vidal 11IDR – Práctica 3 Curso 2007/08 La base de datos interna (1) Declaración: Declaración: DATABASE – empleados empleado(string,integer,string) % y se elimina de % PREDICATES! CLAUSES% suele estar vacío... empleado(“juan”, 22, “e1”). empleado(“rosa”, 19, “e2”).... Consultas: como cualquier otro objetivo… Consultas: como cualquier otro objetivo… empleado(X,22,Y) -> X=“juan”, Y=“e1” empleado(“juan”,23,_) -> no (falla)...

12 Germán Vidal 12IDR – Práctica 3 Curso 2007/08 La base de datos interna (2) Modificación (en tiempo de ejecución): Modificación (en tiempo de ejecución): Añadir nuevas tuplas: assert, asserta, assertz Añadir nuevas tuplas: assert, asserta, assertz assert(empleado(“pedro”, 20, “e3”)) Eliminar tuplas: retract Eliminar tuplas: retract retract(empleado(“pedro”, 20, “e3”)) retract(empleado(X,Y,Z)) Eliminar todas las tuplas: retractall Eliminar todas las tuplas: retractall 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 Germán Vidal 13IDR – Práctica 3 Curso 2007/08 La base de datos interna (3) Operaciones con la base de datos: Operaciones con la base de datos: Almacenamiento de datos: save(“fichero”, “nombre_BD”) Almacenamiento de datos: save(“fichero”, “nombre_BD”)save(“miBD”,empleados) Consulta: consult(“fichero”, “nombre_BD”) Consulta: consult(“fichero”, “nombre_BD”)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)

14 Germán Vidal 14IDR – Práctica 3 Curso 2007/08 Ejercicio Repetir el mismo ejercicio de la sesión anterior (calcular el nombre del empleado más joven) empleando: Repetir el mismo ejercicio de la sesión anterior (calcular el nombre del empleado más joven) empleando: Un procedimiento recursivo Un procedimiento recursivo Los operadores assert/retract, findall, etc Los operadores assert/retract, findall, etc


Descargar ppt "Práctica 3 Tutorial de (Visual Prolog) Parte II. Germán Vidal 2IDR – Práctica 3 Curso 2007/08 Tipos de datos compuestos (1) PREDICATESbiblioteca(integer,string,string,string,integer)CLAUSES."

Presentaciones similares


Anuncios Google