You are on page 1of 14

Contenido

Predicados Extra-lgicos

Ingeniera Informtica Ingeniera Tcnica en Informtica de Sistemas Departamento de Lenguajes y Ciencias de la Computacin Universidad de Mlaga

1. 2. 3. 4. 5. 6.

Predicados extra-lgicos Predicados aritmticos Entrada/salida de trminos Unificacin y no unificacin Comparacin de trminos Declaracin de operadores

Predicados Extra-lgicos

Prolog = Programacin lgica


Base terica: Prolog puro se basa exclusivamente en la lgica de Horn consultas

Predicados Extra-lgicos

Programa (clusulas de Horn) Motor de Inferencia (SLD-Resolucin)

respuestas computadas

Ventajas: anlisis y transformacin de programas Inconvenientes: acceso a recursos hardware/software


Predicados Extra-lgicos 4

Prolog = Programacin lgica + Extra-lgica


Aplicacin prctica: extendemos extra-lgicamente el lenguaje para dar acceso a ciertos recursos (aritmtica, entrada/salida) consultas

Predicados extra-lgicos (I)


Caractersticas comunes: estn predefinidos por el sistema Prolog (bibliotecas) se resuelven al margen de la SLD-Resolucin, aprovechando el hardware/software de la plataforma tienen asociado un algoritmo de evaluacin cuya ejecucin termina en xito o fracaso, o bien genera un error suelen ser deterministas (respuesta nica) y soportar slo algunos usos Ventajas: aplicacin prctica, expresividad, eficiencia Inconvenientes: dificulta anlisis y transformacin de programas
5 Predicados Extra-lgicos 6

Programa (clusulas de Horn) Motor de Inferencia (SLD-Resolucin) + Evaluador Extra-lgico


Predicados Extra-lgicos

respuestas computadas

Predicados extra-lgicos (y II)


Slo estudiaremos algunos predicados extra-lgicos: aritmticos entrada/salida comparacin de trminos declaracin de operadores Anotaremos las cabeceras de los predicados extra-lgicos con los usos posibles (+ entrada, - salida, ? entrada o salida): Ejemplo: is(?X,+Y) read(-X) write(+X)
Predicados Extra-lgicos 7

Predicados Aritmticos

Predicados aritmticos
Permiten evaluar expresiones aritmticas: (1 + sqrt(5)) / 2 = 1.61803 Para incorporar expresiones aritmticas a Prolog es necesario: extender la sintaxis para soportar operadores (1 + sqrt(5)) / 2 aadir funciones aritmticas predefinidas (sqrt,sin, ) aadir un predicado extra-lgico que solicite la evaluacin de expresiones aritmticas (Prolog no evala trminos)

Operadores Prolog
Definicin: un operador Prolog es un functor de aridad 1 o 2 que puede escribirse de forma prefija, postfija o infija, prescindiendo de los parntesis Ejemplo: X + Y - X +(X,Y) -(X) % +/2, infijo % -/1, prefijo sintctico, definen no tienen y

son un mecanismo exclusivamente asociada ninguna operacin (semntica) para evitar asociatividad ambigedades, se

prioridades

pueden ser predefinidos o declarados por el usuario


Predicados Extra-lgicos 9 Predicados Extra-lgicos 10

Operadores aritmticos
Prolog predefine los siguientes operadores aritmticos: X X X X X X X + Y Y X * Y / Y // Y mod Y ** Y suma resta menos unario producto cociente cociente divisin entera resto divisin entera potencia

Funciones aritmticas bsicas


Prolog predefine las siguientes funciones aritmticas bsicas: abs(X) sign(X) max(X,Y) min(X,Y) random(X) sqrt(X) floor(X) ceiling(X) round(X) truncate(X)
Predicados Extra-lgicos

al escribir 5 + 3 * 7 Prolog entiende +(5, *(3,7)) Prolog no evala los trminos: +(5, *(3,7)) 26
Predicados Extra-lgicos 11

valor absoluto signo (-1, 0, 1) mximo mnimo entero aleatorio entre 0 y X-1 raz cuadrada techo suelo redondeo truncamiento

12

Otras funciones aritmticas


trigonomtricas: sin(X), cos(X), tan(X) asin(X,Y), acos(X), atan(X), atan(X,Y) logartmicas y exponenciales: log(X), log10(X) exp(X) constantes: pi, e
Predicados Extra-lgicos

