Está en la página 1de 18

PROLOG

Tema 2:
Variables anónimas
Operadores y aritmética

UNIVERSIDAD DE VALLADOLID
Índice

1. Variables anónimas
2. Alcance de las variables y constantes
3. Igualdad
4. Desigualdad
5. Igualdad y desigualdad estrictas
6. Aritmética
7. Ejercicios
1. Variables anónimas (I)
 Se representan mediante el guión bajo “_”

 Cuando una variable aparece solo una vez en una


cláusula, se puede sustituir por una variable
anónima.

 Cada vez que en una cláusula aparece una variable


anónima, es una variable distinta.

 Si las uso en consultas o preguntas, no obtengo el


valor de las mismas.
1. Variables anónimas (II)
 Programa ejemplo con variables anónimas:
padre(carlos, jorge).
padre(jorge, maria).
padre(luis,miguel).

% tiene_un_hijo(X) :- padre(X,Y).
Como Y solo aparece una vez, puede usar una variable anónima
tiene_un_hijo(X) :- padre(X,_).

% alguien_tiene_un_hijo :- padre(X,Y).
En esta cláusula como X e Y aparecen solo una vez, puedo
sustituirlas por variables anónimas, y ambas serán distintas.
alguien_tiene_un_hijo :- padre(_,_).

* alguien_tiene_un_hijo es un predicado sin argumentos que solo


puede tener el valor true o false
1. Sin variables anónimas en el .pl
Warning: Singleton variables: [X,Y]
(significa que hay variables que se
alguien_tiene_un_hijo.pl podrían poner como anónimas, en
este caso tanto X como Y)
padre(carlos, jorge). ?- alguien_tiene_un_hijo.
padre(jorge, maria). true ;
padre(luis,miguel). true ;
alguien_tiene_un_hijo:-padre(X,Y). true.

?- padre(X,_). Aquí, al preguntar


X = carlos ; usando variable
?- padre(X,Y).
anónima en lugar de Y,
X = carlos, X = jorge ; solo obtengo los
Y = jorge ; X = luis. valores de la X
X = jorge,
Y = maria ;
X = luis, ?- padre(_,_).
Y = miguel. true ;
true ;
true.
1. Con variables anónimas en el .pl

alguien_tiene_un_hijo.pl

padre(carlos, jorge).
padre(jorge, maria).
padre(luis,miguel).
alguien_tiene_un_hijo:-padre(_,_).

Ya no hay warning de singleton variable al


compilar.
Aunque las respuestas son las mismas.

?- alguien_tiene_un_hijo.
true ;
true ;
true.
2. Alcance de variables y constantes (I)
 El alcance léxico de los nombres de variable es una
cláusula. Cada vez que aparece X en la misma
cláusula significa la misma variable.

 El alcance léxico de una variable anónima es la


propia variable. Cada vez que aparece una variable
anónima en cualquier lugar de un programa es una
variable distinta.

 Las constantes iguales en distintas cláusulas


significan el mismo objeto. Cada vez que aparece
una constante en cualquier lugar del programa es la
misma constante.
2. Alcance de variables y constantes (II)
 Ejemplo:

m(d).
a(X):-b(X),c(X). % la variable X es la misma las 3 veces que aparece
h(X,d):-j(X,_). % las dos X aquí son iguales entre sí y distintas de las
% tres X de la cláusula anterior
p(Z):-r(_,_). % las dos variables anónimas son distintas entre sí, y
% distintas de la de la cláusula anterior.

% La constante “d” es la misma las dos veces que aparece.


3. Igualdad (I)
 Mención especial al operador “igual”:
 Unifica las expresiones a ambos lados, por tanto,
si son números con operadores, no realiza la
operación.
 ?- X = Y.
Pregunta que si “X unifica con Y”.

 La unificación que realiza Prolog con el operador


= no es completamente igual a la estudiada en
teoría, para eso usar el predicado predefinido
unify_with_occurs_check
 ?- unify_with_occurs_check(p(Y),p(f(X))).
Y = f(X).
 ?- unify_with_occurs_check(p(X),p(f(X))).
false. (Una variable no puede unificar con un término
que contiene a la variable. Esto no lo contempla el
operador =)
3. Igualdad (II)
 Esto desencadena satisfacer un objetivo.
Ejemplos:
?- papel=boligrafo. (false)
?-1024=1024. (true)
?-1024-(20-10) = 1024-10. (false porque no unifican,
recordar que no realiza la operación)
?- 7 = 4+3. (false porque no unifican)
?- 4+3 = X. X = 4+3.
?- tiene(juan, bicicleta) = tiene(juan, X). X=bicicleta.
?- a(b, C, d(e, F, g(h, i, J)))=a(B, c, d(E, f, g(H, i, j))).
C = c F = f J = j B = b E = e H = h.
?- a(b, C, d(e, F, g(h, i, j)))=a(B, c, d(E, f, G)).
C = c F = f B = b E = e G = g(h, i, j).
4. Desigualdad
 Es el operador \=

 ?- X\=Y. Se satisface si X no unifica con Y

 De la misma manera que el anterior, son


