Prolog Operadores aritméticos

31
1 de 31 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 = :unificación. Es verdadero si ambos operandos unifican, en cuyo caso se realiza la unificación. Prolog Prolog Dados 2 términos cualesquiera, T1 y T2, para que se unifiquen en PROLOG uno de ellos debe ser una variable no instanciada y al final acabara tomando el valor del otro.

Transcript of Prolog Operadores aritméticos

1 de 31

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= :unificación. Es verdadero si ambos operandos unifican, en cuyo caso se realiza la unificación.

PrologProlog

Dados 2 términos cualesquiera, T1 y T2, para que se unifiquen en PROLOG uno de ellos debe ser una variable no instanciada y al final acabara tomando el valor del otro.

2 de 31

Operadores de igualdad\= :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.

PrologProlog

3 de 31

Operadores de igualdad\= = :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).

PrologProlog

4 de 31

?­ X is 3+4.X=7Yes

?­ X+Y = 3+5.X=3, Y=5Yes

?­ X = 3+5. X=3+5 Yes 

?­ X is 8, X = 3+5. No 

?­ X is 8, X is 3+5.X=8Yes

3 = = 1+2.No

3*3 =:= 9.Yes.

?­ X*Y = 9*a.X=9,Y=aYes

PrologProlog

5 de 31

precio(boligrafo, 0.5).precio(folios, 2.5).precio(portatil, 700).precio(carro, 5000).precio(tomate, 2).

%% ¿Qué puedo comprar con 100 pesos??­ precio( X,Y ), Y < 100. X=boligrafo, Y=0,5; X=folios, Y=2,5; X=tomates, Y=1; No.

PrologProlog

6 de 31

ganados( juan, 7 ).ganados( susana, 6 ).ganados( pedro, 2 ).ganados( rosa, 5 ).jugados( rosa, 10 ).jugados( juan, 13 ).jugados( pedro, 3 ).jugados( susana, 7 ).

porcentaje( X,Y ):­ ganados( X,Z ),jugados( X,Q ),Y is ( Z/Q )*100.

PrologProlog

?­ porcentaje(X,Y).X = juan,Y = 53.84615384615385 ;X = susana,Y = 85.71428571428571 ;X = pedro,Y = 66.66666666666666 ;X = rosa,Y = 50.0.

7 de 31

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.

PrologProlog

8 de 31

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

El operador 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

PrologProlog

9 de 31

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)

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

PrologProlog

10 de 31

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.

PrologProlog

11 de 31

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.

PrologProlog

12 de 31

Funciones:

Prolog implementa algunas funciones matemáticas:

abs/1 : valor absolutocos/1 : cosenosin/1 : senotan/1 : tangenteexp/1 : exponencial (ex)log/1 : logaritmo en base esqrt/1 : raíz cuadradaround/1 : redondeorandom/1 : número aleatorio

PrologProlog

13 de 31

Las variables que aparecen en el argumento de las funciones deben estar adecuadamente instanciadas.

?­ X is sqrt(6). –  Correcto: X=2.449

PrologProlog

14 de 31

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.

PrologProlog

15 de 31

Tipos de datos

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érmino 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

PrologProlog

16 de 31

Estructuras

La forma de introducir datos estructurados en Prolog es sencilla. Por ejemplo:

persona( nombre(‘Pedro’), apellido(‘López’), cc( 123456789 ) ).persona( nombre(‘Ana’), apellido(‘Macías’), cc( 987654321 ) ).

%% Recuperar nombres y apellidos:?­ persona( nombre(X), apellido(Y), _ ).X=‘Pedro’, Y=‘López’;X=‘Ana’, Y=‘Macías’;No.

Persona:NombreApellidoCC

Persona 1:PedroLópez123456789

Persona 2:AnaMacías987654321

PrologProlog

17 de 31

Estructuras

De igual modo, podemos construir registros compuestos. Por ejemplo:

partido( local( nombre( ‘America’ ), ciudad(‘Cali’) ), visitante( nombre(‘Tolima’), ciudad(‘Tolima’) ), glocal(10), gvisit(0) ).partido( local( nombre( ‘Nacional’ ), ciudad(‘Medellin’) ), visitante( nombre(‘Equidad’), ciudad(‘Bogotá’) ), glocal(1), gvisit(2) ).

Registro Equipo:NombreCiudad

Partido 1:AméricaTolima100

Partido 2:NacionalEquidad12

Registro Partido:LocalVisitanteGoles localGoles visitante

PrologProlog

18 de 31

Estructuras

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.

Registro Equipo:NombreCiudad

Partido 1:AméricaTolima100

Partido 2:NacionalEquidad12

