Download Programación Declarativa
Document related concepts
Transcript
Tema III
Predicados Extralógicos
de PROLOG
Programación Declarativa
1
Predicados Extralógicos
Se incorporan al lenguaje como predicados predefinidos con
usos limitados para
9 acceder a funciones del sistema operativo,
9 mejorar la eficiencia en los cálculos
(predicados aritméticos),
9 controlar la entrada y la salida de datos
(predicados de lectura y de escritura).
Programación Declarativa
2
PROLOG :
Gestión de ficheros
Programación Declarativa
3
SWI-Prolog: manejo de ficheros
pwd/0 – Produce una cadena con la ubicación del directorio de
trabajo.
ls/0 - Produce un listado con el contenido del directorio de
trabajo.
cd/1 - Convierte el directorio que figura en su argumento en
el directorio de trabajo
(La separación de directorios se hace como en UNIX con ‘/’).
make_directory/1 – Crea un directorio en el emplazamiento
especificado en el argumento.
consult/1 - Consulta el fichero especificado y lo carga en la
base de conocimiento del intérprete.
(Los ficheros con código Prolog deben tener la extensión .pl).
halt/0 – Termina la ejecución del intérprete.
Programación Declarativa
4
SWI-Prolog: edición y ayuda
edit/1
- edit(‘fichero’) edita el fichero especificado.
edit/0 - Edita el fichero que se haya cargado haciendo doble
clic con el ratón.
help/0
- Abre una ventana de diálogo con información de
ayuda.
help/1
- Abre una ventana de diálogo con información sobre
el predicado o el tema que figura en el argumento.
apropos/1 - Abre una ventana de diálogo con información
sobre todos los predicados relacionados con el tema que figura
en el argumento.
Programación Declarativa
5
PROLOG :
Aritmética extralógica
Programación Declarativa
6
Expresiones aritméticas
9 En Prolog se manejan números enteros y decimales con la notación
habitual.
9 Existe una serie de operadores aritméticos predefinidos:
X+Y, X-Y, -X, X*Y, X/Y, X//Y, X mod Y
funciones:
abs(X), sqrt(X), round(X), exp(X), log(X), log10(X),
sin(X), cos(X), tan(X), asin(X), acos(X), atan(X)
y constantes:
pi, e, random(N) (número entero dentro de [0,N) )
9 Las expresiones aritméticas se forman con números y con los
operadores y funciones anteriores.
Programación Declarativa
7
Evaluación de expresiones aritméticas
9 Las expresiones aritméticas no se evalúan en los argumentos
los predicados
definidos por el programador.
Se de
unifica
con el resultado
de evaluar la expresión
9 Las expresiones aritméticas sólo se evalúan en el predicado
X is Exp
y en los argumentos de los test de comparación:
E1>E2, E1>=E2, E1<E2, E1=<E2, E1=:=E2, E1=\=E2
9 Las expresiones que contienen variables libres no pueden
evaluarse
Se evalúan y se comparan
Programación Declarativa
8
Ejemplos
X is 2+5
7 is 2+5
X is 3+Y
Y is 4, X is 3+Y
evalúa la parte izq. y unifica X/7
evalúa la parte izq. y unifica 7/7
error al evaluar 3+Y
evalúa 3+Y a 7 y unifica X/7
3+7 > 2+5
3*2 =< 4//2
3+1=:=3+X
3+1=:=a+2
evalúa las dos partes y da éxito
evalúa las dos parte y da fallo
error al evaluar 3+X
error al evaluar a+2
Programación Declarativa
9
Ejercicios con aritmética extralógica
Cálculo del máximo y del mínimo de dos números.
Generador de números enteros de un intervalo.
Generador de números de un intervalo con un incremento dado.
Cálculo de factoriales.
Cálculo de números de Fibonacci.
Confección de menús y su contenido calórico.
Rompecabezas aritméticos:
SEND + MORE = MONEY
CASA + MESA + CAMA = VICIO
Cuadrado mágico de suma 15:
A B C
D E F
G H I
Programación Declarativa
10
Rompecabezas aritmético (I)
% SEND + MORE = MONEY
% Cada letra representa un dígito distinto
% Estrategia:
%
%
%
D3
S
+ M
M O
D2
E
O
N
D1 0
N D
R E
E Y
% suma con acarreo A+X+Y = D*10+U
suma(A,X,Y,D,U):- S is A + X + Y,
D is S//10,
U is S mod 10.
% Generador de dígitos
numero(N):- intervalo(0,9,N).
Programación Declarativa
11
Rompecabezas aritmético (II)
solucion1(S,E,N,D,M,O,R,Y):numero(D),
numero(E),E=\=D,
suma(0,D,E,D1,Y),Y=\=E,Y=\=D,
numero(N),N=\=Y,N=\=E,N=\=D,
numero(R),R=\=N,R=\=Y,R=\=E,R=\=D,
suma(D1,N,R,D2,E),
numero(O),O=\=R,O=\=N,O=\=Y,O=\=E,O=\=D,
suma(D2,E,O,D3,N),
numero(S),S=\=O,S=\=R,S=\=N,S=\=Y,S=\=E,S=\=D,
numero(M),M=\=S,M=\=O,M=\=R,M=\=N,M=\=Y,M=\=E,M=\=D,
suma(D3,S,M,M,O).
Programación Declarativa
12
Rompecabezas aritmético mejorado
% selecciona(X,AsXBs,AsBs)
selecciona(X,[X|_],[]).
selecciona(X,[Y|Xs],[Y|Ys]):-selecciona(X,Xs,Ys).
solucion2(C,A,M,V,I,N,O):selecciona(A,[1,2,3,4,5,6,7,8,9],L1),
selecciona(O,L1,L2),
suma(0,A,O,D1,O),
selecciona(M,L2,L3),
selecciona(N,L3,L4),
suma(D1,M,N,D2,I),selecciona(I,L4,L5),
suma(D2,A,I,D3,C),selecciona(C,L5,L6),
selecciona(V,L6,L7),
suma(D3,C,V,V,I).
Programación Declarativa
13
PROLOG:
Lectura y Escritura de Datos
Programación Declarativa
14
Lectura de teclado
9 read/1
:-read(X).
Lee un término introducido desde el teclado y lo
unifica con su argumento X
Probar:
read(X) y read(suma(X,3))
con las entradas 3+5 y suma(7,Y)
9 get/1 get0/1
:-get(X).
Lee un carácter imprimible, introducido desde el
teclado y lo unifica con su argumento X.
:-get0(X).
Lee también caracteres no imprimibles
Programación Declarativa
15
Escritura en pantalla
9 write/1
:-write(T).
Imprime el término T en la pantalla.
9 put/1
:-put(X).
Imprime el carácter X en la pantalla.
9 tab/1
:-tab(N).
Produce un salto de N posiciones en la pantalla.
9 nl/0
:-nl.
Produce un salto de línea en la pantalla.
Programación Declarativa
16
Adivina un número de 0 a 99 (I)
% adivina/0 predicado principal
adivina :nl, nl,
tab(10),
write('========ADIVINA UN NÚMERO ========='),
nl,
N is random(100),
adivina(N,0,99).
% adivina/3 predicado auxiliar
adivina(N,L,H) :nl, write('El número está entre '),
write(L), write(' y '), write(H), write(':'),
tab(5),read(P),
respuesta(N,P,L,H).
Programación Declarativa
17
Adivina un número de 0 a 99 (II)
respuesta(N,P,_,_) :- N=:=P,
nl,write('¡ENHORABUENA!, has acertado').
respuesta(N,P,L,H) :- P < L,
nl,write('Te has salido del rango. Prueba de nuevo'),
nl,adivina(N,L,H).
respuesta(N,P,L,H) :- H < P,
nl,write('Te has salido de rango. Prueba de nuevo'),
nl,adivina(N,L,H).
respuesta(N,P,L,H) :- L < P, P < H, N < P,
nl, write('Te has pasado. Prueba de nuevo'),
nl, adivina(N,L,P).
respuesta(N,P,L,H) :- L < P, P < H, N > P,
nl, write('No has llegado. Prueba de nuevo'),
nl, adivina(N,P,H).
Programación Declarativa
18