Download Programación Declarativa

Document related concepts

Mercury (lenguaje) wikipedia , lookup

Programación lógica wikipedia , lookup

Prolog wikipedia , lookup

Programación declarativa wikipedia , lookup

ABSYS wikipedia , lookup

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