Você está na página 1de 24

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

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 24

Você também pode gostar