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