iv. aritmética en prolog

24
Prolog IV 1 IV. Aritmética en Prolog Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria

Upload: qamar

Post on 26-Jan-2016

65 views

Category:

Documents


2 download

DESCRIPTION

IV. Aritmética en Prolog. Jorge Cabrera Gámez Departamento de Informática y Sistemas Universidad de Las Palmas de Gran Canaria. Índice. Operadores Aritmética Sumario. ?- display(2 + 2). +(2, 2) ?- display(3 * 4 + 6). +(*(3, 4), 6) ?- display(3 * (4 + 6)). - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: IV. Aritmética en Prolog

Prolog IV 1

IV. Aritmética en

Prolog

Jorge Cabrera GámezDepartamento de Informática y Sistemas

Universidad de Las Palmas de Gran Canaria

Page 2: IV. Aritmética en Prolog

Prolog IV 2

Índice.

Operadores

Aritmética

Sumario

Page 3: IV. Aritmética en Prolog

Prolog IV 3

Operadores.

La posibilidad de definir operadores en Prologdebe entenderse como un recurso que permite alprogramador habilitar una sintaxis más adecuada.

P.e.: la operación 2 + 3 * 4 - 5

debería escribirse -(+(2, *(3, 4)), 5)

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

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

?- display(3 * 4 + 6). +(*(3, 4), 6)

?- display(3 * (4 + 6)). *(3, +(4, 6))

Page 4: IV. Aritmética en Prolog

Prolog IV 4

Operadores.

2

+ 5

-

3 4

*

Notación Prefija

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

Notación Infija

2 + 3 * 4 - 5

:- op(500, yfx, +).

:- op(500, yfx, -).

:- op(400, yfx, *).

:- op(500, yfx, +).

Precedencia: 500

Tipo: yfx

Nombre: +

directivas

Page 5: IV. Aritmética en Prolog

Prolog IV 5

Tipos de Operadores

Un operador se define por su precedencia, tipo y nombre

infijo (3 tipos): xfx, xfy, yfx Ejemplo: 3 + 4 prefijo (2 tipos): fx, fy Ejemplo: -7

sufijo (2 tipos): xf, yf Ejemplo: 8 factorial

Page 6: IV. Aritmética en Prolog

Prolog IV 6

El Tipo de un Operador.

a b

- c

-

y f x

a - b - c

:- op( 500, yfx, -).

y f xy f xy f x

y : Asociatividad a la izquierda

x : No Asociatividad a la derecha

Page 7: IV. Aritmética en Prolog

Prolog IV 7

(a - b) - c a - (b - c)

-

a

b

-

c

Precedencia 500

xfy

¡ No !

a b

- c

-

Precedencia 500

yfx a - b - c

Page 8: IV. Aritmética en Prolog

Prolog IV 8

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

El Tipo de un Operador.

Page 9: IV. Aritmética en Prolog

Prolog IV 9

Operadores predefinidos en SWI-Prolog

1200 xfx -->, :- 1200 fx :-, ?- 1150 fx dynamic, multifile, module_transparent, discontiguous, volatile, initialization1100 xfy ;, | 1050 xfy -> 1000 xfy , 954 xfy \ 900 fy \+900 fx ~ 700 xfx <, =, =.., =@=, =:=, =<, ==, =\=, >, >=, @<, @=<, @>, @>=, \=, \==, is 600 xfy : 500 yfx +, -, /\, \/, xor 500 fx +, -, ?, \ 400 yfx *, /, //, <<, >>, mod, rem 200 xfx ** 200 xfy ^

La precedencia puedeestar entre 1200 y 1

Se evalúan antes los operadores de menor precedencia

Page 10: IV. Aritmética en Prolog

Prolog IV 10

200 xfx ** 200 xfy ^

?- X is 2^3.X = 8Yes

?- X is 2^2^3, Y is (2^2)^3.X = 256Y = 64 Yes

?- X is 2**3.

X = 8 Yes

?- X is 2**2**3.

[WARNING: Syntax error: Operator `**' conflicts with `**' X is 2**** here **2**3 . ]

Page 11: IV. Aritmética en Prolog

Prolog IV 11

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

Precedencia = 900Tipo = fy

Yes

¿Se puede saber si un operador está definido y cómo?

current_op(?Precedencia, ?Tipo, ?Nombre)

Es verdadero si el operador Nombre está definido como operador de tipo Tipo con precedencia Precedencia

Page 12: IV. Aritmética en Prolog

Prolog IV 12

900 fy \+

Como el operador \+ (not) está definido como: fy

\+ \+ p es legal.

Si se hubiese definido como: fx

\+ \+ p

sería ilegal porque el argumento del primer \+es \+ p, que tiene la misma predecencia que \+

Page 13: IV. Aritmética en Prolog

Prolog IV 13

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 añadir hechos al programa utilizando la sintaxis del operador.

banana is_in room(kitchen).

Para verificar que Prolog trata por igual ambas sintaxis intentamos su unificación.

?- 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)).

