You are on page 1of 37

Programación Declarativa

Curso 2004-2005

Departamento de Electrónica, Sistemas Informáticos y Automática


Universidad de Huelva

Tema 2: Aritmética, datos y


estructuras en Prolog
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog

Aritmética
•Operadores aritméticos
•Operadores relacionales
•Operadores de igualdad
•Funciones

Tipos de Datos
•Estructuras
•Árboles
•Listas
•Matrices
•Grafos

Departamento de Electrónica, Sistemas Informáticos y Automática Pág. 2 Curso 2004-2005


Universidad de Huelva
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog

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

>,<,>=,<=

Departamento de Electrónica, Sistemas Informáticos y Automática Pág. 3 Curso 2004-2005


Universidad de Huelva
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog

• Operadores de igualdad

= :unificación. Es verdadero si ambos operandos unifican, en cuyo caso se realiza la


unificación.

\= :no unificación. Es verdadero si ambos operandos NO unifican, en cuyo caso NO se


realiza la unificación.

is :evaluador. Se utiliza para evaluar las expresiones aritméticas y funciones. Evalúa la


parte de la derecha y unifica a la parte izquierda. Si no se usa el is, las expresiones se
mantienen en su forma original ( X=3+3 en lugar de X=6 ).

= = :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

?- X = 3+5. 3*3 =:= 9.


X=3+5 Yes.
Yes

?- X is 8, X = 3+5. ?- X*Y = 9*a.


No X=9,Y=a
Yes

Departamento de Electrónica, Sistemas Informáticos y Automática Pág. 5 Curso 2004-2005


Universidad de Huelva
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog

Ejemplos ganados( juan, 7 ).


ganados( susana, 6 ).
precio( boli, 0.5 ).
ganados( pedro, 2 ).
precio( folios, 2.5 ). ganados( rosa, 5 ).
precio( ordenador, 700 ). jugados( rosa, 10 ).

precio( coche, 15000 ). jugados( juan, 13 ).


jugados( pedro, 3 ).
precio( tomates, 1 ).
jugados( susana, 7 ).
porcentaje( X,Y ):- ganados( X,Z ),jugados( X,Q ),Y is ( Z/Q )*100.
%% ¿Qué puedo comprar con 100 euros?
?- precio( X,Y ), Y < 100. %% ¿Qué porcentaje de ganados tienen?
X=boli, Y=0,5; ?- porcentaje( X,Y ),.
X=folios, Y=2,5; X=juan,Y=53.84;

X=tomates, Y=1; X=susana, Y=85.71;


X=pedro, Y=66.66;
No.
X=rosa,Y=50;
No.

Departamento de Electrónica, Sistemas Informáticos y Automática Pág. 6 Curso 2004-2005


Universidad de Huelva
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog

Notas

• Instanciación de variables con operadores

• Una variable está instanciada cuando Prolog le ha asignado un valor.

• 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.

?- 5 =:= X + 4 à ¡Error! X no está instanciada y no se puede realizar la suma

• Los operadores is requiere que estén instanciadas las variables del operando a la derecha.

?- 5 is X + 4 à ¡Error! X no está instanciada y no se puede realizar la suma


?- Y is 1 + 4 à Correcto: Y = 5

• Los operadores de unificación (=, \=) no requieren que las variables estén instanciadas

?- X = Y à Correcto: X=_G210, Y=_G210 (Las variables se unifican a una misma)

Departamento de Electrónica, Sistemas Informáticos y Automática Pág. 7 Curso 2004-2005


Universidad de Huelva
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog

Notas

• Aunque en lógica no es importante el orden, sí que lo es en Prolog:

?- 5 = X + 4, X = 1. à ¡Error! X no está aún instanciada y no se puede realizar la suma


?- X =1, 5 = X + 4. à Correcto: X = 1

• El predicado between/3 de Prolog sirve para instanciar variables dentro de intervalos de enteros:

?- 5 is X à ¡Error! X no está instanciada


?- between(1,10,X), 5 is X. à Correcto: X = 5. (se instancia X con valores de 1 a 10)

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.

Departamento de Electrónica, Sistemas Informáticos y Automática Pág. 8 Curso 2004-2005


Universidad de Huelva
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog

• Funciones

Prolog implementa algunas funciones matemáticas:

abs/1 : valor absoluto


cos/1 : coseno
sin/1 : seno
tan/1 : tangente
exp/1 : exponencial (ex)
log/1 : logaritmo en base e
sqrt/1 : raíz cuadrada
round/1 : redondeo
random/1 : número aleatorio

• Las variables que aparecen en el argumento de las funciones deben estar


adecuadamente instanciadas.

?- X is sqrt(6). à Correcto: X=2.449