predicados predefinidos y no se pueden
alterar.
?- oro \= plata. (true)
?- 7 \= 4+3. (true)
?- X \= 5. (false)
5. Igualdad y desigualdad estrictas
 Se usan los operadores siguientes:
 == (igualdad estricta) Solo es true en los casos
en los que
?- cte == cte.
?- Var == Var.
 \== (desigualdad estricta) Será true cuando ==
sea false y viceversa
 No unifican, comprueban si son iguales o
desiguales las expresiones a ambos lados
 Ejemplos:
?- 4 == X. (false) ?- 4 \== X. (true)
?- 7 == 4+3. (false) ?- 7 \== 4+3. (true)
6. Aritmética (I)
 Comparación de números:
 X < Y true si X es menor que Y
 X > Y true si X es mayor que Y
 X =< Y true si X es igual o menor que Y
 X >=Y true si X es mayor o igual que Y
 X =:= Y true si X es igual a Y

 Son predicados predefinidos y no se permite


su alteración. No se puede escribir <= o =>.
 Ejemplos:
?- 2>3. (false)
?- 3>2. (true)
?- 2 >= 5. (false)
?- 2 =< 5. (true)
6. Aritmética (II)
 Estos operadores de comparación sí fuerzan la realización
de las operaciones de las expresiones a ambos lados.
 Con estos operadores de comparación, si alguna variable
no está instanciada, se producirá un error.
 Ejemplos:
?- 2.1 < 3.5. (true ya que compara y 2.1 es menor que 3.5)
?- 3/2 =:= 1.5. (true ya que evalúa 3/2 y da el mismo valor que 1.5)
?- 2 >= 5. (false ya que compara y 2 no es mayor o igual que 5)
?- 3+X =< 7. (Error ya que no puede realizar la operación 3+X al
no estar instanciada la variable X).
?- 1+2 =:= X+2. (Error ya que no puede realizar la operación X+2
al no estar instanciada la variable X).
6. Aritmética (III)
 Operadores aritméticos:
X+Y, X-Y, X*Y, X/Y, X mod Y, X//Y (división entera)

 Operador is: fuerza la realización de las operaciones de


la expresión de la derecha y después unifica con la de la
izquierda.

 Ejemplos:
?- 4 is 8/2. (true: evalúa 8/2 y unifica con 4)
?- 5 is 8*2. (false: evalúa 8*2 y no unifica con 5)
?- N is 15//2.
N = 7. (evalúa 15//2 y unifica. Retorna valor variable unificada)
?- 2 is 4/X. (Error ya que la variable X no está instanciada y no se
puede realizar la operación de la derecha del is)
?- 4/X is 2. (false, 2 no puede unificar con 4/X)
7. Ejercicios (I)
 Escribir el siguiente programa, y realizar las consultas que se
proponen u otras que quieras. Antes de realizarlas, pensar qué
va a dar Prolog. Contrastarlo con el resultado e intentar
entender por qué lo da.

Ejercicio:
reina(carlos_i, 1516, 1556). rey_casa_austria(X, Y):-
reina(felipe_ii, 1556, 1598). Y>=1516, Y=<1700,
reina(felipe_iii, 1598, 1621). reina(X, A, B),
reina(felipe_iv, 1621, 1665). Y >= A, Y =< B.
reina(carlos_ii, 1665, 1700).
?- reina(carlos_ii, X, Y). ?- rey_casa_austria(X, 1621).
?- rey_casa_austria(X, 1600). ?- rey_casa_austria(X, Y).
7. Ejercicios (II)

 Realización de cálculos:
Ejercicio:
poblacion(eeuu, 203). superficie(eeuu, 3). densidad(X, Y) :-
poblacion(india, 548). superficie(india, 1). poblacion(X, P),
poblacion(china, 800). superficie(china, 4). superficie(X, S),
poblacion(brasil, 108). superficie(brasil, 3). Y is P/S.
?- densidad(eeuu, X).
?- densidad(X, 67.6667).
?- densidad(X, 36).
?-densidad(eeuu, 203/3).
7. Ejercicios (III)
 Respecto al ejercicio de la familia del
tema 1:
 Modificar la regla hermana o hermano para
que una persona no sea hermana/o de sí
misma/o. (Recordar que el operador
desigualdad es \= y refleja que dos
objetos son distintos).

También podría gustarte