Duda sobre expresiones condicionales.

Iniciado por Tachikomaia, 28 Junio 2018, 19:18 PM

0 Miembros y 1 Visitante están viendo este tema.

Tachikomaia

Variable1 < Variable2 es una expresión condicional. Y sino, me refiero a cosas así.

A dichas expresiones se las podría resumir, por ejemplo así: C1.

También se las puede "relacionar", por ejemplo así: C1 or C2 and C3 or C4

No entiendo cómo se interpreta eso, o sea, cuando se cumpliría "la" condición. Ejemplo:
(C1 o C2) y (C3 o C4): 1/2 y 1/2
C1 o (C2 y C3) o C4: 1/1 o 2/2 o 1/1
C1 o (C2 y (C3 o C4)): 1/1 o (1/1 y 1/2)

Tampoco entiendo cuántas formas de interpretar hay, cómo verlas todas.

Suponiendo que la 1era sea la correcta, me pregunto si todas las posibles relaciones son expresables, o sea, si interpretando de izquierda a derecha existe para toda posible relación una forma de expresarla que mediante dicho método se tome como tal. Mejor no puedo explicarme.

Por ejemplo, la 2nda expresión ¿cómo sería?
C2 y C3 o C1 o C4
Bien.
¿Y la 3era?
No entiendo.

En otras palabras ¿cualquier relación puede expresarse sin necesidad de paréntesis, y se interpretaría bien?

------------------------------------------------------------------------------------------------

Tengo un programa que intenta cumplir cierta condición.

Quiero complicar esa condición, que la cumpla, y así sucesivamente.

En vez de complicar la condición manualmente cada vez, quiero que se haga automáticamente y al azar.

Entonces tengo que hacer un código que genere expresiones de condiciones. Básicamente si se quiere 8 expresiones, se elige una al azar, luego se elige "y" o "o", y así sucesivamente hasta elegir la octava. Hay que evitar casos como "C1 y C1" o  "C2 o C2", entre otras cosas, pero mi problema por ahora es otro.
Puedo generar por ejemplo esto:
C1 y C3 y C4 o C2 o C3 y C5
Pero se me complica la interpretación...

¿Qué puedo hacer?

El Benjo

Hola, que tal. Te lo voy a explicar así a ver si me doy a entender. Y si estoy equivocado, que alguien me diga, por favor.

Una condición está dada por la relación entre dos o más valores y uno o más operadores. Es decir, que una condición, quedaría de la siguiente manera:

valor operador valor ----> Ejemplo: a = b

Los operadores son relaciones, es decir, nos indican la relación entre un valor y otro. Igualdad, desigualdad, etc. Pero todos estos operadores tienen algo en común, que devuelven un valor booleano, al igual que los operadores booleanos AND, OR. Por eso es que pueden trabajar juntos y siguen las mismas reglas de los operadores aritméticos: primero paréntesis y de derecha a izquierda según el orden de evaluación. Debes revisar el orden de evaluación del lenguaje que utilizas para comprobar que operadores se evalúan primero en tu expresión condicional. En el ejemplo que das (C1 o C2) y (C3 o C4) se evalúa así:

Paso 1 (C1 o C2) --> Si C1 o C2 son verdaderos.
Paso 2 (C3 o C4) --> Si C3 o C4 son verdaderos.
Paso 3 ( (Paso 1) y (Paso 2) ) --> Si el paso 1 y el paso 2 son verdaderos

Si ejecutamos de manera simbólica (a modo de ejemplo), reemplazando los valores por verdadero o falso:

         Paso 1                              Paso 2
