SlideShare una empresa de Scribd logo
1 de 14
Práctica 3
Tutorial de (Visual Prolog)
Parte II
Germán Vidal 2 IDR – Práctica 3 Curso 2007/08
Tipos de datos compuestos (1)
PREDICATES
biblioteca(integer,string,string,string,integer)
CLAUSES
biblioteca(6, “El cuervo”, “Edgar A.”, “Poe”, 1845).
DOMAINS
libro = ficha(string,autor,integer)
autor = autor(string,string)
PREDICATES
biblioteca(integer,ficha)
CLAUSES
biblioteca(6, libro(“El cuervo”, autor(“Edgar A.”, “Poe”), 1845)).
Problema: demasiados parámetros (aparentemente) inconexos…
Usamos functores
libro
autor
Germán Vidal 3 IDR – Práctica 3 Curso 2007/08
Tipos de datos compuestos (2)
 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:
i(38), c(‘a’), i(-23), c(‘A’), …
problema dialog_int …
Germán Vidal 4 IDR – Práctica 3 Curso 2007/08
Programación recursiva
 Intentad evitar la programación iterativa…
 Si no hay más remedio:
bucle :- generador de soluciones,
cuerpo del bucle,
test. % o bien ‘fail’
bucle. % sólo si usamos fail
 Si se parte de una especificación recursiva
 Fácil:
 Convertir funciones en procedimientos
 Desanidar funciones
 Usar variables temporales (evitar N = N+1!)
 Si se parte de una especificación iterativa
 Transformarla primero en una especificación recursiva!
Germán Vidal 5 IDR – 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,I,P)
IF I <= N
THEN P := P*I;
I := I+1;
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,
NewI = I+1,
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.
Germán Vidal 6 IDR – Práctica 3 Curso 2007/08
Tipos de datos recursivos: Listas (1)
 Declaración:
DOMAINS
lista_enteros = integer*
matriz_enteros = lista_enteros*
elemento = i(integer) ; c(char)
lista_mixta = elemento*
 Predefinidos (en un proyecto Visual Prolog):
 ILIST (lista de enteros)
 SLIST (lista de strings) Usadlos! (los alias dan errores…)