Expresin aritmtica
Definicin: un trmino Prolog es un expresin aritmtica si 1) sus functores son operadores o funciones aritmticas 2) sus constantes son funciones aritmticas o nmeros 3) sus variables estn instanciadas a expresiones aritmticas 2.0 * (pi + sin(X)) cos(a)**2 5 + Y 2.0 * (pi + sin(X)) X libre, no es expresin aritmtica no es una expresin aritmtica {Y/b}, no es una expresin aritmtica {X/2*5} una expresin aritmtica

una expresin aritmtica no contiene variables libres una expresin aritmtica es un trmino no se evala por defecto
13 Predicados Extra-lgicos 14

El predicado aritmtico is/2


se utiliza para evaluar expresiones aritmticas is(?X,+Y) X debe ser una variable libre o un nmero Y debe ser una expresin aritmtica algoritmo is(X,Y) 1. v = evaluar(Y) (si hay error, se eleva una excepcin) 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-lgicos

Usos del predicado is/2


?- 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
15 Predicados Extra-lgicos 16

Errores comunes al usar is/2


?- X is Y+1. ERROR: Arguments are not sufficiently instantiated ?- X is y+1. ERROR: Arithmetic: `y/0' is not a function ?- 8+1 is 2*4+1. No ?- X = 0, X is X+1. No

Operadores relacionales aritmticos


Se emplean para comparar expresiones aritmticas: +X =:= +Y +X =\= +Y +X < +Y +X > +Y +X =< +Y +X >= +Y

X e Y deben ser expresiones aritmticas algoritmo X comp Y 1. vx= evaluar(X), vy= evaluar(Y) (si hay error, elevar excepcin) 2. res= vx comp vy 3. si res es cierto acabar con xito, sino acabar con fracaso donde comp {=:=, =\=, <, >, =<, >=}
Predicados Extra-lgicos

Predicados Extra-lgicos

17

18

Uso de la comparacin aritmtica


Slo se puede usar como test (+,+), pues no hay variables libres:

Programando con predicados extra-lgicos


Las tcnicas de programacin bsicas siguen disponibles:

?- 2.0 =:= 1.0 + 1.0. Yes ?- 2 =:= 1.0 + 1.0. Yes ?- 3 < 6 < 9. ERROR: Syntax error: Operator priority clash ?- X is (3 < 9). ERROR: Arithmetic: `(<)/2' is not a function
Predicados Extra-lgicos 19

recursin recursin de cola generar/comprobar pero su aplicacin esconde algunos matices Definiremos versiones extra-lgicas de los predicados sobre naturales

Predicados Extra-lgicos

20

Predicados extra-lgicos y usos posibles


% menor(+X,+Y) menor(X,Y) :- X < Y. % 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. Ventajas: simplicidad, eficiencia Inconvenientes: menos usos posibles (no son relacionales)
Predicados Extra-lgicos

Predicados extra-lgicos y recursin


factorial(0,1). factorial(X,F) :X > 0, X1 is X-1, factorial(X1,T), F is X*T.

% guarda % reduccin % composicin

La unificacin pierde potencia: no basta para distinguir casos base y recursivo no puede reducir el problema ni componer la solucin

21

Predicados Extra-lgicos

22

Predicados extra-lgicos y recursin de cola


factorial(X,F) :- fact_cola(X,1,F). fact_cola(0,F,F). fact_cola(X,Ac,F) :% guarda X > 0, X1 is X-1, % reduccin Ac1 is X*Ac, % actualizacin fact_cola(X1,Ac1,F). La unificacin pierde potencia: no basta para distinguir casos base y recursivo no puede reducir el problema ni actualizar acumulador
Predicados Extra-lgicos

Predicados extra-lgicos y generadores


entre(I,J,I) :I =< J. entre(I,J,K) :I < J, I1 is I+1, entre(I1,J,K). Uso (+,+,+) (+,+,-) Comportamiento test generador acotado Significado comprueba I K genera K= I,,J generacin

Los casos base y recursivo no son excluyentes


Predicados Extra-lgicos

23

24

Predicados extra-lgicos y generar/comprobar


Problema: descomponer un natural N en suma de dos pares X e Y % 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.

Aplicacin: puzzles cripto-aritmticos


Problema: Dada la suma de letras C M I A E C M A S A I O