(verdadero OR falso) AND (falso OR verdadero)

       (verdadero)       AND       (verdadero

                           verdadero

Resumen: Sigue las reglas del orden de evaluación de los operadores y no tienes pierde.
www.es.neftis-ai.com

Sí hay un mejor lenguaje de programación y es ese con el que puedes desarrollar tus objetivos.

Tachikomaia

Cita de: El Benjo en 29 Junio 2018, 03:30 AMprimero paréntesis y de derecha a izquierda según el orden de evaluación. Debes revisar el orden de evaluación del lenguaje que utilizas para comprobar que operadores se evalúan primero en tu expresión condicional.
Me falta experimentar, sí. Los paréntesis los "inventé" para mostrar que una misma expresión (sin paréntesis o sin suficientes paréntesis) se podría interpretar de distintas formas según dónde se pusieran. Nunca usé paréntesis en una condición, no sé si mi lenguaje lo admite.

Igual te faltó responder algo:
¿Cualquier relación puede expresarse sin necesidad de paréntesis, y se interpretaría bien?

En otro sitio me recomendaron "ifs anidados, arrays, funciones, y objetos" pero no entiendo bien cómo aplicar esas cosas en este asunto.

Como siga así voy a tener que practicar hacer las complicaciones manualmente y cuando tenga más experiencia con eso intentar pasar a este nivel. No pensé que fuese tan difícil.

El Benjo

CitarIgual te faltó responder algo:
¿Cualquier relación puede expresarse sin necesidad de paréntesis, y se interpretaría bien?

La respuesta rápida es:

La respuesta extendida es: Sí, debido a las propiedades asociativa, distributiva y conmutativa de los operadores lógicos. Puedes encontrar mucha información al respecto en wikipedia. En la parte que dice axiomas en el enlace que te dejo más abajo.

https://es.wikipedia.org/wiki/L%C3%B3gica_binaria
www.es.neftis-ai.com

Sí hay un mejor lenguaje de programación y es ese con el que puedes desarrollar tus objetivos.

Serapis

#4
Cita de: Tachikomaia en 29 Junio 2018, 04:03 AM
Nunca usé paréntesis en una condición, no sé si mi lenguaje lo admite.
"Mi lenguaje", no es un lenguaje del que podamos decir nada, si no especificas...
¿¿¿Es alguno conocido que usas con regularidad, tu preferido, uno propio que estés haciendo???

Cita de: Tachikomaia en 29 Junio 2018, 04:03 AM
Los paréntesis los "inventé" para mostrar que una misma expresión (sin paréntesis o sin suficientes paréntesis) se podría interpretar de distintas formas según dónde se pusieran.
Pués no, no inventaste nada... Supongo que habrás ido a la escuela, y habrás dado algo de matemáticas... y si tienes algo de memoria, podrías recordar que los paréntesis se aplican para dar prioridad y agrupar cordinadamente las expresiones...

En cualquier caso considera que una gramática que no tiene adecuadamente delimitado el orden de precedencia () se dice que es una gramática ambigua, y por consiguiente una misma expresión puede ser interpretada de modo diferente... lo cual se considera un grave error de diseño.

No da el mismo resultado:
 (9-2) + 5 = 12
 9 - (2+5) = 2
Aunque usemos los mismos valores, los paréntesis señalan que deben resolverse antes su interior, tanto antes cuanto más al interior...
((((((20-8) + 4) /2) + 1) -2) + 5) = 12
El primero en resolverse es 20-8, porque es el más adentro.


Cita de: Tachikomaia en 29 Junio 2018, 04:03 AM
Igual te faltó responder algo:
¿Cualquier relación puede expresarse sin necesidad de paréntesis, y se interpretaría bien?
No está bien formulada la pregunta... Como sigue sí:
¿Hay alguna forma de de formular expresiones que no requieran paréntesis?. SÍ
Hay 3 tipos de notaciones básicas:
Notación de infijo (o normal): Las que solemos usar, porque las entendemos bién al 'leerlas', los operadores aparecen a ambos lados y el operador en medio.
Ejemplos: A + B;  (A*B)+(C-(D*E)) <-- nota que los ejemplos son los mismos para los 3, para que veas las diferencias).
Notación de prefijo (o polaca): Los operadores van delante, los operadores detrás.
Ejemplos: +AB; +*ABC-*DE  
Notación de sufijo (o postfijo, inversa):Los operandos van delante, los operadores al final.
Ejemplos: AB+; AB*C+DE*-

