Evaluación de expresiones lógicas


([N4] gontorre) #1

Buenos días

Estoy volviendome loco con la forma de evaluar las expresiones lógicas en Velneo. Por las pruebas que estoy haciendo la expresión:

PEND_INI>0 & CANT_FIN>CANT_INI

Se comporta de forma distinta a:

(PEND_INI>0) & (CANT_FIN>CANT_INI)

¿Alguien me podría explicar cual es la diferencia?

Además me resulta raro que se evalúe siempre toda la expresión. En el lenguaje que utilizo habitualmente (Foxpro) las expresiones ligadas con AND se dejan de evaluar si la parte izquierda es falsa, ya que si la primera condición es falsa la expresión completa va a ser siempre falsa. De esta forma se ahorra proceso y es muy útil.

¿Se puede proponer esto en algún sitio para que evalúen la posibilidad de añadirlo en una próxima versión?

Un saludo


([N4] velavisual) #2

@gontorre

En la documentación sobre el asistente de fórmulas, al final de la documentación se nos informa de:

NOTA: A la hora de evaluarse una fórmula el orden de precedencia de los operadores es de izquierda a derecha, por lo que debemos usar paréntesis si queremos ajustar el orden de precedencia al estándar de matemáticas u otro.

También dispones de un foro de ideas en el cuál exponer tus ideas y necesidades.


([N4] gontorre) #3

Una de dos: O estoy idiota o esto está mal. Tango una expresión lógica que sólo utiliza AND. En este caso daría lo mismo evaluarla de izquierda a derecha, de derecha a izquierda, con paréntesis o sin ellos. Una expresión lógica con AND es cierta si todos los componentes son ciertos.

La expresión es:

PEND_INI>0 & CANT_FIN<CANT_INI & CANT_INI-CANT_FIN<PEND_INI

Donde PEND_INI=0 , CANT_INI=0 , CANT_FIN=4 y STOCK=4

Entonces:
PEND_INI>0 --> 0 > 0 --> FALSO
CANT_FIN<CANT_INI --> 4 < 0 --> FALSO
CANT_INI-CANT_FIN<PEND_INI --> 0-4 < 0 --> VERDADERO

FALSO & FALSO & VERDADERO debería ser FALSO

Por lo menos es lo me explicaron cuando estudié lógica. ¿Alguien ha tenido problemas con esto?


([N4] Infortic) #4

Deberías acostumbrarte a usar SIEMPRE paréntesis en cada término de una expresión lógica, es lo normal, no sólo en velneo, en cualquier lenguaje de programación, de esta forma nunca te fallará sea el lenguaje que sea.

En tu caso no sólo hay AND, hay MAYOR QUE y MENOR QUE, que son operadores lógicos también, sabe dios como los está evaluando al no llevar paréntesis.

Un saludo.


([N4] gontorre) #5

Con la respuesta de info me doy cuenta de que, efectivamente, los operadores > y < son operadores de comparación y al evaluar de izquierda a derecha se debe estar evaluando algo como:

PEND_INI>(0 & CANT_FIN<CANT_INI & CANT_INI-CANT_FIN<PEND_INI)

o algo así, que cualquiera sabe el resultado que da.

Mi problema viene de estar acostumbrado a un lenguaje con precedencia de operadores en los que prácticamente nunca hacen falta paréntesis. ¡Por eso los primeros días con Velneo me parecía que estaba poniendo siempre mal los IF y los repasaba mil veces hasta que de funcionaban! Debe ser que al final de tanto cambiarlos los ponía bien de casualidad. Me tendré que acostumbrar.

Gracias por la ayuda


([N3] pacosatu) #6

Hola gontorre.

Este es uno de los temas en el que tendrás que cambiar radicalmente los conceptos de programación que ya tengas adquiridos.

Como indica Antonio, el editor de fórmulas evalúa las expresiones de izquierda a derecha, no es bueno ni malo, simplemente diferente.


así tu expresión última
PEND_INI>0 & CANT_FIN<CANT_INI & CANT_INI-CANT_FIN<PEND_INI
se evaluaría de esta forma
((((((PEND_INI > 0) & CANT_FIN) < CANT_INI) & CANT_INI) - CANT_FIN) < PEND_INI)
1º 2º 3º 4º 5º 6º

También ten en cuenta que el editor de fórmulas evalúa las expresiones lógicas como 1 (true) o 0 (false) y por lo tanto podemos evaluar lo siguiente:

((1<2) + (3<4) + (5<6)) = 1 --> devuelve 1 --> (3 = 1)

Lo de evaluar solo la parte izquierda de una expresión AND (si es 0) no es necesario en Velneo ya que NO es un lenguaje dinámico ni orientado a Objetos.

Por último, recuerda que en el editor de fórmulas puedes evaluar expresiones en tiempo de diseño y te servirá como una buena herramienta de entrenamiento para probar cálculos.

Saludos
Paco Satué