+ V

% % % %

comprobar generar (acotado) comprobar generar (nico)

asignar a cada letra un dgito distinto entre 0 y 9 de manera que la suma resultante cuadre Sugerencia: aplicar el paradigma generar/comprobar

Predicados Extra-lgicos

25

Predicados Extra-lgicos

26

Ejercicios
Define los siguientes predicados: 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 dgito del entero X 5. mcd(X,Y,Z), Z es el mximo comn divisor de X e Y 6. pascal(I,J,X), X es el elemento (I,J) del tringulo de Pascal 7. fibonacci(N,F), F es el N-simo Fibonacci 8. biseccion(F,A,B,R), R es una raz de la funcin F en el intervalo [A,B]

Ejercicios
9. Resuelve el puzzle cripto-aritmtico: 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 dgito distinto, de manera que las filas, columnas y diagonales principales sumen 15
Predicados Extra-lgicos 28

Predicados Extra-lgicos

27

Perifricos y flujos
La entrada/salida de Prolog est basada en flujos: los flujos permiten tratar uniformemente una variedad de perifricos, como una secuencia de informacin 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 operacin: entrada, salida, concatenacin y actualizacin un flujo soporta tres tipos de informacin: binarios, texto y trminos
Predicados Extra-lgicos 30

Entrada/Salida de Trminos

Flujos de trminos y entrada/salida estndar


un flujo de trminos es una secuencia de trminos Prolog terminados en un punto y separados por blancos (espacios, tabuladores y saltos de lnea) Ejemplo: t(h(X), a). 4*pi. s(s(s(c))). f(A,1+2). s(s(a)).

Trminos Prolog y salida estndar


write(+X) escribe el trmino X en la salida estndar nl escribe un fin de lnea en la salida estndar tab(+N) escribe N espacios en la salida estndar (N es una expresin aritmtica entera) display(+X) escribe el trmino X en la salida estndar (sin tener en cuenta las declaraciones de operadores)
Predicados Extra-lgicos 32

slo se pueden leer y escribir trminos completos para simplificar, emplearemos flujos de trminos asociados a la entrada y salida estndar (por defecto, teclado y pantalla)

Predicados Extra-lgicos

31

Ejemplos de salida estndar


?- write(2*5+1). 2*5+1 ?- write(s(s(X))). s(s(_G278)) ?- display(2*5+1). +(*(2,5),1) % Prolog no evala los trminos

Trminos Prolog y entrada estndar


read(-X) lee el siguiente trmino de la entrada estndar y lo unifica con X, acabando en xito o fracaso. Aunque es un generador nico, cada reevaluacin puede generar una respuesta distinta (efecto lateral) Ejemplo: ? read(X). :| f(A,2*pi). X = f(_G275,2*pi) Yes

% X est libre

% tal y como lo entiende Prolog

?- read(fecha(D,M,A)). |: fecha(2,febrero). No

?- tab(3+5), write(a). % tab/1 es aritmtico a


Predicados Extra-lgicos

Prolog muestra el cursor |: cuando espera datos por teclado


33 Predicados Extra-lgicos 34

Ejemplo: una calculadora simple (I)


Escribir un programa Prolog que acepte por teclado expresiones aritmticas sin variables y muestre el resultado de evaluarlas. El programa debe terminar al introducir la palabra fin. Ejemplo: ?>> 17 >> -1 >> calc. 2+3*5. sin(pi) + cos(pi). fin.

Ejemplo: una calculadora simple (y II)


calc :write('>> '), read(Exp), evalua(Exp). evalua(fin). evalua(Exp) :Exp \= fin, R is Exp, write_ln(R), calc.
Predicados Extra-lgicos

% Exp y fin no unifican % write + nl

Yes
Predicados Extra-lgicos 35 36

Unificacin y no unificacin
?X = ?Y unifica X con Y, instanciando variables (test o generador nico) no tiene en cuenta el test de ocurrencia

Unificacin y No Unificacin

+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-lgicos
Predicados Extra-lgicos 38

Orden estndar de los trminos


Prolog define una relacin de orden total sobre los trminos: 1. 2. 3. 4. 5. variables < nmeros < tomos < estructuras las variables se comparan por la edad: antigua < nueva los nmeros se comparan por su valor los tomos se comparan alfabticamente las estructuras se comparan: primero, numricamente por la aridad, despus, alfabticamente por el tomo del functor recursivamente, argumento a argumento de izq. a der.