Las dos últimas suelen llamarse Notación polaca (la de sufijo: polaca inversa), y no precisan el uso de paréntesis... La notación polaca es la que se ha venido usando en las calculadoras desde que llegó la electrónica digital... por los pocos recursos de hardware que demandaba. También suelen requerir menos pulsaciones de teclas.
Para pasar una expresión de infijo (normal) a una notación de sufijo, suele recurrirse al algoritmo Shunting yard, y en general suele hacerse uso de una pila para ello...
Supongo que si te cuesta entender expresiones simples, va a serte harto difícil implementar una pila y más el propio algoritmo...

Cita de: Tachikomaia en 29 Junio 2018, 04:03 AM
En otro sitio me recomendaron "ifs anidados, arrays, funciones, y objetos" pero no entiendo bien cómo aplicar esas cosas en este asunto.

Como siga así voy a tener que practicar hacer las complicaciones manualmente y cuando tenga más experiencia con eso intentar pasar a este nivel. No pensé que fuese tan difícil.
No sé que estás haciendo, pero hasta una docena de operandos (o la mitad para otros), puede resolverse casi que de cabeza si se tiene cierta práctica...

En general si tienes ciertos condicionantes que suelen ser repetitivos y no son excesivos, suele ser útil resumirlo en unas pocas funciones que devuelvan un boleano, y que la función evalúa 3, 4 parámetros...
por ejemplo la típica funcion: EsAñoBisiesto(año), es un buen ejemplo... aunque solo se pasa un parámetro (los otros se deducen de él, por ser datos conocidos, como los meses y duración de cada mes, etc), donde se analizan varias condiciones hasta llegar a un único valor Verdad o Falso.

Cuando la cantidad de condiciones es abrumadora, o cuando resultan difíciles de entender se recurre a una tabla de verdad, se ponen todas las variables que entran en juego con todos los posibles valores que pueden adoptar y cual es el estado final a cada caso... finalmente se extrae una función con todas las soluciones que arrojan verdad (o falso, si son menos en cantidad)... vamos lo que toda la vida en matemáticas se ha llamado expresiones algebraicas... pero

Por último, aunque no parece que estés muy ducho en el tema, cuando logres avanzar dale un repaso al algoritmo de Warshall (o de floyd-Warshall).

Tachikomaia

#5
El Benjo:
Sin paréntesis me hago un lío en casos como este:
((A y B) y (C o D) o (E y F)) o G
Creo que tendré que usarlos. El problema es que un programa que genere ese tipo de expresiones, con paréntesis, me parece bastante difícil. Por otro lado ¿cómo expresarías eso, sin paréntesis? Porque mi pregunta era si se podía expresar cualquier cosa sin paréntesis. Yo pensé que sí, pero como no me da la mente para interpretar de izquierda a derecha como si tuviese sólo una interpretación, ya no sé.

El artículo de wikipedia está interesante, pero difícil, no lo entendí del todo. En el 2ndo ejemplo de propiedad distributiva no han quitado los paréntesis. ¿Y se supone que el and tiene prioridad como si fuese un *?

Cita de: NEBIRE en 30 Junio 2018, 11:46 AM
"Mi lenguaje", no es un lenguaje del que podamos decir nada, si no especificas...
Digamos que tienes razón en que no pueden decir nada al respecto, pero yo no pedí que hablaran de ello.
Dije que no sé si mi lenguaje admite paréntesis en las condiciones, ejemplo "V1<V2 or (V1==V2 and V2==V3)" ni cómo las toma, lo cual evidentemente es algo que yo debo averiguar, no pedí ayuda con eso.

Citar¿¿¿Es alguno conocido que usas con regularidad, tu preferido, uno propio que estés haciendo???
Action Script de Macromedia Flash 5. Es prácticamente el único que uso y mi favorito.

CitarPués no, no inventaste nada...
Puse inventar entre comillas, significa en ese caso que la expresión se tome con pinzas, que no es tan literal. Nunca había visto paréntesis en una condición para separar partes or-and, y se los puse, o sea que desde mi punto de vista es algo nuevo.