is_in(banana, room(kitchen)) (Tutorial de Amzi Prolog, Cap. 12)

Page 14: IV. Aritmética en Prolog

Prolog IV 14

Aritmética en Prolog

Prolog provee ciertos predicados predefinidospara realizar operaciones aritméticas básicas.

+ Adición- Sustracción* Multiplicación/ Divisiónmod Módulodiv División entera . . . . . .

Page 15: IV. Aritmética en Prolog

Prolog IV 15

Aritmética en Prolog

Conflicto: evaluación aritmética vs. unificación

?- X = 1+2.X = 1+2 Yes

?- X = 1 + 2, display(X).+(1, 2)X = 1+2

Yes

?- X = 1 + 2, display(X), Y is X.+(1, 2)X = 1+2Y = 3

Yes

Término: 1+2functor: +argumentos: 1, 2

El predicado predefinidois fuerza la evaluación

Page 16: IV. Aritmética en Prolog

Prolog IV 16

Aritmética en Prolog

X > Y X es mayor que Y

X < Y X es menor que Y

X >= Y X es mayor o igual que Y

X =< Y X es menor o igual que Y

X =:= Y Los valores de X e Y son iguales

X =\= Y Los valores de X e Y no son iguales

Operadores relacionales predefinidos

Page 17: IV. Aritmética en Prolog

Prolog IV 17

Aritmética en Prolog

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

Page 18: IV. Aritmética en Prolog

Prolog IV 18

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

Aritmética en SWI-Prolog

Page 19: IV. Aritmética en Prolog

Prolog IV 19

+IntExpr1 >> +IntExpr2 Desplazamiento binario a la dchade IntExpr1 en IntExpr2 bits

+IntExpr << +IntExpr Idem a la izda +IntExpr \/ +IntExpr Or binario entre IntExpr1 y IntExpr2

+IntExpr /\ +IntExpr And binario entre IntExpr1 y IntExpr2.

+IntExpr xor +IntExpr Or exclusivo

\ +IntExpr Inversión de bits

Aritmética en SWI-Prolog

Page 20: IV. Aritmética en Prolog

Prolog IV 20

abs(+Expr) Evalúa Expr y devuelve su valor absolutosign(+Expr) Devuelve -1 si Expr < 0, 1 si Expr > 0 y 0 si Expr=0.round(+Expr) Evalúa Expr y redondea al entero más próximointeger(+Expr) Lo mismo que round\1float(+Expr) Se traduce el resultado de la evaluación a un formato de coma flotante.float_fractional_part(+Expr) Parte fraccionaria de un número en coma flotante. Negativo si Expr es negativo, 0 si Expr es entero. float_integer_part(+Expr) Parte entera de un número en coma flotante. truncate(+Expr) Trunca Expr a un entero. Equivalente a float_integer_part/1.

Aritmética en SWI-Prolog

Page 21: IV. Aritmética en Prolog

Prolog IV 21

Ejemplo: factorial.

factorial(N, F) :-

N > 0, N1 is N - 1,

factorial(N1, F1),

F is N*F1.

factorial(0,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).

Page 22: IV. Aritmética en Prolog

Prolog IV 22

Ejemplo: sumar una lista.

sumar_lista( [I | Is], Sum) :-

sumar_lista( Is, IsSum),

Sum is I + IsSum.

sumar_lista([ ],0).

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).

Page 23: IV. Aritmética en Prolog

Prolog IV 23

Registra un predicado Prolog como una función aritmética (ver is/2, >/2 , etc.). El predicado Prolog debería tener un argumento adicional que lo especificado por Head, el cuál puede indicarse como un término en forma de Nombre/Aridad, como átomo, o como término complejo.

Este último argumento es una variable no instanciada en el momento de la llamada y deberá ser instanciada como un número entero o de coma flotante. Los otros argumentos son parámetros. Esta declaración sólo es válida para el contexto del módulo donde se realiza, a menos que se declare desde el módulo ‘user’.

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

arithmetic_function(+Head)

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

Page 24: IV. Aritmética en Prolog

Prolog IV 24

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 evaluación de operadores aritméticos.• Para evaluar una operación aritmética todos los argumentos deben estar instanciados a números.• Los operadores de relación (<, =<, =:=, ...) fuerzan la evaluación de sus argumentos.