Professional Documents
Culture Documents
Curso 2004-2005
Aritmética
•Operadores aritméticos
•Operadores relacionales
•Operadores de igualdad
•Funciones
Tipos de Datos
•Estructuras
•Árboles
•Listas
•Matrices
•Grafos
Aritmética
En Prolog vamos disponer de una serie de operadores relacionales y aritméticos
que nos permitirán aumentar la semántica de nuestra base de conocimiento:
• Operadores aritméticos
+, - , * , /
// : cociente de la división (división entera)
mod : resto de la división (módulo)
^ : potencia (primer operando elevado a segundo operando)
• Operadores relacionales
>,<,>=,<=
• Operadores de igualdad
= = :significa “es exactamente igual que”. Compara términos sin evaluar expresiones.(no
unifica). Ambos términos tienen que estar instanciados.
\= = :es falso cuando dos términos son exactamente iguales. (no unifica).
=:= :mismo valor. Evalúa los dos operandos, a derecha y a izquierda, y es verdadero si
los valores obtenidos son iguales. (no unifica).
Departamento de Electrónica, Sistemas Informáticos y Automática Pág. 4 Curso 2004-2005
Universidad de Huelva
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog
Ejemplos
?- X is 3+4.
X=7 ?- X is 8, X is 3+5.
Yes X=8
Yes
?- X+Y = 3+5.
X=3, Y=5 3 = = 1+2.
Yes No
Notas
• Los operadores aritméticos y relacionales necesitan que todas las variables implicadas en la expresión
correspondiente estén instanciadas en el momento en que se realiza la evaluación. En otro caso, Prolog nos
avisará de que las variables no están debidamente instanciadas. El operador =:= se incluye en este grupo.
• Los operadores is requiere que estén instanciadas las variables del operando a la derecha.
• Los operadores de unificación (=, \=) no requieren que las variables estén instanciadas
Notas
• El predicado between/3 de Prolog sirve para instanciar variables dentro de intervalos de enteros:
Con esto se evita el problema de buscar dentro de un espacio infinito, ya que X puede tomar en principio
cualquier valor.
Ejemplo:
calcular la raíz cuadrada de 16 usando la operación de potencia de 2 (inversa de funciones)
?- between(1,10,X), 16 is X^2. à Correcto: X = 4.
• Funciones
Tipos de datos
• Prolog no es un lenguaje con asignación de tipos fuerte.
La lógica se preocupa más de las relaciones entre objetos que del tipo de éstos, dando a todos
ellos un tratamiento similar.
Las operaciones matemáticas se pueden considerar cómo relaciones entre los operandos. La
suma se puede considerar como una relación ternaria en la que se han seleccionado aquellas
tripletas en que la tercera componente verifica la condición matemática de ser suma de las otras
dos. A pesar de esto, Prolog sí que da un tratamiento especial a las operaciones aritméticas,
cómo ya hemos visto en el apartado anterior.
• Estructuras
La forma de introducir datos estructurados en Prolog es sencilla.
Imaginemos el siguiente registro:
• Estructuras
De igual modo, podemos construir registros compuestos:
En Prolog:
partido( local( nombre( ‘Tigres’ ), ciudad(‘Huelva’) ), visitante( nombre(‘Gigantes’), ciudad(‘Albacete’) ), tlocal(5), tvisit(14) ).
partido( local( nombre( ‘Osos’ ), ciudad(‘Huelva’) ), visitante( nombre(‘Águilas’), ciudad(‘Lugo’) ), tlocal(17), tvisit(2) ).
%% Predicado que nos dice si un equipo gana en su casa y el tanteo:
ganacasa(X,Y,Z,V):-partido(local(nombre(X),ciudad(Y)),_,tlocal(Z),tvisit(V)), Z>V.
%% Consultar todos los equipos de Huelva que ganan en casa y los tanteos
?- ganacasa(X,’Huelva’,Y,Z).
X=‘Tigres’, Y=10, Z=0; X=‘Osos’, Y=17, Z=2; No
%% Consultar todos los equipos de Huelva que ganan en casa por más de 10 tantos:
?- ganacasa(X,’Huelva’,Y,Z), Y > Z+10.
X=‘Osos’, Y=17, Z=2; No
• Árboles
En Prolog, los predicados pueden interpretarse como árboles:
oracion
sujeto predicado
come bocadillo
• Árboles
Ejemplo: escribir el recorrido en inorden de un árbol de expresión aritmética
% Utilizaremos el predicado
+ % a( operador, hijo_izquierda, hijo_derecha )
% el árbol de la figura es:
* / %a( +, a( *, 3, 9 ), a( /, a( -, 1, a( *,4,8 ) ), a(^,7,2) ) )
%Y deseamos obtener el recorrido en inorden:
%Solución en Prolog
1 * 7 2
inord( a(OP,HI,HD) ):-
write(‘(‘),inord(HI),write(OP),inord(HD),write(‘)’).
4 8
inord(X):-write(X).
• Listas
[]
[a,b,c]
[1,p(X),b,’Casa’]
Una secuencia de caracteres entre comillas es una cadena de caracteres y Prolog la trata internamente
como una lista de enteros que se corresponden con los valores ASCII de los caracteres en la cadena.
?- X = “Pedro”.
X = [ 80, 101, 100, 114, 111 ]
• Listas
Unificación de listas:
[ Cabeza | Cola ]
Donde Cabeza puede ser uno o varios términos separados por , y Cola es una lista (que puede ser
vacía) que representa a los demás términos de la lista con la que se realiza la unificación.
Para la unificación con esta sintaxis, los términos de Cabeza deben unificar uno a uno y Cola unifica
con una lista que contiene los términos restantes sin incluir aquellos que unificaron con Cabeza.
• Listas
% buscar un elemento en una lista: % generar una lista de un tamaño dado y rellena
de un valor:
esta(X,[X|_]).
genera([],0,_).
esta(X,[_|R]) :- esta(X,R). genera([Elem|R],Tam1,Elem):- Tam1 > 0,
?- esta( a,[1,2,a,b,n] ). Tam2 is Tam1-1, genera(R,Tam2,Elem).
Yes. ?- genera([a,a,a,Y],4,X).
Y=a, X=a, Yes.
Definición 1:
pertenece(X,[X|L]).
pertenece(X,[Y|L]) :- pertenece(X,L).
Definición 2:
pertenece(X,[X|_]).
pertenece(X,[_|L]) :- pertenece(X,L).
Consultas:
?- pertenece(b,[a,b,c]).
Yes
?- pertenece(d,[a,b,c]).
No
?- pertenece(X,[a,b,a]).
X=a;
X=b;
X=a;
No
?- pertenece(a,L).
L = [a|_G233] ;
L = [_G232, a|_G236] ;
L = [_G232, _G235, a|_G239]
• Matrices
Podemos considerar una lista como un vector. Una matriz bidimensional se representaría como un
vector de vectores. Es, por tanto, posible hacer uso del anidamiento de listas para representar matrices.
7.2 0 1
Matriz 0 7 9 à lista de filas: [ [ 7.2, 0, 1 ],[ 0, 7, 9 ],[ 2.5, 8, 3 ] ]
2.5 8 3 lista de columnas: [ [ 7.2, 0, 2.5 ],[ 0, 7, 8 ],[ 1, 9, 3 ] ]
0,1,1 2 2 1,1,1
1,1,0
0,1,0 1 9
[ [ [7,4],[1,9] ],[ [0,12],[2,2] ] ]
0,0,1 0 12 1,0,1
0,0,0 7 4 1,0,0
• Matrices
Ejemplos
% suma de vectores
sumavectores( [],[],[] ).
sumavectores( [C1|R1],[C2|R2],[C3|R3] ):-C3 is C1+C2, sumavectores( R1,R2,R3 ).
?-sumamatrices([[1,2],[3,4]],[[5,6],[7,8]],X).
X=[[6,8],[10,12]].
• Matrices
Ejemplos
%suma generalizada
suma([],[],[]).
suma(X,Y,Z):- var(Z),number(X),number(Y),Z is X+Y.
suma( [C1|R1],[C2|R2],[C3|R3] ):-suma(C1,C2,C3),suma(R1,R2,R3).
?-suma([[1,2],[3,4]],[[5,6],[7,8]],X).
X=[[6,8],[10,12]].
?-suma([[[1,2],[1,1]],[[2,2],[3,4]]],[[[5,6],[0,0]],[[8,8],[7,8]]],X).
X=[[[6,8],[1,1]],[[10,10],[10,12]]].
• Grafos
?- camino(a,f). à Yes
c ?- camino(f,a). à ¡desborda la pila!
Operadores.
Precedencia Tipo Operadores Asociatividad
• Ejemplos de asociatividad:
?- X ^ Y = a ^ b ^ c.
X=a
Y=b^c
?- a ^ b ^ c = (a ^ b) ^ c
No.
?- a ^ b ^ c = a ^ (b ^ c)
Yes.
Departamento de Electrónica, Sistemas Informáticos y Automática Pág. Curso 2004-2005
Universidad de Huelva 28
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog
Operadores.
Precedencia de un argumento
• Si un argumento esta cerrado entre paréntesis o es un objeto no
estructurado, su precedencia es cero.
• Si un argumento es estructurado, su precedencia es igual a la
precedencia de su funtor principal
Ejemplo
a–b–c
Que operación se realiza antes?
operador Precedencia Tipo
- 500 yfx
Posibles árboles de interpretación:
- -
- c a -
Precedencia 0 Precedencia 0
a b b c
Precedencia 500
Precedencia 500
Definición de operadores
- Contenido de la base de conocimiento
:- op(800,xfx,estudian).
:- op(400,xfx,y).
juan y ana estudian logica.
- Consultas:
?- Quienes estudian logica.
Quienes = juan y ana
?- juan y Otro estudian Algo.
Otro = ana
Algo = logica
a
S1 S2
a
null
null
S4 S3
b
% Automata no determinista
final(s3).
transicion(s1, a, s1).
transicion(s1, a, s2).
transicion(s1, b, s1).
transicion(s2, b, s3).
transicion(s3, b, s4).
silencioso(s2, s4).
silencioso(s3, s1).
% aceptado(Estado_inicial, Cadena)
%
% 1. Se acepta la cadena [], si Estado_inicial es estado_final
% 2. Una lista no vacia será aceptada si empezando desde el estado
% Estado_inicial e introduciendo el primer elemento de la lista
% es posible salta a algun estado S1 y el resto de la cadena es
% aceptada desde ese estado inicial S1.
% 3. Una cadena es aceptada si el automata puede hacer un paso silencioso
% desde el Estado_inicial al estado S1 y entonces aceptar toda la
% la cadena desde el estado S1
*/
/*
Objetivo:
aceptado(s1, X, 4).
X = [a, a, a, b] ;
X = [a, b, a, b] ;
X = [b, a, a, b] ;
X = [b, b, a, b] ;
No
*/