CitarSupongo que habrás ido a la escuela, y habrás dado algo de matemáticas... y si tienes algo de memoria, podrías recordar que los paréntesis se aplican para dar prioridad y agrupar cordinadamente las expresiones...
Sí.

CitarEn cualquier caso considera que una gramática que no tiene adecuadamente delimitado el orden de precedencia () se dice que es una gramática ambigua, y por consiguiente una misma expresión puede ser interpretada de modo diferente... lo cual se considera un grave error de diseño.
Exacto, las expresiones que mencioné parecen ser ambiguas, es lo que quisiera saber cómo arreglar, en lo posible sin usar paréntesis.

CitarNo está bien formulada la pregunta... Como sigue sí:
¿Hay alguna forma de de formular expresiones que no requieran paréntesis?.
No entiendo tu critica.

Ante mi pregunta
"¿Cualquier relación puede expresarse sin necesidad de paréntesis, y se interpretaría bien?"
no veo un problema.

La que tú preguntas parece responderse sólo, como ¿hay alguna forma de hacer triángulos que no requiera algún ángulo >90? Claro, la mayoría no lo requieren.

El problema son las expresiones que parecen requerirlo (a algún paréntesis) ¿realmente lo requieren o hay otra forma de decirlas que no use paréntesis?

Por ejemplo si digo "rojo" y pregunto ¿hay alguna forma de expresar ese color sin mencionar la "o"? Me puedes decir "Sí, red", entre otras cosas.

EDIT:
En tu caso diciendo "requiera" en vez de "requieran", ahí sí.
Porque si dices "requieran" pareces referirte a las expresiones, no a LA forma o método.

...

Hombre, yo estoy hablando de los operadores AND y OR.

Tú me vienes con +, *, -.

Por el link que me dió El Benjo parece que se pueden traducir a eso, pero intenta no entreverarme ¿estamos hablando de lo mismo o no?

Notación de infijo (o normal): Las que solemos usar, porque las entendemos bién al 'leerlas', los operadores aparecen a ambos lados y el operador en medio.
Ejemplos: A o B
(A y B) o (C-(D y E)) <-- nota que los ejemplos son los mismos para los 3, para que veas las diferencias).
Notación de prefijo (o polaca): Los operadores van delante, los operadores detrás.
Ejemplos: oAB; oyABC-yDE
Notación de sufijo (o postfijo, inversa):Los operandos van delante, los operadores al final.
Ejemplos: ABo; AByCoDEy-


En tus descripciones de los operadores te has hecho un lío, pero la idea la entendí gracias a los ejemplos.

EDIT2: El "xor" y cosas así más complejas que and y or creo que no las necesito, pero supongo que acortan ciertas expresiones, veremos...

CitarLas dos últimas suelen llamarse Notación polaca (la de sufijo: polaca inversa), y no precisan el uso de paréntesis...
Probablemente sea la respuesta que necesitaba. Lo que no entiendo bien es cómo se interpretaría cada uno, pero sería cuestión de investigar y de práctica.

CitarPara pasar una expresión de infijo (normal) a una notación de sufijo, suele recurrirse al algoritmo Shunting yard, y en general suele hacerse uso de una pila para ello...
Más bien necesito lo inverso, pero veremos.

CitarSupongo que si te cuesta entender expresiones simples
Sí, la verdad que sí. Pero si son como las expresiones matemáticas entonces no. ¿Cómo interpretarías esto, si fueses de izquierda a derecha?
A y B y C o D o E y F o G

Yo
ABC o D o E y (F o G)

Pero si fuese como en matemática sería:
ABC o D o EF o G

Citarva a serte harto difícil implementar una pila
Ni siquiera sé de lo que me estás hablando. Para mí pila es un "aparato" que se guarda en otros para darle energía, o una montaña con cierto orden.
Ni te preocupes en aclarármelo, sólo te comento.

Voy a tener que practicar cosas. Nos veremos.

engel lex

no se si me desvío o te ayudo pero vamos...

algo util es leerlo como lenguaje humano... recoermos que "y" incluye  y "o" excluye

