Está en la página 1de 14

Contenido

1. Predicados extra-lógicos
Predicados Extra-lógicos 2. Predicados aritméticos
3. Entrada/salida de términos
4. Unificación y no unificación
5. Comparación de términos
Ingeniería Informática 6. Declaración de operadores
Ingeniería Técnica en Informática de Sistemas

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 Características comunes:
para dar acceso a ciertos recursos (aritmética, entrada/salida…)
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
Programa
(cláusulas de Horn)
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
suelen ser deterministas (respuesta única) y soportar sólo
(SLD-Resolución) algunos usos
+
Evaluador Extra-lógico Ventajas: aplicación práctica, expresividad, eficiencia
Inconvenientes: dificulta análisis y transformación de programas
Predicados Extra-lógicos 5 Predicados Extra-lógicos 6

Predicados extra-lógicos (y II)


Sólo estudiaremos algunos predicados extra-lógicos:

aritméticos
entrada/salida
comparación de términos
Predicados Aritméticos
declaración de operadores

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
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,
(1 + sqrt(5)) / 2 = 1.61803 prescindiendo de los paréntesis
Para incorporar expresiones aritméticas a Prolog es necesario: Ejemplo:
X + Y  +(X,Y) % +/2, infijo
extender la sintaxis para soportar operadores
- X  -(X) % -/1, prefijo
(1 + sqrt(5)) / 2
son un mecanismo exclusivamente sintáctico, no tienen
añadir funciones aritméticas predefinidas (sqrt,sin, …) asociada ninguna operación (semántica)

para evitar ambigüedades, se definen prioridades y


añadir un predicado extra-lógico que solicite la evaluación de
asociatividad
expresiones aritméticas (Prolog no evalúa términos)
pueden ser predefinidos o declarados por el usuario
Predicados Extra-lógicos 9 Predicados Extra-lógicos 10

Operadores aritméticos Funciones aritméticas básicas


Prolog predefine los siguientes operadores aritméticos: Prolog predefine las siguientes funciones aritméticas básicas:

X + Y suma abs(X) valor absoluto


X – Y resta sign(X) signo (-1, 0, 1)
- X menos unario max(X,Y) máximo
X * Y producto min(X,Y) mínimo
X / Y cociente random(X) entero aleatorio entre 0 y X-1
X // Y cociente división entera sqrt(X) raíz cuadrada
X mod Y resto división entera floor(X) techo
X ** Y potencia ceiling(X) suelo
round(X) redondeo
al escribir 5 + 3 * 7 Prolog entiende +(5, *(3,7))
truncate(X) truncamiento
Prolog no evalúa los términos: +(5, *(3,7)) ≠ 26

Predicados Extra-lógicos 11 Predicados Extra-lógicos 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
sin(X), cos(X), tan(X) 2) sus constantes son funciones aritméticas o números
asin(X,Y), acos(X), atan(X), atan(X,Y) 3) sus variables están instanciadas a expresiones aritméticas

logarítmicas y exponenciales: 2.0 * (pi + sin(X)) X libre, no es expresión aritmética


cos(a)**2 no es una expresión aritmética
log(X), log10(X) 5 + Y {Y/b}, no es una expresión aritmética
exp(X) 2.0 * (pi + sin(X)) {X/2*5} una expresión aritmética

constantes: una expresión aritmética no contiene variables libres


pi, e una expresión aritmética es un término  no se evalúa por
defecto
Predicados Extra-lógicos 13 Predicados Extra-lógicos 14

El predicado aritmético is/2 Usos del predicado is/2


se utiliza para evaluar expresiones aritméticas ?- 9 is 2*4+1.
Yes
is(?X,+Y) ?- X is 2*4+1.
X debe ser una variable libre o un número X = 9 ;
Y debe ser una expresión aritmética No
?- Y = 2*4, X is Y+1.
algoritmo is(X,Y) X = 9 ;
1. v = evaluar(Y) (si hay error, se eleva una excepción) No
2. unificar X con v, acabando en éxito o fracaso ?- Phi is (1+sqrt(5))/2.
Phi = 1.61803 ;
el predicado is/2 puede instanciar la variable X No
el functor is/2 es un operador: is(X,Y) = X is Y ?- X is 2/(1-1).
ERROR: Arithmetic: evaluation error: `zero_divisor‘
Predicados Extra-lógicos 15 Predicados Extra-lógicos 16
Errores comunes al usar is/2 Operadores relacionales aritméticos
?- X is Y+1. Se emplean para comparar expresiones aritméticas:
ERROR: Arguments are not sufficiently instantiated
+X =:= +Y +X < +Y +X =< +Y
?- X is y+1. +X =\= +Y +X > +Y +X >= +Y
ERROR: Arithmetic: `y/0' is not a function
X e Y deben ser expresiones aritméticas
?- 8+1 is 2*4+1.
No
algoritmo X comp Y
?- X = 0, X is X+1. 1. vx= evaluar(X), vy= evaluar(Y) (si hay error, elevar excepción)
No 2. res= vx comp vy
3. si res es cierto acabar con éxito, sino acabar con fracaso
donde comp ∈ {=:=, =\=, <, >, =<, >=}