Registro Partido:LocalVisitanteGoles localGoles visitante

PrologProlog

19 de 31

Estructuras

Consultar todos los equipos de Cali  que ganan en casa y los tanteos

?­ ganacasa(X,’Cali’,Y,Z).X=‘America’, Y=10, Z=0; No

Registro Equipo:NombreCiudad

Partido 1:AméricaTolima100

Partido 2:NacionalEquidad12

Registro Partido:LocalVisitanteGoles localGoles visitante

PrologProlog

20 de 31

Estructuras

Consultar todos los equipos de Cali que ganan en casa por más de 5 tantos:

?­ ganacasa(X,’Cali’,Y,Z), Y > Z+5.X=‘America’, Y=10, Z=0; No

Registro Equipo:NombreCiudad

Partido 1:AméricaTolima100

Partido 2:NacionalEquidad12

Registro Partido:LocalVisitanteGoles localGoles visitante

PrologProlog

21 de 31

ÁrbolesEn Prolog, los predicados pueden interpretarse como árboles:oracion( sujeto( ‘Pedro’ ), predicado( verbo( ‘come’ ), objetodirecto( ‘bocadillo’ ) ) )

Y, del mismo modo, pueden representarse árboles en forma de predicados:arbol( a, arbol( c, arbol( 1, 2, 3 ) ), b )

PrologProlog

22 de 31

ÁrbolesEjemplo: 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) + ( ( 1 ­ (4*8) ) / (7^2) ) )

%Solución en Prolog

inord( a(OP,HI,HD) ):­ write(‘(‘),inord(HI),write(OP),inord(HD),write(‘)’).

inord(X):­write(X).

PrologProlog

23 de 31

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

PrologProlog

24 de 31

Listas

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 ]

PrologProlog

25 de 31

Listas

Unificación de listas:

Dos listas unifican si sus componentes unifican una a una:

[X, Y, Z] = [a, b, c]  –  unifica[X, Y, Z] = [a, b, c, d] –  no unifica

Existe una sintaxis especial para la utilización de listas: la sintaxis de barra. [ Cabeza | Cola ]

PrologProlog

26 de 31

Listas

Unificación de listas:

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.

PrologProlog

27 de 31

Listas

Ejemplos:

Longitud de una lista:

% Si queremos hallar la longitud de una lista.% La longitud de una lista vacia es 0.% La longitud de cualquier lista es la longitud de la cola + 1.

longitud([],0).longitud([_|T],N):-longitud(T,N0), N is N0 + 1.

?- longitud([a,b,c],L). L = 3?- longitud([a,b,c],4). No

PrologProlog

28 de 31

Listas

Ejemplos:

Búsqueda de un elemento

% Si queremos determinar si un elemento pertenece a una lista.% El elemento pertenece a la lista si coincide con la cabeza de la lista.% El elemento pertenece a la lista si se encuentra en la cola de la lista.

pertenece(X,[X|_]) :- !.pertenece(X,[_|R]):- pertenece(X,R). ?- pertenece(b,[a,b,c]). Yes?- pertenece(b,[a,[b,c]]). No?- pertenece([b,c],[a,[b,c]]). Yes

PrologProlog

29 de 31

Listas

Ejemplos:

Eliminar elemento de una lista

% Si queremos eliminar un elemento de la lista.% Si X es la cabeza de la lista, la cola T es la lista sin X% Si X no es la cabeza de la lista, conservamos la cabeza de la lista % como parte de la respuesta y continuamos eliminando X de la cola T.

elimina(X,[X|T],T).elimina(X,[H|T],[H|T1]):- elimina(X,T,T1). ?- elimina(1,[1,2,3,4],R). R = [2,3,4]

PrologProlog

30 de 31

Listas

Ejemplos:

Concatenar listas

% Si queremos concatenar dos listas lista. % Concatenar una lista vacia con L es L.% Concatenar X|L1 con L2 es poner el primer % elemento de la primera lista (X) más la % concatenación del resto de la lista (L1) con L2

concatenar([],L,L).concatenar([X|L1],L2,[X|L3]):-concatenar(L1,L2,L3). ?- concatenar([1,2],[3,4],R).R = [1, 2, 3, 4].

PrologProlog

31 de 31

Listas

Ejemplos:

Comprobar si una lista es la inversa de otra

% Si queremos calcular la inversa de una lista. % La inversa de una lista vacía es una lista vacía% La inversa de H|T es la inversa de T concatenada con H. inversa([],[]).inversa([H|T],L):- inversa(T,R), concatenar(R,[H],L). ?- inversa([a,b,c,d],[d,c,b,a]). Yes/Si

PrologProlog