Foros del Web » Programación para mayores de 30 ;) » Programación General »

Duda sobre expresiones condicionales.

Estas en el tema de Duda sobre expresiones condicionales. en el foro de Programación General en Foros del Web. Duda sobre expresiones condicionales. Variable1 < Variable2 es una expresión condicional. Y sino, me refiero a cosas así. A dichas expresiones se las podría resumir, ...
  #1 (permalink)  
Antiguo 28/06/2018, 11:23
Avatar de Tachikomaia  
Fecha de Ingreso: agosto-2011
Mensajes: 402
Antigüedad: 7 años, 1 mes
Puntos: 5
Duda sobre expresiones condicionales.

Duda sobre expresiones condicionales.


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?
__________________
"No se puede borrar hasta", PHPeros.
  #2 (permalink)  
Antiguo 02/07/2018, 03:33
 
Fecha de Ingreso: mayo-2011
Ubicación: Palma de Mallorca
Mensajes: 108
Antigüedad: 7 años, 3 meses
Puntos: 4
Respuesta: Duda sobre expresiones condicionales.

Hola Tachikomaia,

sobre tu duda sobre las expresiones y los paréntesis, los paréntesis realizan la misma función que en las operaciones matemáticas.

Si tienes una operación como 2*3+5, al aplicar las prioridades de operaciones, realizamos la multiplicación y luego la suma, con el que el resultado nos daría 11.

Si añadimos unos párentesis a la suma, dejando la operación en 2*(3+5), los párentesis tienen prioridad y se realiza las operaciones que envuelve, lo cual nos devolverá un resultado de 16.

Ahora vayamos a la resolución de tus expresiones:

Cita:
(C1 o C2) y (C3 o C4)
En esta expresión, primero se resolverán las "o" y luego se resuelve la "y", por lo tanto, la condición será verdadera cuando al menos 1 valor de cada lado sea verdadero.

Cita:
C1 o (C2 y C3) o C4
En esta expresión, la operación prioritaria es la "y", ya que está envuelta en paréntesis, aunque realmente el peso lo llevan las "o". Si C1 o C4 es verdadero o los 2 son verdaderos, el resultado de C2 y C3 es totalmente irrelevante. Solo resultará determinante si C1 y C4 son falsas y la operación "y" es verdadera, con lo cual, dará la expresión como verdadera.

Cita:
C1 o (C2 y (C3 o C4))
Esta es interesante, por que hay paréntesis dentro de paréntesis. En este caso, la operación prioritaria es el paréntesis más interior (C3 o C4) ya que su resultado es necesario para la realización de la operación del otro paréntesis presente en la expresión.

Cita:
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.
Con lo dicho aquí, entiendo que preguntas si es posible que una operación donde haya paréntesis se pueda sacar un equivalente que se pueda ejecutar de izquierda a derecha sin hacer uso de ellos. Lo he pensado un rato y he llegado a la conclusión de que depende de la expresión, sobre todo de la colocación de las "y".

Siguiendo tus expresiones originales, he podido deducir expresiones equivalentes para el 2º y el 3º caso, para el 1º caso me ha resultado imposible debido a que según donde colocaba la "y", me daba resultados diferentes con los mismos valores, cosa que en el 2º y 3º caso si se repite el mismo resultado.

Te dejo un enlace de un documento en Drive donde realizo estas operaciones con todas las combinaciones booleanas posibles. Podrás comprobar como dependiendo de la colocación de los paréntesis, algunos resultados son distintos con la misma combinación de valores.

No se si es lo que necesitas exactamente, pero he respondido con lo que sé y espero que te sirva de ayuda. Un saludo.
  #3 (permalink)  
Antiguo 13/07/2018, 14:44
Avatar de Tachikomaia  
Fecha de Ingreso: agosto-2011
Mensajes: 402
Antigüedad: 7 años, 1 mes
Puntos: 5
Respuesta: Duda sobre expresiones condicionales.

