Prctica 2
Tutorial de (Visual Prolog)
Parte I
Programas Prolog (1)
Bases de datos + consultas:
empleado(juan, 22, e1). empleado(pedro, 19, e2). empleado(rosa, 22, e3). estudiante(rosa, informatica). estudiante(alberto, farmacia). estudiante_trabajador(X) ::estudiante(X,Y), empleado(X,Z,W). Sintaxis Procedimientos: hechos + reglas Variables: mayscula Predicados, constantes y funciones: minscula
Variable annima Varias soluciones!
?- empleado(N,22,_) -> N=juan; N=rosa ?- estudiante_trabajador(X) -> X = rosa
Germn Vidal
IDR Prctica 2
Curso 2007/08
Programas Prolog (2)
Punto de vista imperativo:
Programa = conjunto de procedimientos recursivos + cuerpo principal (opcional)
fib(n) = 1 fib(nfib(n-1) + fib(n-2) fib(nsi n=0 n=1 si n>1
fib(0,1). fib(1,1). No existe la asignacin destructiva! fib(N,X) ::N>1, M1 = N-1, M2 = N-2, NNfib(M1,X1), fib(M2,X2), X = X1+X2.
El resultado es un argumento ms
No se pueden anidar operaciones
Germn Vidal
IDR Prctica 2
Curso 2007/08
Programas Prolog (3)
x*y = 0 ((x((x-1)*y) + y si x=0 si x>0
producto(0,X,0). producto(X,Y,W+Y) :- X>0, producto(X-1,Y,W). :producto(Xdesanidar operaciones producto(0,X,0). producto(X,Y,Z) :- X>0, producto(X-1,Y,W), Z = W+Y. :producto(Xdesanidar operaciones producto(0,X,0). producto(X,Y,Z) :- X>0, X=X-1, producto(X,Y,W), Z=W+Y. :X=Xasignacin destructiva prohibida producto(0,X,0). producto(X,Y,Z) :- X>0, N=X-1, producto(N,Y,W), Z=W+Y. :N=X-
Germn Vidal
IDR Prctica 2
Curso 2007/08
Programas Visual Prolog
Secciones:
domains: domains: declaracin de tipos de datos (por ejemplo, integer/char/real/string/symbol son predefinidos) predicates: predicates: declaracin de tipos de los procedimientos clauses: clauses: implementacin de los procedimientos goal: goal: consultas / cuerpo principal del programa
Germn Vidal
IDR Prctica 2
Curso 2007/08
Programas Visual Prolog: Ejemplo
domains nombre = symbol numero = integer En general, mejor NO definir alias
predicates empleado(nombre,numero,string) fib(numero,numero) producto(integer,integer,integer) clauses empleado(juan, 22, e1). goal fib(3,X), producto(X,2,Y).
Sin punto al final
Con punto al final
Devuelve TODAS las soluciones!
Germn Vidal
IDR Prctica 2
Curso 2007/08
Otras secciones
database: database: declaracin de predicados modificables (en lugar de usar la seccin predicates) predicates)
Su implementacin en clauses
constants: constants: definicin de constantes
cero = 0 pi = 3.1415927
Germn Vidal
IDR Prctica 2
Curso 2007/08
Paso de parmetros
Basado en unificacin, un mecanismo bidireccional de paso de parmetros Ejemplos:
fib(N,X) :- :?- fib(3,Y). fib(N,X) :- :?- fib(3,6). empleado(juan,22,e1). ?- empleado(N,E,C).
Germn Vidal IDR Prctica 2 Curso 2007/08
Backtracking
Debido a que algunos procedimientos tienen varias soluciones, la ejecucin de un programa Prolog genera un rbol de bsqueda El rbol de bsqueda se explora mediante el mecanismo de backtracking Ejemplo: nat(N)
nat(0). nat(X) :- nat(Y), X = Y+1. :?- nat(N). N=0 nat(M) N=1 N=2 nat(P) nat(Q)
Curso 2007/08
Germn Vidal
IDR Prctica 2
Mecanismos de control (1)
No existe la iteracin!
aunque se puede simular (algo parecido) as:
prueba ::generador de soluciones empleado(A,B,C), write(A),nl, cuerpo del bucle fail. prueba. test (en este caso, siempre provoca backtracking!)
?- prueba. -> Imprime: juan, rosa,
Germn Vidal
IDR Prctica 2
Curso 2007/08
Mecanismos de control (2)
Tampoco hay case_of ni if_then_else
aunque se puede simular (algo parecido) as:
r(X) { case x of 1: write(1); 2: write(2); otherwise: write(3) } maximo(X,Y,Z) { if X>Y then Z:=X else Z:=Y } r(X) :- X=1, !, write(1). :r(X) :- X=2, !, write(2). :r(X) :- write(3). :-
maximo(X,Y,Z) :- X>Y, !, Z=X. :maximo(X,Y,Z) :- X<=Y, !, Z=Y. :-
Germn Vidal
IDR Prctica 2
Curso 2007/08
Ejercicio
Escribid un programa que muestre por pantalla el nombre del empleado de menor edad (usando la base de datos del primer ejemplo) Pista: Pista: hay que usar un bucle No se puede usar nada que no se haya visto hoy
Germn Vidal
IDR Prctica 2
Curso 2007/08