Predicados Extra-lógicos 17 Predicados Extra-lógicos 18

Uso de la comparación aritmética 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
?- 2 =:= 1.0 + 1.0. generar/comprobar
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) :-
% minimo(+X,+Y,?Z) X > 0, % guarda
minimo(X,Y,X) :- X =< Y. X1 is X-1, % reducción
minimo(X,Y,Y) :- Y < X. factorial(X1,T),
F is X*T. % composición
% suma(+X,+Y,?Z)
suma(X,Y,Z) :- Z is X+Y. La unificación pierde potencia:
no basta para distinguir casos base y recursivo
Ventajas: simplicidad, eficiencia no puede reducir el problema ni componer la solución
Inconvenientes: menos usos posibles (no son relacionales)

Predicados Extra-lógicos 21 Predicados Extra-lógicos 22

Predicados extra-lógicos y recursión de cola Predicados extra-lógicos y generadores


factorial(X,F) :- fact_cola(X,1,F). entre(I,J,I) :-
I =< J.
fact_cola(0,F,F). entre(I,J,K) :-
fact_cola(X,Ac,F) :- I < J,
X > 0, % guarda I1 is I+1,
X1 is X-1, % reducción entre(I1,J,K).
Ac1 is X*Ac, % actualización
fact_cola(X1,Ac1,F). Uso Comportamiento Significado
(+,+,+) test comprueba I  K  J
La unificación pierde potencia: (+,+,-) generador acotado genera K= I,…,J
no basta para distinguir casos base y recursivo
no puede reducir el problema ni actualizar acumulador Los casos base y recursivo no son excluyentes  generación

Predicados Extra-lógicos 23 Predicados Extra-lógicos 24


Predicados extra-lógicos y generar/comprobar Aplicación: puzzles cripto-aritméticos
Problema: descomponer un natural N en suma de dos pares X e Y Problema: Dada la suma de letras

% es_par(+X) C A M A
es_par(X) :- X mod 2 =:= 0. + M E S A

% en_pares(+N,?X,?Y) V I C I O
en_pares(N,X,Y) :-
es_par(N), % comprobar asignar a cada letra un dígito distinto entre 0 y 9 de manera que
entre(0,N,X), % generar (acotado) la suma resultante cuadre
es_par(X), % comprobar
Y is N-X. % generar (único) Sugerencia: aplicar el paradigma generar/comprobar

Predicados Extra-lógicos 25 Predicados Extra-lógicos 26

Ejercicios Ejercicios
Define los siguientes predicados: 9. Resuelve el puzzle cripto-aritmético:

1. es_natural(X), genera los naturales X = 0,1,2,3,… S E N D


2. es_entero(X), genera los enteros X = 0,-1,1,-2,2,… + M O R E
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 M O N E Y
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 10. Dada la matriz de orden 3
Pascal A B C
7. fibonacci(N,F), F es el N-ésimo Fibonacci D E F
8. biseccion(F,A,B,R), R es una raíz de la función F en el G H I
intervalo [A,B] asigna a cada letra un dígito distinto, de manera que las filas,
columnas y diagonales principales sumen 15
Predicados Extra-lógicos 27 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 30

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, write(+X)
tabuladores y saltos de línea) escribe el término X en la salida estándar

Ejemplo: nl
t(h(X), a). f(A,1+2). escribe un fin de línea en la salida estándar
4*pi.
tab(+N)
s(s(s(c))). s(s(a)).
escribe N espacios en la salida estándar (N es una expresión
aritmética entera)
sólo se pueden leer y escribir términos completos
para simplificar, emplearemos flujos de términos asociados a la display(+X)
entrada y salida estándar (por defecto, teclado y pantalla) escribe el término X en la salida estándar (sin tener en cuenta
las declaraciones de operadores)

Predicados Extra-lógicos 31 Predicados Extra-lógicos 32