Creo que me han resuelto la duda aunque no el problema de fondo. Yo diría de cerrar este tema y abro otro, pero sino, sigo comentando.


Este link está muy bueno:
https://es.wikipedia.org/wiki/L%C3%B...o_suma_lógicas

Explica que el or equivale al + y el and a *. Me parece medio mágico que funcionen de la misma forma, pero parece ser así. Básicamente, los and se hacen 1ero. Lo he comprobado en el lenguaje que uso y además se supone que lo dice acá
https://msdn.microsoft.com/es-es/library/2bxt6kc4.aspx
Digo se supone porque no lo entendí del todo.
Cosas como "C1 o (C2 y C3) o C4" tiene el paréntesis de sobra, es como decir A+(B*C)+D, es redundante poner el paréntesis en la operación que se aplicará 1ero.

Eso resuelve mis dudas de cómo se interpretan expresiones condicionales que puse de ejemplo y todas en general.


Por otro lado, el 1er link habla de lo que llama propiedad disyuntiva, dando mal el 2ndo ejemplo creo, pero creo que lo entendí. ¡Consiste en nada más y menos que quitar los paréntesis!

(A+B)*(C+D) = A*C + A*D + B*C + B*D
Ej: (2+3)*(4+5) = 2*4 + 2*5 + 3*4 + 3*5
(2+3)*(4+5) = 5*9 = 45
2*4 + 2*5 + 3*4 + 3*5 = 8+10+12+15 = 18+27 = 45

(C1 o C2) y (C3 o C4) = C1 y C3 o C1 y C4 o C2 y C3 o C2 y C4

El 2ndo ejemplo de la wikipedia no requiere paréntesis y luego está mal formulado, creo , así que no me importa.

Eso parece resolver mi duda de cómo expresar cualquier condición sin usar paréntesis (hablo de las que no modifican las variables), pero como se alarga tanto la expresión no me gusta.

Esto me resulta mejor:
Código:
Si C1 or C2
   Si C3 or C4

¿Pero cual es mi duda de fondo?
Cómo hacer un programa que genere expresiones condiciones que no tengan redundancias ni incoherencias, y estén compuestas por X subexpresiones, donde X es elegido por un usuario.
Una subexpresión sería una relación entre variables.
Esto V1<V2 or V2<V3
Sería una expresión compuesta por 2 subexpresiones.

Dije:
"tengo que hacer un código que genere expresiones de condiciones. Básicamente si se quiere 8 expresiones, se elige una al azar"
Quise decir "una variable"

"Puedo generar por ejemplo esto:
C1 y C3 y C4 o C2 o C3 y C5"
Actualmente lo que necesitaría es poder indicar al programa dónde tienen sentido meter paréntesis, y seguir metiendo. Sería por azar si los metería o no cada vez.

Otra alternativa sería aprender a que genere ifs anidados como puse más arriba. Tal vez. O funciones, no sé mucho de eso.


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


tonigomila1988:
Cuando hice el tema ya entendía cómo resolver cosas como
(C1 o C2) y (C3 o C4)
C1 o (C2 y C3) o C4
C1 o (C2 y (C3 o C4))

Eso fueron interpretaciones que yo hice respecto a esto:
C1 o C2 y C3 o C4

O sea, no sabía cual de las de arriba, o alguna otra, era la interpretación correcta de esa.

Ahora ya sé que ni siquiera necesita paréntesis y sólo hay 1 interpretación correcta. Pero por si queda más claro, la interpretación correcta sería la 2nda.
C1 o C2 y C3 o C4 es true si se cumple
C1
o C2 y C3,
o C4

Mi confusión era que no sabía cómo había que interpretar esa expresión.

Fijate lo que escribí arriba si quieres.


Gracias.
__________________
"No se puede borrar hasta", PHPeros.

Última edición por Tachikomaia; 13/07/2018 a las 14:59



La zona horaria es GMT -6. Ahora son las 15:34.