0% encontró este documento útil (0 votos)
187 vistas

Tutorial Prolog

Cargado por

Jean Paul Perea
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
187 vistas

Tutorial Prolog

Cargado por

Jean Paul Perea
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 12

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

También podría gustarte