Ejemplos de salida estándar Términos Prolog y entrada estándar
read(-X)
?- write(2*5+1). % Prolog no evalúa los términos lee el siguiente término de la entrada estándar y lo unifica con X,
2*5+1 acabando en éxito o fracaso. Aunque es un generador único, cada
reevaluación puede generar una respuesta distinta (efecto
lateral)
?- write(s(s(X))). % X está libre
s(s(_G278))
Ejemplo:
?– read(X). ?- read(fecha(D,M,A)).
?- display(2*5+1). % tal y como lo entiende Prolog
:| f(A,2*pi). |: fecha(2,febrero).
+(*(2,5),1)
X = f(_G275,2*pi) No
Yes
?- tab(3+5), write(a). % tab/1 es aritmético
a
Prolog muestra el cursor |: cuando espera datos por teclado

Predicados Extra-lógicos 33 Predicados Extra-lógicos 34

Ejemplo: una calculadora simple (I) 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 calc :-
programa debe terminar al introducir la palabra fin. write('>> '),
read(Exp),
Ejemplo: evalua(Exp).
?- calc.
>> 2+3*5. evalua(fin).
17 evalua(Exp) :-
>> sin(pi) + cos(pi). Exp \= fin, % Exp y fin no unifican
-1 R is Exp,
>> fin. write_ln(R), % write + nl
calc.
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:

1. variables < números < átomos < estructuras


2. las variables se comparan por la “edad”: antigua < nueva
Comparación de Términos 3. los números se comparan por su valor
4. los átomos se comparan alfabéticamente
5. 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 ?- 1 + 2 == 2 + 1. % no evalúa
+X @< +Y No
+X @> +Y
?- 1 + 2 =:= 2 + 1.
+X @=< +Y
Yes
+X @>= +Y
?- f(X) == f(Y). % no instancia
todos son tests (+,+), no instancian variables No
el evaluador extra-lógico ejecuta la comparación según el orden
estándar, dando lugar a un éxito o un fracaso ?- f(X) = f(Y).
X = Y = _G251
Predicados Extra-lógicos 41 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) se aplica cuando coinciden las precedencias
Dado un término Prolog, su precedencia es: un operador puede ser:
si es compuesto  la de su functor principal asociativo a la izquierda: su argumento izquierdo puede tener
si no es compuesto (constante o variable)  0 menor o igual precedencia
si está entre paréntesis  0 asociativo a la derecha: su argumento derecho puede tener
menor o igual precedencia
Ejemplo: 2 + A * 3 % prec: +  500 *  400 no asociativo: sus argumentos deben tener menor precedencia

Ejemplo: A * B / 2 % *,/  400, asoc. izq.


+ 500 mayor precedencia
400 /
2 * 400
400 * 2

A 3 menor precedencia A B
Predicados Extra-lógicos 45 Predicados Extra-lógicos 46

La directiva op/3 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 Ejemplo:


Tipo: indica posición (f) y asociatividad (y) o no (x)
yfx infijo, asociativo a la izquierda ?- current_op(P,T,-).
xfy infijo, asociativo a la derecha P = 500
xfx infijo, no asociativo T = fx ;
fy prefijo, asociativo
fx prefijo, no asociativo P = 500
yf postfijo, asociativo T = yfx ;
xf postfijo, no asociativo
Nombre: átomo No

Predicados Extra-lógicos 47 Predicados Extra-lógicos 48


Ejemplo: ¿quién habla qué? Aritmética de Peano y operadores (I)
Operador: Objetos: declaramos un operador para representar naturales
:- op(800,xfx,habla).
:- op(100,fy,s).
Predicado:
% habla/2: persona habla idioma. Ejemplo: s s s s c  s(s(s(s(c))))
elena habla ingles. elena habla frances.
juan habla ingles. Definición de dominio: declaramos un operador es_natural
francisco habla ingles. francisco habla aleman.
marisa habla esperanto. marisa habla italiano. :- op(800, fx, es_natural).

Objetivos:
es_natural c.
?- Quien habla ingles. es_natural s X :- es_natural X.
?- elena habla Que.
?- Quien habla Que.
Predicados Extra-lógicos 49 Predicados Extra-lógicos 50

Aritmética de Peano y operadores (II) Aritmética de Peano y operadores (y III)


Relaciones aritméticas: los operadores aritméticos están Solución: introducimos un operador que conecte una operación
predefinidos (+,*,**,…) aritmética básica con su resultado

Ejemplo: podemos escribir s s s c + s s c :- op(800,xfx,=´).

El predicado =´/2 es una versión lógica (simplificada) de is/2


Problema: los operadores aritméticos son binarios (+/2), y las
relaciones aritméticas son ternarias (suma/3)
A =´ B
B es el natural que resulta de la operación aritmética A
% suma/3
c + Y ??? :- … Ejemplo:
s X + Y ??? :- … % =´/2, operación +
c + Y =´ Y :- es_natural Y.
¿Cómo lo resolvemos? s X + Y =´ s Z :- X + Y =´ Z.
Predicados Extra-lógicos 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

También podría gustarte