Contenido Predicados Extra-lógicos Ingeniería Informática Ingeniería Técnica en Informática de Sistemas 1. 2. 3. 4. 5. 6. Predicados extra-lógicos Predicados aritméticos Entrada/salida de términos Unificación y no unificación Comparación de términos Declaración de operadores Departamento de Lenguajes y Ciencias de la Computación Universidad de Málaga Predicados Extra-lógicos 2 Prolog = Programación lógica Base teórica: Prolog puro se basa exclusivamente en la lógica de Horn consultas Predicados Extra-lógicos Programa (cláusulas de Horn) respuestas computadas Motor de Inferencia (SLD-Resolución) Ventajas: análisis y transformación de programas Inconvenientes: acceso a recursos hardware/software Predicados Extra-lógicos 4 Prolog = Programación lógica + Extra-lógica Predicados extra-lógicos (I) Aplicación práctica: extendemos extra-lógicamente el lenguaje para dar acceso a ciertos recursos (aritmética, entrada/salida…) Programa (cláusulas de Horn) Características comunes: están predefinidos por el sistema Prolog (bibliotecas) consultas se resuelven al margen de la SLD-Resolución, aprovechando el hardware/software de la plataforma respuestas computadas tienen asociado un algoritmo de evaluación cuya ejecución termina en éxito o fracaso, o bien genera un error Motor de Inferencia (SLD-Resolución) + Evaluador Extra-lógico Predicados Extra-lógicos suelen ser deterministas (respuesta única) y soportar sólo algunos usos Ventajas: aplicación práctica, expresividad, eficiencia Inconvenientes: dificulta análisis y transformación de programas 5 Predicados Extra-lógicos Predicados extra-lógicos (y II) Sólo estudiaremos algunos predicados extra-lógicos: aritméticos entrada/salida comparación de términos declaración de operadores Predicados Aritméticos Anotaremos las cabeceras de los predicados extra-lógicos con los usos posibles (+ entrada, - salida, ? entrada o salida): Ejemplo: is(?X,+Y) read(-X) write(+X) Predicados Extra-lógicos 7 6 Predicados aritméticos Operadores Prolog Permiten evaluar expresiones aritméticas: Definición: un operador Prolog es un functor de aridad 1 o 2 que puede escribirse de forma prefija, postfija o infija, prescindiendo de los paréntesis (1 + sqrt(5)) / 2 = 1.61803 Para incorporar expresiones aritméticas a Prolog es necesario: Ejemplo: X + Y +(X,Y) - X -(X) extender la sintaxis para soportar operadores (1 + sqrt(5)) / 2 son un mecanismo exclusivamente asociada ninguna operación (semántica) añadir funciones aritméticas predefinidas (sqrt,sin, …) añadir un predicado extra-lógico que solicite la evaluación de expresiones aritméticas (Prolog no evalúa términos) para evitar asociatividad ambigüedades, se % +/2, infijo % -/1, prefijo sintáctico, definen no tienen prioridades y pueden ser predefinidos o declarados por el usuario Predicados Extra-lógicos 9 Operadores aritméticos + Y – Y X * Y / Y // Y mod Y ** Y Prolog predefine las siguientes funciones aritméticas básicas: suma resta menos unario producto cociente cociente división entera resto división entera potencia abs(X) sign(X) max(X,Y) min(X,Y) random(X) sqrt(X) floor(X) ceiling(X) round(X) truncate(X) al escribir 5 + 3 * 7 Prolog entiende +(5, *(3,7)) Prolog no evalúa los términos: +(5, *(3,7)) ≠ 26 Predicados Extra-lógicos 10 Funciones aritméticas básicas Prolog predefine los siguientes operadores aritméticos: X X X X X X X Predicados Extra-lógicos 11 Predicados Extra-lógicos valor absoluto signo (-1, 0, 1) máximo mínimo entero aleatorio entre 0 y X-1 raíz cuadrada techo suelo redondeo truncamiento 12 Otras funciones aritméticas Expresión aritmética trigonométricas: Definición: un término Prolog es un expresión aritmética si 1) sus functores son operadores o funciones aritméticas 2) sus constantes son funciones aritméticas o números 3) sus variables están instanciadas a expresiones aritméticas sin(X), cos(X), tan(X) asin(X,Y), acos(X), atan(X), atan(X,Y) logarítmicas y exponenciales: 2.0 * (pi + sin(X)) cos(a)**2 5 + Y 2.0 * (pi + sin(X)) log(X), log10(X) exp(X) constantes: pi, e Predicados Extra-lógicos una expresión aritmética no contiene variables libres una expresión aritmética es un término no se evalúa por defecto 13 El predicado aritmético is/2 Predicados Extra-lógicos 14 Usos del predicado is/2 se utiliza para evaluar expresiones aritméticas ?- 9 is 2*4+1. Yes ?- X is 2*4+1. X = 9 ; No ?- Y = 2*4, X is Y+1. X = 9 ; No ?- Phi is (1+sqrt(5))/2. Phi = 1.61803 ; No ?- X is 2/(1-1). ERROR: Arithmetic: evaluation error: `zero_divisor‘ is(?X,+Y) X debe ser una variable libre o un número Y debe ser una expresión aritmética algoritmo is(X,Y) 1. v = evaluar(Y) (si hay error, se eleva una excepción) 2. unificar X con v, acabando en éxito o fracaso el predicado is/2 puede instanciar la variable X el functor is/2 es un operador: is(X,Y) = X is Y Predicados Extra-lógicos X libre, no es expresión aritmética no es una expresión aritmética {Y/b}, no es una expresión aritmética {X/2*5} una expresión aritmética 15 Predicados Extra-lógicos 16 Errores comunes al usar is/2 Operadores relacionales aritméticos ?- X is Y+1. ERROR: Arguments are not sufficiently instantiated +X =:= +Y +X =\= +Y ?- X is y+1. ERROR: Arithmetic: `y/0' is not a function +X < +Y +X > +Y +X =< +Y +X >= +Y X e Y deben ser expresiones aritméticas ?- 8+1 is 2*4+1. No algoritmo X comp Y 1. vx= evaluar(X), vy= evaluar(Y) (si hay error, elevar excepción) 2. res= vx comp vy 3. si res es cierto acabar con éxito, sino acabar con fracaso donde comp ∈ {=:=, =\=, <, >, =<, >=} ?- X = 0, X is X+1. No Predicados Extra-lógicos Se emplean para comparar expresiones aritméticas: 17 Uso de la comparación aritmética Predicados Extra-lógicos 18 Programando con predicados extra-lógicos Sólo se puede usar como test (+,+), pues no hay variables libres: Las técnicas de programación básicas siguen disponibles: ?- 2.0 =:= 1.0 + 1.0. Yes recursión recursión de cola generar/comprobar ?- 2 =:= 1.0 + 1.0. Yes pero su aplicación esconde algunos matices ?- 3 < 6 < 9. ERROR: Syntax error: Operator priority clash Definiremos versiones extra-lógicas de los predicados sobre naturales ?- X is (3 < 9). ERROR: Arithmetic: `(<)/2' is not a function Predicados Extra-lógicos 19 Predicados Extra-lógicos 20 Predicados extra-lógicos y usos posibles Predicados extra-lógicos y recursión % menor(+X,+Y) menor(X,Y) :- X < Y. factorial(0,1). factorial(X,F) :X > 0, X1 is X-1, factorial(X1,T), F is X*T. % minimo(+X,+Y,?Z) minimo(X,Y,X) :- X =< Y. minimo(X,Y,Y) :- Y < X. % suma(+X,+Y,?Z) suma(X,Y,Z) :- Z is X+Y. 21 Predicados extra-lógicos y recursión de cola Predicados Extra-lógicos 22 Predicados extra-lógicos y generadores factorial(X,F) :- fact_cola(X,1,F). entre(I,J,I) :I =< J. entre(I,J,K) :I < J, I1 is I+1, entre(I1,J,K). fact_cola(0,F,F). fact_cola(X,Ac,F) :% guarda X > 0, X1 is X-1, % reducción Ac1 is X*Ac, % actualización fact_cola(X1,Ac1,F). Uso (+,+,+) (+,+,-) La unificación pierde potencia: no basta para distinguir casos base y recursivo no puede reducir el problema ni actualizar acumulador Predicados Extra-lógicos % composición La unificación pierde potencia: no basta para distinguir casos base y recursivo no puede reducir el problema ni componer la solución Ventajas: simplicidad, eficiencia Inconvenientes: menos usos posibles (no son relacionales) Predicados Extra-lógicos % guarda % reducción Comportamiento test generador acotado Significado comprueba I K J genera K= I,…,J Los casos base y recursivo no son excluyentes generación 23 Predicados Extra-lógicos 24 Predicados extra-lógicos y generar/comprobar Problema: descomponer un natural N en suma de dos pares X e Y Aplicación: puzzles cripto-aritméticos Problema: Dada la suma de letras % es_par(+X) es_par(X) :- X mod 2 =:= 0. % en_pares(+N,?X,?Y) en_pares(N,X,Y) :es_par(N), entre(0,N,X), es_par(X), Y is N-X. Predicados Extra-lógicos + V % % % % comprobar generar (acotado) comprobar generar (único) 25 Ejercicios A E M A S A I C I O asignar a cada letra un dígito distinto entre 0 y 9 de manera que la suma resultante cuadre Sugerencia: aplicar el paradigma generar/comprobar Predicados Extra-lógicos 26 Ejercicios Define los siguientes predicados: 9. Resuelve el puzzle cripto-aritmético: 1. es_natural(X), genera los naturales X = 0,1,2,3,… 2. es_entero(X), genera los enteros X = 0,-1,1,-2,2,… 3. num_digitos(X,Y), el entero X tiene Y digitos 4. dig_iesimo(X,I,D), D es el I-ésimo dígito del entero X 5. mcd(X,Y,Z), Z es el máximo común divisor de X e Y 6. pascal(I,J,X), X es el elemento (I,J) del triángulo de Pascal 7. fibonacci(N,F), F es el N-ésimo Fibonacci 8. biseccion(F,A,B,R), R es una raíz de la función F en el intervalo [A,B] Predicados Extra-lógicos C M 27 + S E N D M O R E M O N E Y 10. Dada la matriz de orden 3 A D G B E H C F I asigna a cada letra un dígito distinto, de manera que las filas, columnas y diagonales principales sumen 15 Predicados Extra-lógicos 28 Periféricos y flujos La entrada/salida de Prolog está basada en flujos: los flujos permiten tratar uniformemente una variedad de periféricos, como una secuencia de información Entrada/Salida de Términos un flujo es un tipo abstracto que soporta, entre otras, operaciones de apertura, cierre, lectura y escritura un flujo puede estar en cuatro modos de operación: entrada, salida, concatenación y actualización un flujo soporta tres tipos de información: binarios, texto y términos Predicados Extra-lógicos Flujos de términos y entrada/salida estándar Términos Prolog y salida estándar un flujo de términos es una secuencia de términos Prolog terminados en un punto y separados por blancos (espacios, tabuladores y saltos de línea) write(+X) escribe el término X en la salida estándar Ejemplo: nl t(h(X), a). 4*pi. s(s(s(c))). escribe un fin de línea en la salida estándar f(A,1+2). s(s(a)). sólo se pueden leer y escribir términos completos para simplificar, emplearemos flujos de términos asociados a la entrada y salida estándar (por defecto, teclado y pantalla) Predicados Extra-lógicos 30 31 tab(+N) escribe N espacios en la salida estándar (N es una expresión aritmética entera) display(+X) escribe el término X en la salida estándar (sin tener en cuenta las declaraciones de operadores) Predicados Extra-lógicos 32 Ejemplos de salida estándar Términos Prolog y entrada estándar ?- write(2*5+1). 2*5+1 % Prolog no evalúa los términos ?- write(s(s(X))). s(s(_G278)) % X está libre ?- display(2*5+1). +(*(2,5),1) % tal y como lo entiende Prolog ?- tab(3+5), write(a). % tab/1 es aritmético a Predicados Extra-lógicos Ejemplo: ?– read(X). :| f(A,2*pi). X = f(_G275,2*pi) Yes ?- read(fecha(D,M,A)). |: fecha(2,febrero). No Prolog muestra el cursor |: cuando espera datos por teclado 33 Ejemplo: una calculadora simple (I) Predicados Extra-lógicos 34 Ejemplo: una calculadora simple (y II) Escribir un programa Prolog que acepte por teclado expresiones aritméticas sin variables y muestre el resultado de evaluarlas. El programa debe terminar al introducir la palabra fin. Ejemplo: ?>> 17 >> -1 >> read(-X) lee el siguiente término de la entrada estándar y lo unifica con X, acabando en éxito o fracaso. Aunque es un generador único, cada reevaluación puede generar una respuesta distinta (efecto lateral) calc. 2+3*5. calc :write('>> '), read(Exp), evalua(Exp). evalua(fin). evalua(Exp) :Exp \= fin, R is Exp, write_ln(R), calc. sin(pi) + cos(pi). fin. % Exp y fin no unifican % write + nl Yes Predicados Extra-lógicos 35 Predicados Extra-lógicos 36 Unificación y no unificación ?X = ?Y unifica X con Y, instanciando variables (test o generador único) no tiene en cuenta el test de ocurrencia Unificación y No Unificación +X \= +Y comprueba que X e Y no unifican (test, no instancia variables) no tiene en cuenta el test de ocurrencia unify_with_occurs_check(?X,?Y) unifica X con Y, instanciando variables (test o generador único) tiene en cuenta el test de ocurrencia No son extra-lógicos Predicados Extra-lógicos 38 Orden estándar de los términos Prolog define una relación de orden total sobre los términos: Comparación de Términos 1. 2. 3. 4. 5. variables < números < átomos < estructuras las variables se comparan por la “edad”: antigua < nueva los números se comparan por su valor los átomos se comparan alfabéticamente las estructuras se comparan: primero, numéricamente por la aridad, después, alfabéticamente por el átomo del functor recursivamente, argumento a argumento de izq. a der. Los términos Prolog satisfacen la propiedad de tricotomía Predicados Extra-lógicos 40 Comparación de términos Prolog Ejemplos de comparación de términos Prolog predefine los siguientes operadores: ?- 1 + 2 == 1 + 2. Yes +X == +Y +X \== +Y +X @< +Y +X @> +Y +X @=< +Y +X @>= +Y ?- 1 + 2 == 2 + 1. No ?- 1 + 2 =:= 2 + 1. Yes todos son tests (+,+), no instancian variables el evaluador extra-lógico ejecuta la comparación según el orden estándar, dando lugar a un éxito o un fracaso Predicados Extra-lógicos % no evalúa 41 ?- f(X) == f(Y). No % no instancia ?- f(X) = f(Y). X = Y = _G251 Predicados Extra-lógicos 42 Operadores Prolog mejoran la legibilidad, permitiendo prescindir de los paréntesis son una mera facilidad sintáctica, no tienen asociada ninguna operación (semántica) Declaración de Operadores Ejemplo: 2 + 3 * 5 = +(2,*(3,5)) la precedencia y asociatividad evitan ambigüedades que resultan al prescindir de los paréntesis Ejemplo: X ** 3 mod 13 = (X**3) mod 13 1+2-3+4-5 = (((1+2)-3)+4)-5 Predicados Extra-lógicos 44 Precedencia de operadores Asociatividad de operadores cada operador tiene asignada una precedencia (1..1200) Dado un término Prolog, su precedencia es: si es compuesto la de su functor principal si no es compuesto (constante o variable) 0 si está entre paréntesis 0 Ejemplo: 2 + A * 3 % prec: + 500 + se aplica cuando coinciden las precedencias un operador puede ser: asociativo a la izquierda: su argumento izquierdo puede tener menor o igual precedencia asociativo a la derecha: su argumento derecho puede tener menor o igual precedencia no asociativo: sus argumentos deben tener menor precedencia * 400 Ejemplo: A * B / 2 mayor precedencia 500 % *,/ 400, asoc. izq. 400 / 2 * A 400 3 400 * menor precedencia Predicados Extra-lógicos A 45 La directiva op/3 B Predicados Extra-lógicos 46 El predicado current_op/3 El programador puede declarar sus propios operadores: Permite consultar qué operadores hay predefinidos y declarados: :- op(+Precedencia, +Tipo, +Nombre). current_op(?Precedencia, ?Tipo, ?Nombre) Precedencia: un entero entre 1 y 1200 Tipo: indica posición (f) y asociatividad (y) o no (x) yfx infijo, asociativo a la izquierda xfy infijo, asociativo a la derecha xfx infijo, no asociativo fy prefijo, asociativo fx prefijo, no asociativo yf postfijo, asociativo xf postfijo, no asociativo Nombre: átomo Predicados Extra-lógicos 2 Ejemplo: ?- current_op(P,T,-). P = 500 T = fx ; P = 500 T = yfx ; No 47 Predicados Extra-lógicos 48 Ejemplo: ¿quién habla qué? Aritmética de Peano y operadores (I) Operador: :- op(800,xfx,habla). Objetos: declaramos un operador para representar naturales :- op(100,fy,s). Predicado: % habla/2: persona habla idioma. elena habla ingles. elena habla frances. juan habla ingles. francisco habla ingles. francisco habla aleman. marisa habla esperanto. marisa habla italiano. Objetivos: Predicados Extra-lógicos 49 Aritmética de Peano y operadores (II) operadores aritméticos están Predicados Extra-lógicos 50 Solución: introducimos un operador que conecte una operación aritmética básica con su resultado :- op(800,xfx,=´). Problema: los operadores aritméticos son binarios (+/2), y las relaciones aritméticas son ternarias (suma/3) ??? :- … ??? :- … El predicado =´/2 es una versión lógica (simplificada) de is/2 A =´ B B es el natural que resulta de la operación aritmética A Ejemplo: % =´/2, operación + c + Y =´ Y :- es_natural Y. s X + Y =´ s Z :- X + Y =´ Z. ¿Cómo lo resolvemos? Predicados Extra-lógicos :- op(800, fx, es_natural). Aritmética de Peano y operadores (y III) Ejemplo: podemos escribir s s s c + s s c % suma/3 c + Y s X + Y Definición de dominio: declaramos un operador es_natural es_natural c. es_natural s X :- es_natural X. ?- Quien habla ingles. ?- elena habla Que. ?- Quien habla Que. Relaciones aritméticas: los predefinidos (+,*,**,…) Ejemplo: s s s s c s(s(s(s(c)))) 51 Predicados Extra-lógicos 52 Ejercicios 1. Define otros predicados de la aritmética natural mediante operadores (producto, potencia, factorial,…). Aplica recursión de cola cuando sea conveniente. 2. Declara operadores cm y m para representar medidas de longitud expresadas en centímetros y metros: 37.5 cm 4 m Declara un operador := y define un predicado que permita sumar longitudes, expresando el resultado en la mayor unidad, tal y como muestran los objetivos: ?- 1 cm + 3 cm := 4 cm. Yes ?- 37.5 cm + 4 m := X. X = 4.375 m Predicados Extra-lógicos 53