por ejemplo
((A y B) y (C o D) o (E y F)) o G

aquí por el parentesis sacamos a "G", si "G" es verdadero no hay discusión

nos queda
(A y B) y (C o D) o (E y F)

como "y" incluye, los reunimos, como "o" excluye lo separamos

((A y B) y (C o D)) o (E y F)

como justifico esto? en lenguaje humano, demos adjetivos y veamos
(A y B) será "amarillo"
(C o D) será "rojo"
(E y F) será "azul"

ahora demos un punto, debo dar un objetivo... vamos a comprar un carro, que color?

amarillo y rojo o azul

aquí vemos el orden usual de evalución https://msdn.microsoft.com/es-es/library/2bxt6kc4.aspx el orden como en el idioma es "y" < "xor" < "o" es decir primero "y" que "o"

vamos a comprar un carro que sea (rojo y amarillo)... o (azul).... ya que el "y" incluye

entonces volvemos con lo que llevabamos
((A y B) y (C o D)) o (E y F)

en este caso sabemos que si "E y F" son verdadero (al ser "y" ambos deben serlo) entonces no importa el resto... nos queda el resto

(A y B) y (C o D)

ambas partes deben cumplirse para ser cierto así que podemos usar "y" que une como propiedad distributiva


(A y B y C) o (A y B y D)

ya que A y B siempre deben cumplirse quienes son flexibles son C y D

esto es como: de nuevo en lenguaje
A = Alto
B = Bonito
C = Casado
D = Deportista

la persona debe ser

(Alto y Bonito) y (Casado o Deportista)

es decir siempre debe ser alto y bonito pero por lo menos Casado o Deportista... así que podemos distribuir como antes

(Alto y Bonito y Casado) o (Alto y Bonito y Deportista)

entonces... todo esto a que nos lleva?

los "y" unen, los "o" separan (indiscutiblemente los paréntesis unen)


espero se haya entendido





El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Tachikomaia

Acabo de probar esto
if (0<1 && 0<2 && 9<3 or 8<4 or 0<5 && 8<6 && 9<7 or 9<8) {
V = 0;
}
Y la condición no se cumple. ¿Conclusiones de cómo se interpreta? Escucho.

NOTA: Puse números en vez de variables porque así me es más fácil modificarlos y ver si se cumplen o no. Está claro que jamás voy a poner subcondiciones que dan siempre el mismo resultado xD

Podemos resumir cada subcondición mediante un número fácilmente porque lo que está a la derecha es como un identificador:
0<1: subcondición nro 1
0<2: subcondición nro 2
etc

Si se cumplen la 1, 2 y 3, entonces la condición se cumple. Ya lo comprobé, les puse 0 delante a las 3 y 9 delante en las demás, o sea, sólo se cumplieron esas 3 y con eso ya alcanzó.

Es como si se hiciera esto:
(0<1 && 0<2 && 0<3) or (8<4 or 0<5 && 8<6 && 9<7 or 9<8)

Si se cumple la 4. se cumple la condición, ya está confirmado.

Es así:
(0<1 && 0<2 && 9<3) or (0<4) or (0<5 && 8<6 && 9<7 or 9<8)

Si se cumple la 5, 6 y 7, se cumple la condición. Si falla una y las demás, no se cumple.

(0<1 && 0<2 && 9<3) or (0<4) or (0<5 && 8<6 && 9<7) or (9<8)

Listo...

En conclusión, es como si las or marcaran el final de un paréntesis y el inicio de otro.