Departamento de Electrónica, Sistemas Informáticos y Automática Pág. 9 Curso 2004-2005


Universidad de Huelva
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog

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.

•Prolog incluye predicados que permiten clasificar términos:

var/1 : verdadero si el término es una variable no instanciada.


nonvar/1 : verdadero si el término no es una variable instanciada.
atom/1 : verdadero si el témino es un átomo de Prolog.
atomic/1 : verdadero si el término es átomo o número.
integer/1 : verdadero si el término es un entero.
float/1 : verdadero si el término es un real.
number/1 : verdadero si el término es un número

Departamento de Electrónica, Sistemas Informáticos y Automática Pág. Curso 2004-2005


Universidad de Huelva 10
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog

• Estructuras
La forma de introducir datos estructurados en Prolog es sencilla.
Imaginemos el siguiente registro:

•Registro Persona: Persona 1: Persona 2:


•Nombre •Pedro •Ana
•Apellido •López •Macías
•DNI •123456789 •987654321
En Prolog:
persona( nombre(‘Pedro’), apellido(‘López’), dni( 123456789 ) ).
persona( nombre(‘Ana’), apellido(‘Macías’), dni( 987654321 ) ).
%% Recuperar nombres y apellidos:
?- persona( nombre(X), apellido(Y), _ ).
X=‘Pedro’, Y=‘López’;
X=‘Ana’, Y=‘Macías’;
No.

Departamento de Electrónica, Sistemas Informáticos y Automática Pág. Curso 2004-2005


Universidad de Huelva 11
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog

• Estructuras
De igual modo, podemos construir registros compuestos:

Registro Equipo: Registro Partido: Partido 1: Partido 1:


•Nombre •Local •Tigres de Huelva •Osos de Huelva
•Ciudad •Visitante •Gigantes de Albacete •Águilas de Lugo
•Tanteo local •10 •17
•Tanteo visitante •0 •2

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

Departamento de Electrónica, Sistemas Informáticos y Automática Pág. Curso 2004-2005


Universidad de Huelva 12
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog

• Árboles
En Prolog, los predicados pueden interpretarse como árboles:

oracion( sujeto( ‘Pedro’ ), predicado( verbo( ‘come’ ), objetodirecto( ‘bocadillo’ ) ) )

oracion

sujeto predicado

Pedro verbo objetodirecto

come bocadillo

Y, del mismo modo, pueden representarse árboles en forma de predicados:

a b arbol( a, arbol( c, arbol( 1, 2, 3 ) ), b )


c
1 2 3

Departamento de Electrónica, Sistemas Informáticos y Automática Pág. Curso 2004-2005


Universidad de Huelva 13
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog

• Á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:

3 9 - ^ %( (3*9) + ( ( 1 - (4*8) ) / (7^2) ) )

%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).

Departamento de Electrónica, Sistemas Informáticos y Automática Pág. Curso 2004-2005


Universidad de Huelva 14
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog

• Listas

Prolog implementa un tipo de dato especial: la lista.


Una lista es una serie de términos separados por comas entre corchetes:

[]
[a,b,c]
[1,p(X),b,’Casa’]

Las listas también son términos, luego se permite el anidamiento:

[ [], [ 1,2 ], a, [ [ 1 ], [ s, 1.4, 5 ] ] ]

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 ]

Departamento de Electrónica, Sistemas Informáticos y Automática Pág. Curso 2004-2005


Universidad de Huelva 15
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog

• Listas

Unificación de listas:

Dos listas unifican si sus componentes unifican una a una:

[ 1, a, p(r) ] = [ 1, X, p(X) ] à unifica


[ 1, X, p(r) ] = [ Y, [ a, b ], Z ] à unifica
[ a, p(n), Z, [] ] = [ a, p(q), [a], [] ] à no unifica

Existe una sintaxis especial para la utilización de listas: la sintaxis de barra.