Germán Vidal 7 IDR – Práctica 3 Curso 2007/08
Tipos de datos recursivos: Listas (2)
 Notación:
 Enumeración: [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
Germán Vidal 8 IDR – Práctica 3 Curso 2007/08
Tipos de datos recursivos: Listas (3)
 Manipulación de listas:
 Puesto que es un tipo de datos recursivo, hay que
implementar procedimientos recursivos. Generalmente:
 Caso base: [] (lista vacía)
 Caso general: [H|R] (lista no vacía)
 Ejemplos:
 Escritura de listas:
escribir([]).
escribir([H|R]) :- write(H), nl, escribir(R).
 Calcular el número de elementos:
nelem([],0).
nelem([H|R], N) :- nelem(R,M), N = M+1.
Germán Vidal 9 IDR – Práctica 3 Curso 2007/08
Tipos de datos recursivos: Listas (4)
 Más ejemplos:
 Comprobación de pertenencia:
member(X,[X|_]).
member(X,[_|R]) :- member(X,R).
 Concatenar dos listas:
append([], L, L).
append([H|R], L, [H|RL]) :- append(R, L, RL).
Germán Vidal 10 IDR – Práctica 3 Curso 2007/08
Tipos de datos recursivos: Listas (5)
 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
findall(N,empleado(N,22,_),L) devuelve L=[juan,rosa]
 Características de findall:
 Var debe aparecer en Goal
 Si no hay ninguna solución falla (no devuelve nunca [])
 Puede contener repeticiones
Germán Vidal 11 IDR – Práctica 3 Curso 2007/08
La base de datos interna (1)
 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…
empleado(X,22,Y) -> X=“juan”, Y=“e1”
empleado(“juan”,23,_) -> no (falla)
...
Germán Vidal 12 IDR – Práctica 3 Curso 2007/08
La base de datos interna (2)
 Modificación (en tiempo de ejecución):
 Añadir nuevas tuplas: assert, asserta, assertz
assert(empleado(“pedro”, 20, “e3”))
 Eliminar tuplas: retract
retract(empleado(“pedro”, 20, “e3”))
retract(empleado(X,Y,Z))
 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
Germán Vidal 13 IDR – Práctica 3 Curso 2007/08
La base de datos interna (3)
 Operaciones con la base de datos:
 Almacenamiento de datos: save(“fichero”, “nombre_BD”)
save(“miBD”,empleados)
 Consulta: consult(“fichero”, “nombre_BD”)
consult(“miBD”,empleados)
 Antes de consultar una BD, hay que “limpiar” la actual:
retractall(_, empleados)
Germán Vidal 14 IDR – 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:
 Un procedimiento recursivo
 Los operadores assert/retract, findall, etc

Más contenido relacionado

La actualidad más candente

Tema 0 Repaso Programación en Java
Tema 0 Repaso Programación en JavaTema 0 Repaso Programación en Java
Tema 0 Repaso Programación en JavaCarlos A. Iglesias
 
Tema 10: Evaluación perezosa en Haskell
Tema 10: Evaluación perezosa en HaskellTema 10: Evaluación perezosa en Haskell
Tema 10: Evaluación perezosa en HaskellJosé A. Alonso
 
Tema 6: Definiciones por recursión en Haskell
Tema 6: Definiciones por recursión en Haskell Tema 6: Definiciones por recursión en Haskell
Tema 6: Definiciones por recursión en Haskell José A. Alonso
 
Tema 11: Aplicaciones de la programación funcional con Haskell
Tema 11: Aplicaciones de la programación funcional con HaskellTema 11: Aplicaciones de la programación funcional con Haskell
Tema 11: Aplicaciones de la programación funcional con HaskellJosé A. Alonso
 
Descubriendo scala
Descubriendo scalaDescubriendo scala
Descubriendo scalanluaces
 
I1M2011-T4: Definición de funciones en Haskell
I1M2011-T4: Definición de funciones en HaskellI1M2011-T4: Definición de funciones en Haskell
I1M2011-T4: Definición de funciones en HaskellJosé A. Alonso
 
Funciones de Strings en PHP
Funciones de Strings en PHPFunciones de Strings en PHP
Funciones de Strings en PHPAngie Mejia
 
Tema 12: Analizadores sintácticos funcionales.
Tema 12: Analizadores sintácticos funcionales.Tema 12: Analizadores sintácticos funcionales.
Tema 12: Analizadores sintácticos funcionales.José A. Alonso
 
Python con un toque funcional
Python con un toque funcionalPython con un toque funcional
Python con un toque funcionalQuito Lambda
 
Operaciones Con Funciones
Operaciones Con FuncionesOperaciones Con Funciones
Operaciones Con FuncionesAngel Carreras
 
5-Unidad 1. Paradigma de la Programación-Orientación a Objetos
5-Unidad 1. Paradigma de la Programación-Orientación a Objetos5-Unidad 1. Paradigma de la Programación-Orientación a Objetos
5-Unidad 1. Paradigma de la Programación-Orientación a ObjetosLuis Fernando Aguas Bucheli
 
44 Php Informacion Sobre Variables
44 Php Informacion Sobre Variables44 Php Informacion Sobre Variables
44 Php Informacion Sobre VariablesJosé M. Padilla
 

La actualidad más candente (20)

Tema 0 Repaso Programación en Java
Tema 0 Repaso Programación en JavaTema 0 Repaso Programación en Java
Tema 0 Repaso Programación en Java
 
Tema 10: Evaluación perezosa en Haskell
Tema 10: Evaluación perezosa en HaskellTema 10: Evaluación perezosa en Haskell
Tema 10: Evaluación perezosa en Haskell
 
Tema 6: Definiciones por recursión en Haskell
Tema 6: Definiciones por recursión en Haskell Tema 6: Definiciones por recursión en Haskell
Tema 6: Definiciones por recursión en Haskell
 
Tipos basicos
Tipos basicosTipos basicos
Tipos basicos
 
Tema 11: Aplicaciones de la programación funcional con Haskell
Tema 11: Aplicaciones de la programación funcional con HaskellTema 11: Aplicaciones de la programación funcional con Haskell
Tema 11: Aplicaciones de la programación funcional con Haskell
 
Colecciones en Scala
Colecciones en ScalaColecciones en Scala
Colecciones en Scala
 
Descubriendo scala
Descubriendo scalaDescubriendo scala
Descubriendo scala
 
I1M2011-T4: Definición de funciones en Haskell
I1M2011-T4: Definición de funciones en HaskellI1M2011-T4: Definición de funciones en Haskell
I1M2011-T4: Definición de funciones en Haskell
 
Funciones de Strings en PHP
Funciones de Strings en PHPFunciones de Strings en PHP
Funciones de Strings en PHP
 
Tema 12: Analizadores sintácticos funcionales.
Tema 12: Analizadores sintácticos funcionales.Tema 12: Analizadores sintácticos funcionales.
Tema 12: Analizadores sintácticos funcionales.
 
Python con un toque funcional
Python con un toque funcionalPython con un toque funcional
Python con un toque funcional
 
Operaciones Con Funciones
Operaciones Con FuncionesOperaciones Con Funciones
Operaciones Con Funciones
 
5-Unidad 1. Paradigma de la Programación-Orientación a Objetos
5-Unidad 1. Paradigma de la Programación-Orientación a Objetos5-Unidad 1. Paradigma de la Programación-Orientación a Objetos
5-Unidad 1. Paradigma de la Programación-Orientación a Objetos
 
44 Php Informacion Sobre Variables
44 Php Informacion Sobre Variables44 Php Informacion Sobre Variables
44 Php Informacion Sobre Variables
 
Prolog2010
Prolog2010Prolog2010
Prolog2010
 
Arreglos
ArreglosArreglos
Arreglos
 
Dispersión y tablas hash
Dispersión y tablas hashDispersión y tablas hash
Dispersión y tablas hash
 
123507620 que-es-la-evaluacion-perezosa-docx
123507620 que-es-la-evaluacion-perezosa-docx123507620 que-es-la-evaluacion-perezosa-docx
123507620 que-es-la-evaluacion-perezosa-docx
 
Unidad 2
Unidad 2Unidad 2
Unidad 2
 
Sistemas de Razonamiento Lógico
Sistemas de Razonamiento LógicoSistemas de Razonamiento Lógico
Sistemas de Razonamiento Lógico
 

Similar a Practica Prolog

Similar a Practica Prolog (20)

Programacion en python_1
Programacion en python_1Programacion en python_1
Programacion en python_1
 
Sesión 12 -Diseño de BD_Ciclo_3.pptx
Sesión 12 -Diseño de BD_Ciclo_3.pptxSesión 12 -Diseño de BD_Ciclo_3.pptx
Sesión 12 -Diseño de BD_Ciclo_3.pptx
 
[Sesion03] introduccion python
[Sesion03] introduccion python[Sesion03] introduccion python
[Sesion03] introduccion python
 
Tipos de datos en R
Tipos de datos en RTipos de datos en R
Tipos de datos en R
 
Curso lisp
Curso lispCurso lisp
Curso lisp
 
Curso de R: 1.1. introducción al lenguaje (Objetos y operadores básicos)
Curso de R: 1.1. introducción al lenguaje (Objetos y operadores básicos)Curso de R: 1.1. introducción al lenguaje (Objetos y operadores básicos)
Curso de R: 1.1. introducción al lenguaje (Objetos y operadores básicos)
 
4 Introducción al lenguaje Scala
4 Introducción al lenguaje Scala4 Introducción al lenguaje Scala
4 Introducción al lenguaje Scala
 
Vba y objetos excel
Vba y objetos excelVba y objetos excel
Vba y objetos excel
 
Tema 5 - Estructuras de datos.pdf
Tema 5 - Estructuras de datos.pdfTema 5 - Estructuras de datos.pdf
Tema 5 - Estructuras de datos.pdf
 
Curso de Python
Curso de PythonCurso de Python
Curso de Python
 
Perl (practical extraction and report language)
Perl (practical extraction and report language)Perl (practical extraction and report language)
Perl (practical extraction and report language)
 
DDL
DDLDDL
DDL
 
9. listas y for-in
9.  listas y for-in9.  listas y for-in
9. listas y for-in
 
Tema2[php]
Tema2[php]Tema2[php]
Tema2[php]
 
arreglos y matrices
arreglos  y matricesarreglos  y matrices
arreglos y matrices
 
Introducción a Scala
Introducción a ScalaIntroducción a Scala
Introducción a Scala
 
Introducción a la programación y la informática. Tema 10
Introducción a la programación y la informática. Tema 10Introducción a la programación y la informática. Tema 10
Introducción a la programación y la informática. Tema 10
 
Computacion aplicada
Computacion aplicadaComputacion aplicada
Computacion aplicada
 
Clase ed v7
Clase ed v7Clase ed v7
Clase ed v7
 
3152
31523152
3152
 

Practica Prolog

  • 1. Práctica 3 Tutorial de (Visual Prolog) Parte II
  • 2. Germán Vidal 2 IDR – Práctica 3 Curso 2007/08 Tipos de datos compuestos (1) PREDICATES biblioteca(integer,string,string,string,integer) CLAUSES biblioteca(6, “El cuervo”, “Edgar A.”, “Poe”, 1845). DOMAINS libro = ficha(string,autor,integer) autor = autor(string,string) PREDICATES biblioteca(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 3 IDR – Práctica 3 Curso 2007/08 Tipos de datos compuestos (2)  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: i(38), c(‘a’), i(-23), c(‘A’), … problema dialog_int …
  • 4. Germán Vidal 4 IDR – Práctica 3 Curso 2007/08 Programación recursiva  Intentad evitar la programación iterativa…  Si no hay más remedio: bucle :- generador de soluciones, cuerpo del bucle, test. % o bien ‘fail’ bucle. % sólo si usamos fail  Si se parte de una especificación recursiva  Fácil:  Convertir funciones en procedimientos  Desanidar funciones  Usar variables temporales (evitar N = N+1!)  Si se parte de una especificación iterativa  Transformarla primero en una especificación recursiva!
  • 5. Germán Vidal 5 IDR – 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,I,P) IF I <= N THEN P := P*I; I := I+1; 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, NewI = I+1, 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 6 IDR – Práctica 3 Curso 2007/08 Tipos de datos recursivos: Listas (1)  Declaración: DOMAINS lista_enteros = integer* matriz_enteros = lista_enteros* elemento = i(integer) ; c(char) lista_mixta = elemento*  Predefinidos (en un proyecto Visual Prolog):  ILIST (lista de enteros)  SLIST (lista de strings) Usadlos! (los alias dan errores…)
  • 7. Germán Vidal 7 IDR – Práctica 3 Curso 2007/08 Tipos de datos recursivos: Listas (2)  Notación:  Enumeración: [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 8 IDR – Práctica 3 Curso 2007/08 Tipos de datos recursivos: Listas (3)  Manipulación de listas:  Puesto que es un tipo de datos recursivo, hay que implementar procedimientos recursivos. Generalmente:  Caso base: [] (lista vacía)  Caso general: [H|R] (lista no vacía)  Ejemplos:  Escritura de listas: escribir([]). escribir([H|R]) :- write(H), nl, escribir(R).  Calcular el número de elementos: nelem([],0). nelem([H|R], N) :- nelem(R,M), N = M+1.
  • 9. Germán Vidal 9 IDR – Práctica 3 Curso 2007/08 Tipos de datos recursivos: Listas (4)  Más ejemplos:  Comprobación de pertenencia: member(X,[X|_]). member(X,[_|R]) :- member(X,R).  Concatenar dos listas: append([], L, L). append([H|R], L, [H|RL]) :- append(R, L, RL).
  • 10. Germán Vidal 10 IDR – Práctica 3 Curso 2007/08 Tipos de datos recursivos: Listas (5)  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 findall(N,empleado(N,22,_),L) devuelve L=[juan,rosa]  Características de findall:  Var debe aparecer en Goal  Si no hay ninguna solución falla (no devuelve nunca [])  Puede contener repeticiones
  • 11. Germán Vidal 11 IDR – Práctica 3 Curso 2007/08 La base de datos interna (1)  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… empleado(X,22,Y) -> X=“juan”, Y=“e1” empleado(“juan”,23,_) -> no (falla) ...
  • 12. Germán Vidal 12 IDR – Práctica 3 Curso 2007/08 La base de datos interna (2)  Modificación (en tiempo de ejecución):  Añadir nuevas tuplas: assert, asserta, assertz assert(empleado(“pedro”, 20, “e3”))  Eliminar tuplas: retract retract(empleado(“pedro”, 20, “e3”)) retract(empleado(X,Y,Z))  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 13 IDR – Práctica 3 Curso 2007/08 La base de datos interna (3)  Operaciones con la base de datos:  Almacenamiento de datos: save(“fichero”, “nombre_BD”) save(“miBD”,empleados)  Consulta: consult(“fichero”, “nombre_BD”) consult(“miBD”,empleados)  Antes de consultar una BD, hay que “limpiar” la actual: retractall(_, empleados)
  • 14. Germán Vidal 14 IDR – 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:  Un procedimiento recursivo  Los operadores assert/retract, findall, etc