Escolar Documentos
Profissional Documentos
Cultura Documentos
Aritmtica en Prolog
ndice.
Operadores Aritmtica
Sumario
Prolog IV 2
Operadores.
?- 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
Operadores.
Notacin Prefija -
2+3*4-5
:- op(500, yfx, +).
Precedencia: 500
2 Tipo:
yfx *
4
4
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
Prolog IV
El Tipo de un Operador.
:- op( 500, yfx, -).
yfx
-
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
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
900
fy
\+
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
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
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