[ 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.

Departamento de Electrónica, Sistemas Informáticos y Automática Pág. Curso 2004-2005


Universidad de Huelva 16
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog

• Listas

Ejemplos [C|R] = [1,2,3,4] à unifica: C=1, R=[2,3,4]


[C1,C2|R] = [1,p(a),[a],b] à unifica: C1=1, C2=p(a), R=[[a],b]
[a,C2|R] = [X,p(a)] à unifica: X=a, C2=p(a), R=[]
[C1|a] = [1,a] à NO unifica: C1=1, a\=[a]
[C1|[a]] = [1,a] à unifica: C1=1, [a]=[a]
[C1|[X,Y]] = [7,[a],b] à unifica: C1=7, X=[a], Y=b
[a|[C|R]] = [a,1,2] à unifica: C=1, R=[2]

% 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.

Departamento de Electrónica, Sistemas Informáticos y Automática Pág. Curso 2004-2005


Universidad de Huelva 17
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog

• Concatenación de listas (append):


•Especificación: conc(A,B,C) se verifica si C es la lista obtenida escribiendo los elementos de la lista B a
continuación de los elementos de la lista A; es decir,
1. Si A es la lista vacía, entonces la concatenación de A y B es B.
2. Si A es una lista cuyo primer elemento es X y cuyo resto es D,
entonces la concatenación de A y B es una lista cuyo primer elemento es X y cuyo resto es la
concatenación de D y B.
Por ejemplo,
?- conc([a,b],[b,d],C).
C =[a,b,b,d]
Definición 1:
conc(A,B,C) :- A=[], C=B.
conc(A,B,C) :- A=[X|D], conc(D,B,E), C=[X|E].
Definición 2:
conc([],B,B).
conc([X|D],B,[X|E]) :- conc(D,B,E).

Departamento de Electrónica, Sistemas Informáticos y Automática Pág. Curso 2004-2005


Universidad de Huelva 18
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog

•Concatenación de listas (append):


•Nota: Analogía entre la definición de conc y la de suma,
•Consulta: ¿Cuál es el resultado de concatenar las listas [a,b] y [c,d,e]?
?- conc([a,b],[c,d,e],L).
L = [a, b, c, d, e]
•Consulta: ¿Qué lista hay que añadirle a la lista [a,b] para obtener [a,b,c,d]?
?- conc([a,b],L,[a,b,c,d]).
L = [c, d]
•Consulta: ¿Qué dos listas hay que concatenar para obtener [a,b]?
?- conc(L,M,[a,b]).
L = [] M = [a, b] ;
L = [a] M = [b] ;
L = [a, b] M = [] ;

Departamento de Electrónica, Sistemas Informáticos y Automática Pág. Curso 2004-2005


Universidad de Huelva 19
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog

Departamento de Electrónica, Sistemas Informáticos y Automática Pág. Curso 2004-2005


Universidad de Huelva 20
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog

La relación de pertenencia (member):

Especificación: pertenece(X,L) se verifica si X es un elemento de la lista L.

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).

Departamento de Electrónica, Sistemas Informáticos y Automática Pág. Curso 2004-2005


Universidad de Huelva 21
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog

La relación de pertenencia (member):

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]

Departamento de Electrónica, Sistemas Informáticos y Automática Pág. Curso 2004-2005


Universidad de Huelva 22
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog

Departamento de Electrónica, Sistemas Informáticos y Automática Pág. Curso 2004-2005


Universidad de Huelva 23
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog

• 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.

Vector (1,2,3,4,5 ) à [ 1,2,3,4,5 ]

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 ] ]

Se utilizarán más niveles de anidamiento para matrices de mayor diemnsionalidad

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

Departamento de Electrónica, Sistemas Informáticos y Automática Pág. Curso 2004-2005


Universidad de Huelva 24
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog

• Matrices
Ejemplos

% suma de vectores
sumavectores( [],[],[] ).
sumavectores( [C1|R1],[C2|R2],[C3|R3] ):-C3 is C1+C2, sumavectores( R1,R2,R3 ).

?-sumavectores( [1,2,3], [4,5,6], X ).


X=[5,7,9]

%suma de matrices bidimensionales


sumamatrices( [],[],[] ).
sumamatrices( [C1|R1],[C2|R2],[C3|R3] ):-
sumavectores(C1,C2,C3),sumamatrices(R1,R2,R3).

?-sumamatrices([[1,2],[3,4]],[[5,6],[7,8]],X).
X=[[6,8],[10,12]].

Departamento de Electrónica, Sistemas Informáticos y Automática Pág. Curso 2004-2005


Universidad de Huelva 25
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog

• 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], X ).


X=[5,7,9]

?-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]]].

Departamento de Electrónica, Sistemas Informáticos y Automática Pág. Curso 2004-2005


Universidad de Huelva 26
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog

• Grafos

Podemos representar grafos en Prolog definiendo nodos y aristas como predicados

a %Busca caminos entre nodos


camino(X,Y):-arista(X,Y).
b e camino(X,Y):-arista(X,Z),camino(Z,Y).

?- camino(a,f). à Yes
c ?- camino(f,a). à ¡desborda la pila!

d f %Busca caminos con número de saltos

arista( a,b ). camino(X,Y,1):-arista(X,Y).


arista( a,e ). camino(X,Y,P):-
arista( b,c ). P>1, arista(X,Z),camino(Z,Y,Q),P is Q+1.
arista( c,f ).
arista( d,c ). ?- camino(a,f,P). à P=3; P=5; P=7; P=9 …
arista( f,c ). ?- camino(a,f,4). à ¡Bucle infinito!
arista( f,e ).