Comparacin de Trminos

Los trminos Prolog satisfacen la propiedad de tricotoma


Predicados Extra-lgicos

40

Comparacin de trminos Prolog


Prolog predefine los siguientes operadores: +X == +Y +X \== +Y +X @< +Y +X @> +Y +X @=< +Y +X @>= +Y todos son tests (+,+), no instancian variables el evaluador extra-lgico ejecuta la comparacin segn el orden estndar, dando lugar a un xito o un fracaso
Predicados Extra-lgicos

Ejemplos de comparacin de trminos


?- 1 + 2 == 1 + 2. Yes ?- 1 + 2 == 2 + 1. No ?- 1 + 2 =:= 2 + 1. Yes ?- f(X) == f(Y). No ?- f(X) = f(Y). X = Y = _G251
Predicados Extra-lgicos 42

% no evala

% no instancia

41

Operadores Prolog
mejoran la legibilidad, permitiendo prescindir de los parntesis son una mera facilidad sintctica, no tienen asociada ninguna operacin (semntica)

Declaracin de Operadores

Ejemplo: 2 + 3 * 5 = +(2,*(3,5)) la precedencia y asociatividad evitan ambigedades que resultan al prescindir de los parntesis Ejemplo: X ** 3 mod 13 = (X**3) mod 13 1+2-3+4-5 = (((1+2)-3)+4)-5
Predicados Extra-lgicos 44

Precedencia de operadores
cada operador tiene asignada una precedencia (1..1200) Dado un trmino Prolog, su precedencia es: si es compuesto la de su functor principal si no es compuesto (constante o variable) 0 si est entre parntesis 0 Ejemplo: 2 + A * 3 + 2 A
Predicados Extra-lgicos

Asociatividad de operadores
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 Ejemplo: A * B / 2 % *,/ 400 / 400, asoc. izq.

% prec: + 500 * 400 3

500

400

mayor precedencia

400 * menor precedencia


45 Predicados Extra-lgicos

2 B
46

La directiva op/3
El programador puede declarar sus propios operadores: :- op(+Precedencia, +Tipo, +Nombre). Precedencia: un entero entre 1 y 1200 Tipo: indica posicin (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-lgicos 47

El predicado current_op/3
Permite consultar qu operadores hay predefinidos y declarados: current_op(?Precedencia, ?Tipo, ?Nombre) Ejemplo: ?- current_op(P,T,-). P = 500 T = fx ; P = 500 T = yfx ; No
Predicados Extra-lgicos 48

Ejemplo: quin habla qu?


Operador: :- op(800,xfx,habla). 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: ?- Quien habla ingles. ?- elena habla Que. ?- Quien habla Que.
Predicados Extra-lgicos 49

Aritmtica de Peano y operadores (I)


Objetos: declaramos un operador para representar naturales :- op(100,fy,s). Ejemplo: s s s s c s(s(s(s(c))))

Definicin de dominio: declaramos un operador es_natural :- op(800, fx, es_natural). es_natural c. es_natural s X :- es_natural X.

Predicados Extra-lgicos

50

Aritmtica de Peano y operadores (II)


Relaciones aritmticas: los predefinidos (+,*,**,) operadores aritmticos estn

Aritmtica de Peano y operadores (y III)


Solucin: introducimos un operador que conecte una operacin aritmtica bsica con su resultado :- op(800,xfx,=). El predicado =/2 es una versin lgica (simplificada) de is/2 A = B B es el natural que resulta de la operacin aritmtica A Ejemplo: % =/2, operacin + c + Y = Y :- es_natural Y. s X + Y = s Z :- X + Y = Z.
51 Predicados Extra-lgicos 52

Ejemplo: podemos escribir s s s c + s s c Problema: los operadores aritmticos son binarios (+/2), y las relaciones aritmticas son ternarias (suma/3) % suma/3 c + Y s X + Y Cmo lo resolvemos?
Predicados Extra-lgicos

??? :- ??? :-

Ejercicios
1. Define otros predicados de la aritmtica natural mediante operadores (producto, potencia, factorial,). Aplica recursin de cola cuando sea conveniente. 2. Declara operadores cm y m para representar medidas de longitud expresadas en centmetros 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-lgicos 53

You might also like