Predicados Extra-lógicos Predicados Extra-lógicos

Anuncio
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
Descargar