Departamento de Electrónica, Sistemas Informáticos y Automática Pág. Curso 2004-2005


Universidad de Huelva 27
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog

Operadores.
Precedencia Tipo Operadores Asociatividad

500 yfx +,- Infijo asocia por la izquierda


500 fx - Prefijo no asocia
400 yfx *, / Infijo asocia por la izquierda
200 xfy ^ Infijo asocia por la derecha

• 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.

Ejemplos de notación infija y prefija en expresiones aritméticas:

?- +(X,Y) = a+b. ?- +(X,Y) = a+(b+c).


X=a X=a
Y=b Y = b+c

?- +(X,Y) = a+b+c. ?- a+b+c = (a+b)+c.


X = a+b Yes
Y=c
?- a+b+c = a+(b+c).
No
Departamento de Electrónica, Sistemas Informáticos y Automática Pág. Curso 2004-2005
Universidad de Huelva 29
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog

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

Operador Tipo xfx, xfy, yfx, fx


• X representa a un argumento cuya precedencia debe ser
estrictamente menor que la de el operador
• Y representa a un argumento cuya precedencia es menor o igual
que la del operador

Estas reglas eliminan la ambigüedad en expresiones con varios


operadores de la misma precedencia

Departamento de Electrónica, Sistemas Informáticos y Automática Pág. Curso 2004-2005


Universidad de Huelva 30
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog

Ejemplo
a–b–c
Que operación se realiza antes?
operador Precedencia Tipo
- 500 yfx
Posibles árboles de interpretación:

Precedencia 500 Precedencia 500

- -

- c a -
Precedencia 0 Precedencia 0

a b b c
Precedencia 500
Precedencia 500

Departamento de Electrónica, Sistemas Informáticos y Automática Pág. Curso 2004-2005


Universidad de Huelva 31
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog

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

Departamento de Electrónica, Sistemas Informáticos y Automática Pág. Curso 2004-2005


Universidad de Huelva 32
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog

Autómata Finito No Determinista.

a
S1 S2
a
null

null

S4 S3
b

Departamento de Electrónica, Sistemas Informáticos y Automática Pág. Curso 2004-2005


Universidad de Huelva 33
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog

% 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

Departamento de Electrónica, Sistemas Informáticos y Automática Pág. Curso 2004-2005


Universidad de Huelva 34
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog
aceptado(Estado_inicial, []) :-
final(Estado_inicial).
aceptado(Estado_inicial, [Cabeza|Cola]) :-
transicion(Estado_inicial, Cabeza, S1),
aceptado(S1, Cola).
aceptado(Estado_inicial, Cadena) :-
silencioso(Estado_inicial, S1),
aceptado(S1, Cadena).
/*
% Objetivos:
% aceptado(s1, [a, a, a]).
%
% Yes
%
% aceptado(X, [a, b]).
%
% X = s1;
% X = s3;
%
% No
%
% aceptado(s1, [X1,X2,X3]).
%
% X1 = a
% X2 = a
% X3 = b ;
%
% X1 = b
% X2 = a
% X3 = b ;
%
% No

Departamento de Electrónica, Sistemas Informáticos y Automática Pág. Curso 2004-2005


Universidad de Huelva 35
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog

% Cadena = [_, _, _], aceptado(s1, Cadena).


%
% Cadena = [a, a, b] ;
%
% Cadena = [b, a, b] ;
%
% No
%
% ¿Desde que estados el autómata puede aceptar cadenas de longitud 7?
%
% Modificación para evitar bucles infinitos
% aceptado (Estado_inicial, Cadena, Longitud)

*/

Departamento de Electrónica, Sistemas Informáticos y Automática Pág. Curso 2004-2005


Universidad de Huelva 36
Programación Declarativa Tema 2: Aritmética, datos y estructuras en Prolog
aceptado(Estado_inicial, [], 0) :-
final(Estado_inicial).

aceptado(Estado_inicial, [Cabeza|Cola], Longitud) :-


Longitud > 0,
Longitud2 is Longitud -1,
transicion(Estado_inicial, Cabeza, S1),
aceptado(S1, Cola, Longitud2).

aceptado(Estado_inicial, Cadena, Longitud) :-


Longitud > 0,
Longitud2 is Longitud -1,
silencioso(Estado_inicial, S1),
aceptado(S1, Cadena, Longitud2).

/*

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
*/

Departamento de Electrónica, Sistemas Informáticos y Automática Pág. Curso 2004-2005


Universidad de Huelva 37

You might also like