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
Top Related