Práctica 2

Anuncio
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
Descargar