You are on page 1of 25

IV.

Aritmtica en Prolog

Departamento de Informtica y Sistemas Universidad de Las Palmas de Gran Canaria


Prolog IV 1

Jorge Cabrera Gmez

ndice.
Operadores Aritmtica

Sumario
Prolog IV 2

Operadores.

?- display(2 + 2). +(2, 2)

?- display(3 * 4 + 6). La posibilidad de definir operadores+(*(3, 4), 6) en Prolog debe entenderse como un recurso que permite al programador habilitar una sintaxis ms adecuada. 6)). ?- display(3 * (4 + *(3, +(4, 6))

P.e.: la operacin
debera escribirse

2+3*4-5 -(+(2, *(3, 4)), 5)

donde -, +, * son functores y 2,3,4,5 sus argumentos


Prolog IV 3

Operadores.
Notacin Prefija -

-(+(2, *(3, 4)), 5)


Notacin Infija

:- op(500, yfx, +).


+ 5

2+3*4-5
:- op(500, yfx, +).

Precedencia: 500
2 Tipo:

yfx *
4
4

:- op(500, yfx, -).


:- op(400, yfx, *).
Prolog IV

Nombre: +
3 directivas

Tipos de Operadores
Un operador se define por su precedencia, tipo y nombre infijo (3 tipos): xfx, xfy, yfx prefijo (2 tipos): fx, fy

Ejemplo: 3 + 4 Ejemplo: -7 Ejemplo: 8 factorial


5

sufijo (2 tipos): xf, yf

Prolog IV

El Tipo de un Operador.
:- op( 500, yfx, -).

yfx
-

y : Asociatividad a la izquierda x : No Asociatividad a la derecha


Prolog IV

a-b-c

yfx -

a-b-c

xfy -

c
Precedencia 500

Precedencia 500

(a - b) - c
Prolog IV

No !

a - (b - c)
7

El Tipo de un Operador.
Infijo: xfx no es asociativo xfy de derecha a izquierda yfx de izquierda a derecha

Prefijo: fx no es asociativo fy de izquierda a derecha Sufijo: xf no es asociativo yf de derecha a izquierda


Prolog IV 8

Operadores predefinidos en SWI-Prolog


1200 1200 1150 xfx fx fx -->, ::-, ?dynamic, multifile, module_transparent, discontiguous, volatile, initialization ;, | -> La precedencia puede , estar entre 1200 y 1 \ \+ ~ <, =, =.., =@=, =:=, =<, ==, =\=, >, >=, @<, @=<, @>, @>=, \=, \==, is : Se evalan antes los +, -, /\, \/, xor +, -, ?, \ operadores de menor *, /, //, <<, >>, mod, rem precedencia ** 9 ^

1100 xfy 1050 xfy 1000 xfy 954 xfy 900 fy 900 fx 700 xfx 600 xfy 500 yfx 500 fx 400 yfx 200 xfx Prolog IV 200 xfy

?- X is 2^3. X=8 Yes 200 200 xfx xfy ** ^ ?- X is 2^2^3, Y is (2^2)^3. X = 256 Y = 64 Yes

?- X isis 2**3. ?- X 2**2**3. [WARNING: Syntax error: Operator `**' conflicts with `**' X=8 X is 2** Yes ** here ** 2**3 . ]
Prolog IV 10

Se puede saber si un operador est definido y cmo?


current_op(?Precedencia, ?Tipo, ?Nombre) Es verdadero si el operador Nombre est definido como operador de tipo Tipo con precedencia Precedencia

?- current_op(Precedencia, Tipo, \+).


Precedencia = 900 Tipo = fy Yes
Prolog IV 11

900

fy

\+

Como el operador \+ (not) est definido como: fy es legal. \+ \+ p

Si se hubiese definido como: fx


\+ \+ p

sera ilegal porque el argumento del primer \+ es \+ p, que tiene la misma predecencia que \+
Prolog IV 12

is_in(apple, room(kitchen)). Definimos is_in/2 como operador infijo de precedencia arbitraria 35. ?- op(35, xfx, is_in). Ahora podemos preguntar: ?- apple is_in X. X = room(kitchen) o ?- X is_in room(kitchen). X = apple Podemos incluso aadir hechos al programa utilizando la sintaxis del operador. banana is_in room(kitchen). Para verificar que Prolog trata por igual ambas sintaxis intentamos su unificacin. ?- is_in(banana, room(kitchen)) = banana is_in room(kitchen). yes Por medio de display/1 es posible ver en qu se traduce la nueva sintaxis. ?- display(banana is_in room(kitchen)). Prolog IV 13 is_in(banana, room(kitchen)) (Tutorial de Amzi Prolog, Cap. 12)

Aritmtica en Prolog
Prolog provee ciertos predicados predefinidos para realizar operaciones aritmticas bsicas. + * / mod div ... Adicin Sustraccin Multiplicacin Divisin Mdulo Divisin entera ...

Prolog IV

14

Aritmtica en Prolog
Conflicto: evaluacin aritmtica vs. unificacin

?- X = 1+2.2,display(X), Y is X. X =1 + 2, display(X). 1+ +(1, 2) X = 1+2 X = 1+2 Y= Yes 3 Yes Yes Trmino: 1+2 functor: + argumentos: 1, 2 El predicado predefinido is fuerza la evaluacin 15

Prolog IV

Aritmtica en Prolog
Operadores relacionales predefinidos X>Y X<Y X es mayor que Y X es menor que Y

X >= Y
X =< Y X =:= Y X =\= Y

X es mayor o igual que Y


X es menor o igual que Y Los valores de X e Y son iguales Los valores de X e Y no son iguales

Prolog IV

16

Aritmtica en Prolog
?- 3 + 4 =:= 5 + 2. Yes ?- 1 + 2 = 1 + 2. Yes ?- 1 + 2 = 2 + 1. No ?- 1 + A = B + 2. A=2 B=1 Yes ?- 1+A =:= B+2. [WARNING: Arguments are not sufficiently instantiated] Exception: ( 8) 1+_G124=:=_G126+2 ? creep [WARNING: Unhandled exception] Prolog IV

17

Aritmtica en SWI-Prolog
- +Expr +Expr1 + +Expr2 +Expr1 - +Expr2 +Expr1 * +Expr2 +Expr1 / +Expr2 +IntExpr1 mod +IntExpr2 +IntExpr1 rem +IntExpr2 +IntExpr1 // +IntExpr2 +Expr1 ** +Expr2 max(+Expr1, +Expr2) min(+Expr1, +Expr2) Resultado = -Expr Resultado = Expr1 + Expr2 Resultado = Expr1 - Expr2 Resultado = Expr1 Expr2 Resultado = Expr1/Expr2 Resultado = Expr1 mod Expr2 Resultado = Expr1 rem Expr2 Resultado = Expr1 divExpr2 (div. entera) Resultado = Expr1**Expr2 Devuelve el mayor de Expr1 y Expr2. Devuelve el menor de Expr1 y Expr2.

Prolog IV

18

Aritmtica en SWI-Prolog
+IntExpr1 >> +IntExpr2 +IntExpr << +IntExpr +IntExpr \/ +IntExpr +IntExpr /\ +IntExpr +IntExpr xor +IntExpr \ +IntExpr
Prolog IV

Desplazamiento binario a la dcha de IntExpr1 en IntExpr2 bits Idem a la izda Or binario entre IntExpr1 y IntExpr2 And binario entre IntExpr1 y IntExpr2. Or exclusivo Inversin de bits
19

Aritmtica en SWI-Prolog
abs(+Expr) sign(+Expr) round(+Expr) integer(+Expr) float(+Expr) Evala Expr y devuelve su valor absoluto Devuelve -1 si Expr < 0, 1 si Expr > 0 y 0 si Expr=0. Evala Expr y redondea al entero ms prximo Lo mismo que round\1 Se traduce el resultado de la evaluacin a un formato de coma flotante. float_fractional_part(+Expr) Parte fraccionaria de un nmero en coma flotante. Negativo si Expr es negativo, 0 si Expr es entero. float_integer_part(+Expr) Parte entera de un nmero en coma flotante. truncate(+Expr) Trunca Expr a un entero. Equivalente a float_integer_part/1.
Prolog IV 20

Ejemplo: factorial.
factorial(N, F) :N > 0, N1 is N - 1, factorial(N1, F1), F is N*F1. factorial(0,1).

Prolog IV

factorial(N, F) :- factorial(0, N, 1, F). factorial(I, N, T, F) :I < N, I1 is I+1, T1 is T*I1, factorial(I1, N, T1, F). factorial(N, N, F, F).

21

Ejemplo: sumar una lista.


sumar_lista( [I | Is], Sum) :sumar_lista( Is, IsSum), Sum is I + IsSum. sumar_lista([ ],0).

Prolog IV

sumar_lista( Is, IsSum) :- sumar_lista(Is, 0, IsSum). sumar_lista( [I | Is], Temp, Sum) :Temp1 is Temp + I, sumar_lista( Is, Temp1, Sum). sumar_lista([ ], Sum, Sum).
22

arithmetic_function(+Head)
Registra un predicado Prolog como una funcin aritmtica (ver is/2, >/2 , etc.). El predicado Prolog debera tener un argumento adicional que lo especificado por Head, el cul puede indicarse como un trmino en forma de Nombre/Aridad, como tomo, o como trmino complejo. Este ltimo argumento es una variable no instanciada en el momento de la llamada y deber ser instanciada como un nmero entero o de coma flotante. Los otros argumentos son parmetros. Esta declaracin slo es vlida para el contexto del mdulo donde se realiza, a menos que se declare desde el mdulo user.
Prolog IV

1 ?- [user]. :- arithmetic_function(mean/2).
mean(A, B, C) :C is (A+B)/2. user compiled, 0.07 sec, 440 bytes. Yes 2 ?- A is mean(4, 5). A = 4.500000 1 ?- [user]. :- arithmetic_function(factorial/1). factorial(N, F) :- factorial(0, N, 1, F). factorial(I, N, T, F) :I < N, I1 is I+1, T1 is T*I1, factorial(I1, N, T1, F). factorial(N, N, F, F). user compiled, 0.01 sec, 676 bytes. Yes 2 ?- A is factorial(4). A = 24
23

Aritmtica con nmeros racionales


Una caracterstica interesante de SWI- Prolog es que soporta un mdulo aritmtico para l clculo con nmeros racionales.

+RatExpr rdiv +RatExpr


Rational number division. This function is only available if SWIProlog has been compiled with rational number support. Con rational/1 podemos obtener el nmero racional equivalente de un nmero en coma flotante, aunque con ciertas limitaciones pues, por ejemplo, no es posible representar adecuadamente en un formato en coma flotante los nmeros decimales que sean peridicos puros o mixtos.
2 ?- A is 2 rdiv 6. A = 1 rdiv 3. 3 ?- A is rational(1.5). A = 3 rdiv 2.
Prolog IV

4 ?- A is 4 rdiv 3 + 1. A = 7 rdiv 3. ?- A is 4 rdiv 3 + rational(1.5). A = 17 rdiv 6. 9 ?- A is rational(1.5555). 24 A = 3502674610187403 rdiv 2251799813685248.

Sumario.
El uso de operadores aumenta la legibilidad de los programas. Pueden ser infijos, prefijos o sufijos. El programador puede definir sus propios operadores. Un operador se define mediante una directiva que especifica su precedencia, tipo y nombre. El predicado is provoca la evaluacin de operadores aritmticos. Para evaluar una operacin aritmtica todos los argumentos deben estar instanciados a nmeros. Los operadores de relacin (<, =<, =:=, ...) fuerzan la evaluacin de sus argumentos.
Prolog IV 25

You might also like