Práctica 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: mayúscula Predicados, constantes y funciones: minúscula Variable anónima ?- empleado(N,22,_) -> N=juan; N=rosa ?- estudiante_trabajador(X) -> X = rosa Germán Vidal Varias soluciones! IDR – Práctica 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(nfib(n-2) si n=0 ó n=1 si n>1 El resultado es un argumento más fib(0,1). fib(1,1). No existe la asignación destructiva! fib(N,X) ::N>1, M1 = NN-1, M2 = N N-2, fib(M1,X1), fib(M2,X2), X = X1+X2. No se pueden anidar operaciones Germán Vidal IDR – Práctica 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(Xproducto(X-1,Y,W). desanidar operaciones producto(0,X,0). producto(X,Y,Z) ::- X>0, producto(X producto(X-1,Y,W), Z = W+Y. desanidar operaciones producto(0,X,0). producto(X,Y,Z) ::- X>0, X=X X=X-1, producto(X,Y,W), Z=W+Y. asignación destructiva prohibida producto(0,X,0). producto(X,Y,Z) ::- X>0, N=X N=X-1, producto(N,Y,W), Z=W+Y. Germán Vidal IDR – Práctica 2 Curso 2007/08 Programas Visual Prolog Secciones: domains: declaración de tipos de datos (por ejemplo, domains: integer/char/real/string/symbol son predefinidos) predicates:: declaración de tipos de los procedimientos predicates clauses:: implementación de los procedimientos clauses goal:: consultas / cuerpo principal del programa goal Germán Vidal IDR – Práctica 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). Germán Vidal Sin punto al final… Con punto al final Devuelve TODAS las soluciones! IDR – Práctica 2 Curso 2007/08 Otras secciones database: declaración de predicados “modificables” database: (en lugar de usar la sección predicates predicates)) Su implementación en clauses constants:: definición de constantes constants cero = 0 pi = 3.1415927 Germán Vidal IDR – Práctica 2 Curso 2007/08 Paso de parámetros Basado en “unificación”, un mecanismo bidireccional de paso de parámetros Ejemplos: fib(N,X) ::- … ?- fib(3,Y). fib(N,X) ::- … ?- fib(3,6). empleado(juan,22,e1). ?- empleado(N,E,C). Germán Vidal IDR – Práctica 2 Curso 2007/08 Backtracking Debido a que algunos procedimientos tienen varias soluciones, la ejecución de un programa Prolog genera un árbol de búsqueda El árbol de búsqueda 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 nat(P) N=2 Germán Vidal nat(Q) … IDR – Práctica 2 Curso 2007/08 Mecanismos de control (1) No existe la iteración! …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, … Germán Vidal IDR – Práctica 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 } Germán Vidal 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. IDR – Práctica 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:: hay que usar un bucle… Pista No se puede usar nada que no se haya visto hoy… Germán Vidal IDR – Práctica 2 Curso 2007/08