Todo esto puede parecer muy obvio, pero yo no sabía si se interpretaba así:
(0<1 && 0<2) && (9<3 or 8<4 or 0<5) && (8<6 && (9<7 or 9<8)
o de alguna de las no sé cuántas formas posibles.


Ahora la siguiente pregunta que había planteado.

Cosas como esta:
(9<1 or 0<2) && (9<3 or 0<4)
¿Se pueden expresar sin paréntesis, en una condición, tal como se hace en el lenguaje que he mostrado
(porque las notaciones polacas que me comentaron son interesantes, pero en el Action Script que uso no creo que sean válidas)?

No se me ocurre.

Lo que se podría hacer es usar ifs anidados (me lo habían comentado pero no me dieron detalles, recién ahora lo entiendo):
if (9<1 or 0<2) {
if (9<3 or 0<4) {
}
}


Creo que mis dudas en este sentido están resueltas.

Gracias.

Cita de: engel lex en  6 Julio 2018, 01:53 AM
no se si me desvío o te ayudo pero vamos...
Yo diría que hiciste ambas cosas xD

Creo que te desviaste porque creo que me hablaste de cómo interpretar cosas que tienen paréntesis, lo cual yo ya sé, yo lo que quería era entender cómo se interpreta algo que no los tiene.

Pero me ayudaste porque me hablaste de que "y" une y "o" separa. La verdad eché un vistazo a tu post hace rato y no entendí mucho, pero tu idea se ve que me quedó y me ayudó con el análisis que hice arriba.

Citaramarillo y rojo o azul

aquí vemos el orden usual de evalución https://msdn.microsoft.com/es-es/library/2bxt6kc4.aspx el orden como en el idioma es "y" < "xor" < "o" es decir primero "y" que "o"

vamos a comprar un carro que sea (rojo y amarillo)... o (azul).... ya que el "y" incluye
Qué interesante. Recientemente había empezado a escribir así por ejemplo "rojo (y amarillo) o azul", porque sino veía una ambigüedad. Con tu forma de poner paréntesis también está bien, lo que quiero decir es que el problema o la duda yo l@ tenía no sólo en programación sino en el lenguaje natural también. Y aunque se diga que está clarísimo yo lo seguiría agarrando con pinzas, o con paréntesis, jaja.

También me gustó tu idea de resumir conjuntos de subcondiciones. Eso de llamarles "amarillo" por ejemplo. Me puede servir.

Citar(A y B) y (C o D)

ambas partes deben cumplirse para ser cierto así que podemos usar "y" que une como propiedad distributiva


(A y B y C) o (A y B y D)
¿Pero esto sirve de algo? Alargaste la expresión. Y no es que hayas quitado los paréntesis.

Ragnarok

#8
Los paréntesis no son necesarios si y sólo si la expresión está en forma normal disyuntiva.

Para el que quiera saber más:
https://es.wikipedia.org/wiki/Forma_normal_disyuntiva
http://mathforum.org/library/drmath/view/51857.html

PD: cualquier fórmula en lógica proposicional se puede normalizar a forma normal disyuntiva.
No olvidéis leer las normas generales, además de las específicas de cada tablón.sgae, ladrones

engel lex

0<1 && 0<2 && 9<3 or 8<4 or 0<5 && 8<6 && 9<7 or 9<8

recuerda "y" une, "o" separa

(0<1 && 0<2 && 9<3) or (8<4) or (0<5 && 8<6 && 9<7) or (9<8)

recuerda que or es || (2 barras verticales)

y escribiendolo así es aún más claro

0<1 && 0<2 && 9<3 || 8<4 || 0<5 && 8<6 && 9<7 || 9<8

ves como se separan las secciones? si cualquiera de esas secciones se cumple esto es valido

sobre
(9<1 or 0<2) && (9<3 or 0<4)

no los puedes expresas sin parentesis, porque "o" separa y los estás manteniendo unido con parentesis, si quieres expresarlo sin parentesis te toca distribuir (respondiendo a esto)

¿Pero esto sirve de algo? Alargaste la expresión. Y no es que hayas quitado los paréntesis.

no quité los parentesis para que fuera visible, pero no son necesario ("o" separa)

(9<1 or 0<2) && (9<3 or 0<4)

sin parentesis es

9<1 && 9<3 || 9<1 && 0<4 || 0<2 && 9<3 || 0<2 && 0<4

como he repetido 1000 veces XD los "o" separan, es decir, si cualquiera de las 4 condiciones (&&) se cumple vale, es decir, por la ultima, esto es verdadero
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.