Duda sobre expresiones condicionales.

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

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

Serapis

#10
Cita de: Tachikomaia en  6 Julio 2018, 01:19 AM
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.
Action Script de Macromedia Flash 5. Es prácticamente el único que uso y mi favorito.
Tienes solo 2 problemas (aunque gordos).
- En primer lugar tienes dificultad para entender... lo que se te dice. Pasas de largo por las soluciones, como esperando una receta mágica (que no existe).
- En segundo lugar 'tu lenguaje' al margen de calificarlo, ni siquiera lo conoces a fondo aún 'siendo tu favorito' como dices.

Cualquier lenguaje por miserable que sea, admitirá paréntesis para resolver la precedencia de operadores (debe importarte nada que un operador sea 'or', 'and' ó '+', '/', o cualquier otro... un operador es un operador sea del tipo que sea y a tí debe bastarte con saber que como tal cualquier operador tiene un valor de precedencia (prioridad en ser resuelto cuando no tiene paréntesis que lo delimite).

Esto quiere decir que siempre que tu pongas una expresión ordenada por precedencia, tampoco necesitarás usar paréntesis... pero esa forma la podrás usar en determinadas ocasiones, en otras ocasiones resultará forzado, poco natural y por tanto difícil de leer  y/o erscribir... aparte dle tiempo perdido en ello (solo por evitar colocar unos paréntesis).

Pero no entiendo a que viene tanto problema con los paréntesis... úsalos cuando y donde correspondan y listo. Y a tu pregunta sobre si existe alguna forma de evitarlos, ya te he aclarado que sí... que un lenguaje no admita directamente la notación polaca no es problema, precisamente para eso como programador uno programa el algoritmo que precise al problema que surja.

La mayoría de lenguajes carecen de interpretación para dicha notación, pero el compilador de todos y cada uno de ellos, acaba teniendo una implementación del algortimo para convertir la expresiones que el programador escribe en el lenguaje, para pasarlo a notación polaca...

Cita de: Tachikomaia en  6 Julio 2018, 01:19 AM
lo que quisiera saber cómo arreglar, en lo posible sin usar paréntesis.
Ya te he contestado...
O reordenas las expresiones para que de izquierda a derecha, estén ordenados los operadores por precedencia, o recurres a la notaciópn polaca.

Cita de: Tachikomaia en  6 Julio 2018, 01:19 AM
Ante mi pregunta
"¿Cualquier relación puede expresarse sin necesidad de paréntesis, y se interpretaría bien?" no veo un problema.
Es que insisito... para qué necesitas NO PONER paréntesis, cuando poniéndolos solo de un vistazo queda perfectamente claro y ordenado, sin importar lo compleja que sea una expresión????.

Es que tu te empeñas en no usar paréntesis por simple cabezonería... es como pretender prescindir de barcos o aviones y querer cruzar el océano a nado, y tu preguntas si puedes cruzarlo sin morir en el intento... maneras hay, pero ya son ganas de morir en el intento. Cuando en barco o avión el trayecto es seguro y rápido.

Cita de: Tachikomaia en  6 Julio 2018, 01:19 AM
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?
Sí... ya te he explicado, reordena la expresión, para que los operadores de mayor precedencia queden a la izquierda... y el de menor precedencia a la derecha (siguiendo el orden estricto... pero esto resulta complejo incluso con expresiones no muy complejas, ya que si una operación tiene por ejemplo suma y resta y en otra parte aparece multiplicación, pero esta debe aplicarse después de haber hecho las previas, no podrá ponerse a la izquierda... en la misma línea, es decir tendrás que resolverlo en varias líneas... y así resulta tortuoso, pero poder s epuede, complicándolo innecesariamente... cruza el oceáno a nado, si te place.


Cita de: Tachikomaia en  6 Julio 2018, 01:19 AM
Hombre, yo estoy hablando de los operadores AND y OR.
Tú me vienes con +, *, -.
En el mundo d ela programación, los operadores que  tiene un lenguaje son los que son, sin importar los que a ti te vengan bien o uses... En la especificación de cad alenguaje hay un apartado que expecifica el orden en que se evalúan los operadores (todos los que dispone el lenguaje, no solo los que a Pepito ó a Juanito le  vienen bien).

Cita de: Tachikomaia en  6 Julio 2018, 01:19 AM
En tus descripciones de los operadores te has hecho un lío, pero la idea la entendí gracias a los ejemplos.
Vaya hombre... me he hecho un lío... buen chiste.... a estas horas, un poco de humor no viene mal.

Cita de: Tachikomaia en  6 Julio 2018, 01:19 AM
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...
XOR no es más complejo que OR ni AND, sino a su mismo nivel...

Tabla de verdad de XOR
----------------------------
0 xor 0 = 0
0 xor 1 = 1
1 xor 0 = 1
1 xor 1 = 0

En resumen es TRUE si solo una de ellas es TRUE. Si se aplica a más de 2 operandos es TRUE, si el número de evaluaciones TRUE es impar, FALSE si son pares...

1 xor 1 xor 1 xor 1 = 0   (4 unos, son pares luego = FALSE)
1 xor 1 xor 1 xor 0 = 1   ( 3 unos, son impares luego es = TRUE)

XOR te puede ahorrar muchas comparaciones...  


Cita de: Tachikomaia en  6 Julio 2018, 01:19 AM
(la notación polaca) 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.
Investiga, pero yo te aconsejaría mejor que desistas de no querer usar paréntesis... A no ser que vivas en Marte, y las teclas de paréntesis se hayan fastidiado y no tengas posibilidades de arreglarlo...

Cita de: Tachikomaia en  6 Julio 2018, 01:19 AM
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
La precedencia de operadores lógicos: primero AND, luego OR y finalmente XOR... en tu ejemplo sería lo mismo que si AND lo cambiar por '-'  y 'or' por '+', ya qe mantienen entre si la misma recedencia...
La expresión que pides quedaría así:
A B y C y D o E o F y G o
Los operadores aritméticos tienen precedencia sobre los lógicos.
La precedencia en los operadores de comparación, es esta:  =, <, <=, >, >=


Cita de: Tachikomaia en  6 Julio 2018, 01:19 AM
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.
Ya... me hago cargo... por eso decía que si tienes problemas para enteder expresiones sencillas, o para entender la simpleza y elegancia de los paréntesis, no vale la pena decir nada más... La testarudez, no tiene cura. ...pero bueno, si aprendes algo, pués vale.



Buscando por la red, algún pdf sobre ActionScript, aparece claramente...

Citar
() parentheses operator
(expression1 [, expression2])
( expression1, expression2 )
function ( parameter1,..., parameterN )

Performs a grouping operation on one or more parameters, performs sequential evaluation of expressions, or surrounds one or more parameters and passes them as parameters to a function outside the parentheses.

Usage 1: Controls the order in which the operators execute in the expression. Parentheses override the normal precedence order and cause the expressions within the parentheses to be evaluated first. When parentheses are nested, the contents of the innermost parentheses are evaluated before the contents of the outer ones.

Usage 2: Evaluates a series of expressions, separated by commas, in sequence, and returns the result of the final expression.

Usage 3: Surrounds one or more parameters and passes them as parameters to the function outside the parentheses.
Availability: ActionScript 1.0; Flash Player 4

Operands
expression1 : Object - Numbers, strings, variables, or text.
expression2 : Object - Numbers, strings, variables, or text.
function : Function - The function to be performed on the contents of the parentheses.
parameter1...parameterN : Object - A series of parameters to execute before the results are passed as parameters to the function outside the parentheses.

Example
Usage 1: The following statements show the use of parentheses to control the order in which expressions are executed (the value of each expression appears in the Output panel):
trace((2 + 3)*(4 + 5)); // Output: 45
trace((2 + 3) * (4 + 5)); // Output: 45
trace(2 + (3 * (4 + 5))); // // writes 29
trace(2 + (3 * (4 + 5))); // Output: 29
trace(2+(3*4)+5); // writes 19
trace(2 + (3 * 4) + 5); // Output: 19

Usage 2: The following example evaluates the function foo(), and then the function bar(), and returns the result of the expression a + b:
var a:Number = 1;
var b:Number = 2;
function foo() { a += b; }
function bar() { b *= 10; }
trace((foo(), bar(), a + b)); // outputs 23

Usage 3: The following example shows the use of parentheses with functions:
var today:Date = new Date();
trace(today.getFullYear()); // traces current year
function traceParameter(param):Void { trace(param); }
traceParameter(2 * 2); //traces 4

Tachikomaia

#11
Cita de: Ragnarok en  8 Julio 2018, 18:04 PM
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.
¿Seguro que eso está relacionado con el tema? Además el 1er link dice ejemplos de FND que tienen paréntesis. Capaz que no entendí bien.

engel lex:
Citarsi quieres expresarlo sin parentesis te toca distribuir (respondiendo a esto)
Ok, gracias por recordármelo, no lo había conscientizado bien.

Considerando que se alarga tanto la expresión preferiría otra cosa. Aunque sea usar paréntesis.

Algo que me confunde es que el 2ndo ejemplo acá
https://es.wikipedia.org/wiki/L%C3%B3gica_binaria#Axiomas
de Propiedad distributiva, tiene un paréntesis y la transformación también, pero creo que el estado inicial no los requiere xD
2+(3*4) = 2+3*4
A<B || (C<D && E<F) = A<B || C<D && E<F

¿?

Además, me da 14, pero si hago (2+3)*(2+4) me da 30!!!
:o :o

Creo que se confundieron :D es (2*3)+(2*4), y sigue siendo innecesario usar los paréntesis.

Cita de: NEBIRE en  9 Julio 2018, 02:26 AM
- En primer lugar tienes dificultad para entender... lo que se te dice.
No todo pero varias cosas sí.

CitarPasas de largo por las soluciones, como esperando una receta mágica (que no existe).
No me di cuenta.
La de las propiedades distributivas sí, creo que no había entendido el alcance o utilidad de eso, pero si miras más arriba verás que tenía una duda (que de hecho ya había planteado), por lo cual como solución me pareció dudosa.
Otra cosa que recuerdo me saltee es tu función de año bisiesto porque no sé qué es eso y además no suelo usar funciones con parámetros. Pensé que podía hacer una solución más sencilla. ¿No existe? Aparentemente sí, distribuir, pero como dije la expresión queda muy larga (o al menos me imagino que se puede alargar mucho si inicialmente ya era larga) así que no me gusta. Mira mi nuevo tema para más info.

EDIT: La notación polaca lo había olvidado. Perdona, tengo problemas de atención o estoy enfocado en varias cosas a la vez, o sea que no me concentro del todo en una en concreto, no sé. Lo voy a pensar si no veo algo mejor. No lo hago ahora mismo porque me parece un asunto difícil.

Citar- En segundo lugar 'tu lenguaje' al margen de calificarlo, ni siquiera lo conoces a fondo aún 'siendo tu favorito' como dices.
Eso no es tanto problema porque se va averiguando según se necesite.
Una cosa que me descolocó en su momento es el típico problema de la inexactitud al trabajar con números muy pequeños, decimales, y si tiene ese problema puede tener otros (de hecho, he encontrado, creo), pero obviamente no me voy a poner a crear mi propio lenguaje desde 0.
Hay muchas funciones y cosas que no conozco, mientras no me parezcan necesarias no las voy a intentar aprender o ver cómo funcionan...

CitarCualquier lenguaje por miserable que sea, admitirá paréntesis para resolver la precedencia de operadores (debe importarte nada que un operador sea 'or', 'and' ó '+', '/', o cualquier otro... un operador es un operador sea del tipo que sea y a tí debe bastarte con saber que como tal cualquier operador tiene un valor de precedencia (prioridad en ser resuelto cuando no tiene paréntesis que lo delimite)
Si es tan simple como dices, entonces bárbaro, pero yo no sabía y antes de hacer la prueba menos.
De hecho había planteado este tema a un programador que conozco y me dijo que la interpretación dependía del lenguaje, que no había una respuesta única. Tú mismo también me preguntaste por mi lenguaje como si fuese relevante.

CitarEsto quiere decir que siempre que tu pongas una expresión ordenada por precedencia, tampoco necesitarás usar paréntesis... pero esa forma la podrás usar en determinadas ocasiones, en otras ocasiones resultará forzado, poco natural y por tanto difícil de leer  y/o erscribir... aparte dle tiempo perdido en ello (solo por evitar colocar unos paréntesis).
El tema es que yo quisiera que los coloque un programa (en un sitio al azar pero sólo en tanto cambien el resultado), y sino, si no apunto tan arriba, es que yo no sé en cuántos lugares posibles se pueden poner, dada una expresión. Obviamente dependerá de la expresión. En mi nuevo tema puse info de eso.
Pensé que crear expresiones sin paréntesis sería más sencillo que con ellos. Estoy hablando de crearlas con un programa.

CitarPero no entiendo a que viene tanto problema con los paréntesis...
Bueno, si no lo había explicado en todo este tema, ahora sí lo acabo de hacer. Y sino, mira mi nuevo tema.

Citarque un lenguaje no admita directamente la notación polaca no es problema, precisamente para eso como programador uno programa el algoritmo que precise al problema que surja.
Lo pensaré si no veo una solución más sencilla.

CitarLa mayoría de lenguajes carecen de interpretación para dicha notación, pero el compilador de todos y cada uno de ellos, acaba teniendo una implementación del algortimo para convertir la expresiones que el programador escribe en el lenguaje, para pasarlo a notación polaca...
Yo creo que tendría que hacer lo inverso: Que el programa genere expresiones en polaco y luego las transforme a normal sin paréntesis. Porque el problema que quería evitar es que las generadas tengan paréntesis, porque no sé cómo hacer eso bien, ya te lo expliqué. Pero si las genera en polaco yo no las puedo copiar y pegar en un código, y es para eso para que las quiero. Me dijiste que transformar expresiones normales a polaco era difícil. Yo tendría que hacer lo inverso, cosa que supongo también es difícil, y más si quería evitar que fuesen con paréntesis, que encima no sabía si era posible (me hablaste de reordenar, pero eso no siempre sirve). Ahora veo que sin paréntesis se alarga demasiado así que sin paréntesis no me serviría, pero en fin, esa solución que me das me parece difícil de aplicar, aunque la pensaré si no veo algo más simple.

CitarEs que insisito... para qué necesitas NO PONER paréntesis, cuando poniéndolos solo de un vistazo queda perfectamente claro y ordenado, sin importar lo compleja que sea una expresión????.

Es que tu te empeñas en no usar paréntesis por simple cabezonería... es como pretender prescindir de barcos o aviones y querer cruzar el océano a nado, y tu preguntas si puedes cruzarlo sin morir en el intento... maneras hay, pero ya son ganas de morir en el intento. Cuando en barco o avión el trayecto es seguro y rápido.
Porque quiero que las expresiones las genere un programa. Hacer que genere Variable1 Comparador1 Variable2 Operador1 y así todo lo que quiera, es fácil, pero si quisiera hacer que ponga paréntesis por ahí no tengo mucha idea. Acordate además que cuando inicié este tema ni siquiera sabía eso del orden de procedencia o sea que para mí era un lío mayor que ahora.

No soy consciente de tanto en el tema pero me imagino que puede haber expresiones que tengan paréntesis dentro del otro, y hablo de que tenga sentido que los tengan, no porque sí. Entonces, yo tenía 2 opciones:
A- Entender en qué sitios tiene sentido que haya paréntesis (o sea no sólo detectar si en caso de haberlos tienen sentido, sino mirar una expresión que no los tenga y poder decir "tienen sentido aquí, o aquí, o aquí y aquí, etc"), y en lo posible indicárselo al programa que genere las expresiones.
B- Evitar que las expresiones generadas tengan paréntesis.

B parece más simple ¿cierto? Sólo tenía que confirmar si toda expresión se podía convertir sin problema a una sin paréntesis.

Digamos que construir barcos o aviones me pareció más difícil que nadar :laugh:
A veces es así, por ejemplo si programar fuese tan fácil te podrías crear un programador que haga todos los programas que quieras en vez de hacerlos tú mismo. Pero supongo que no puedes hacerlo. Ergo te pones a hacer todos los programas. Es lo normal.

CitarVaya hombre... me he hecho un lío... buen chiste.... a estas horas, un poco de humor no viene mal.
Lo decía por:

"los operadores aparecen a ambos lados y el operador en medio."

"Los operadores van delante, los operadores detrás."

CitarXOR no es más complejo que OR ni AND, sino a su mismo nivel...

Tabla de verdad de XOR
----------------------------
0 xor 0 = 0
0 xor 1 = 1
1 xor 0 = 1
1 xor 1 = 0

En resumen es TRUE si solo una de ellas es TRUE. Si se aplica a más de 2 operandos es TRUE, si el número de evaluaciones TRUE es impar, FALSE si son pares...

1 xor 1 xor 1 xor 1 = 0   (4 unos, son pares luego = FALSE)
1 xor 1 xor 1 xor 0 = 1   ( 3 unos, son impares luego es = TRUE)

XOR te puede ahorrar muchas comparaciones...  
Me parece más difícil de entender que los otros operadores, pero con lo último que dices tendré que ver.

CitarA no ser que vivas en Marte, y las teclas de paréntesis se hayan fastidiado y no tengas posibilidades de arreglarlo...
Jaja, de hecho donde vivo estamos en invierno y cuando tengo el teclado bajo las frazadas poner los paréntesis es bastante tedioso xD
Es en serio, al no ver las teclas se me hace complicado (shift+...), pero no es por esto que planteé la duda.


De ese fragmento de PDF se podría deducir que se pueden usar en ifs para alterar el orden de && y ||, pero de hecho no da ejemplos de ello.

Serapis

#12
A veces llega algún usuario, al que resulta extremadamente difícil de ayudar, por varias razones...

- La primera es porque tiene conocimientos excesivamente sesgados (de algunas cosas parece tener cierto conocimiento y de otras cosas simples, lagunas completas).
- Quieren que las cosas se ajusten a su modo de hacer, cuando lo inevitable que es que para algo existente sea 'el nuevo' el que deba adaptarse a lo que hay.
- Insisten en lo que creen entender, sin meditar las respuestas que se les dan... pasan por encima (si es que las leen), como aquel que pisa una alfombra que está ahí para ser pisada.
- Muchas más razones, pero no quiero extenderme, ni tampoco pretendo que nadie se sienta ofendido...

El caso es que tú encajas en este tipo de usuarios, donde la dificultad, no radica en lo que se pide (que es relativamente fácil) si no en hacer entender lo que se dice...
Es como dar las respuestas correctas a alguien que luego tomará tu texto, lo traducirá al chino, luego al hebreo, luego al latín luego al ruso, luego al inglés, luego al estonio, luego al portugués y al final de nuevo al español, para luego intentar digerirlo... se perderá todo el sentido tras tanta traducción, siempre sucede de un idioma a otro, luego cuantas más atraviese, más distancia existirá entre el original y la traducción final, de hecho puede que al final, no tenga nada que ver con el original y hasta haya dificultades para saber qué tema trataba.

Intentaré por última vez, arrojar un poco de luz en tu oscuridad y me conformaré solo con que intentes entenderlo, sin más pretensiones, que luego avances a partir de ahí o sigas en tu luna es cosa tuya...



1 - Los paréntesis también son operadores (no los ignores).
Igual que '+' es para una operación aritmética y 'and' para una operación lógica, un paréntesis aplica una operación de 'prioridad' (orden de ejecución).
Es una lástima que en prácticamente ningún lenguaje se describa así... como un operador de prioridad. Quizás porque todo parte de un cuerpo matemático, en el que se da por sentado que todo el mundo que pretende aprender algo de programación tiene al menos una base matemática mínima... o dicho de otro modo, que no se considera necesario explicarlo porque se da por sobreentendido.

2 - Es bueno aprender (en realidad si uno estudió, recordar, porque es algo que puede olvidarse), el significado de las propiedades (conceptos mtemáticos): distributivas (que reparten), conmutativas, asociativas (que conecta, que lo une...). Explicadode forma matemática puede llegar a entenderse, o puede ser complejo si se le da todo el cuerpo matemático lleno de término que quien lo oye también desconoce...

Una sencilla forma de entenderlo, es que en programación los operadores lógicos cumplen dichas funciones, y particularmente resultan mucho más fácil de entender (el cuerpo matemático, al final solo es entendible por otros matemáticos, a causa de la excesiva jerga verborreica que se emplea sin ton ni son, ni tregua de ningún tipo en las matemáticas (no en todas partes eso sí), en programación hay cierta licencia, gracias a que hay muchos programadores que son autodidactas.
Tampoco se puede caer en 'describo todo con mi propio lenguaje', porque entonces no nos entenderíamos. Habría tantas formas de llamar a algo como personas y eso tampoco puede ser... ambos extremos incurren en ineficacia.

3 - Los paréntesis... tu pelea.
Citar
CitarCualquier lenguaje por miserable que sea, admitirá paréntesis para resolver la precedencia de operadores (debe importarte nada que un operador sea 'or', 'and' ó '+', '/', o cualquier otro... un operador es un operador sea del tipo que sea y a tí debe bastarte con saber que como tal cualquier operador tiene un valor de precedencia (prioridad en ser resuelto cuando no tiene paréntesis que lo delimite)

Si es tan simple como dices, entonces bárbaro, pero yo no sabía y antes de hacer la prueba menos.
De hecho había planteado este tema a un programador que conozco y me dijo que la interpretación dependía del lenguaje, que no había una respuesta única. Tú mismo también me preguntaste por mi lenguaje como si fuese relevante.

Para ayudarte a entender mejor los paréntesis, voy a partir de exponer un ejemplo práctico asequible de entender para todo el mundo, y luego desde ahí, hacer una traslación al asunto programático, y espero que entonces (al menos), acabes de otorgarle la importancia que merece... y por lo tanto aplicarlo, en vez de querer matarlo (obviarlo).

Mira de construir tu árbol genealógico (basta con 10-20 nombres, es suficiente para darte la idea): Podrás escribir tu nombre y al lado, el de tus hermanos, y encima el de tus padres... tu padre y tu madre también tendrán (se supone) hermanos, luego procede ponerlos, a su vez también cada uno de ellos tendrán ó tuvieron su padre y madre respectivamente...
No importa cuan detallado sea el árbol genealógico, puedes imaginártelo elaborado con flechitas, o mas prosaico en columna, algo similar a esto:


Pedro Eva
   Juan Rosa
       Fermin Raquel
       Antonio
       Rosa Fernando
       Felipe
   Luis Encarna
       Daniel Sara
           Enrique
           Daniela Fabian
               Rosa
               Joaquin
           Evaristo
   Maria
   Andres Rocio
   Ana Martin
       Luis
       Antonio
       Marta Rafael
           Ines
           Francisco
           Miguel Maria
               Sonia
               Miguel
               Felipe


Como se puede entender de un simple vistazo, bajo cada pareja yacen los hijos que tienen, los 'casados' nuevamente tienen pareja, y si tienen hijos bajo ellos aparece la lista.

Veamos como queda si los ponemos en línea:
Pedro Eva Juan Rosa Fermin Raquel Antonio Rosa Fernando Felipe Luis Encarna Daniel Sara Enrique Daniela Fabian Rosa Joaquin Evaristo Maria Andres Rocio Ana Martin Luis Antonio Marta Rafael Ines Francisco Miguel Maria Sonia Miguel Felipe

Se pueden poner en columna igualmente:

Pedro
Eva
Juan
Rosa
Fermin
Raquel
Antonio
Rosa
Fernando
Felipe
Luis
Encarna
Daniel
Sara
Enrique
Daniela
Fabian
Rosa
Joaquin
Evaristo
Maria
Andres
Rocio
Ana
Martin
Luis
Antonio
Marta
Rafael
Ines
Francisco
Miguel
Maria
Sonia
Miguel
Felipe


¿Eres capaz en esta lista de determinar quienes son los hijos de quién?. Imposible... Incluso basado en la idea de que detrás de un hombre aparece su pareja (y viceversa), no hay ningún indicador de relación, podría ser hermano y hermana o hermana y hermano....
En cambio, fíjate como en el árbol jerárquico, no hay lugar a dudas quien es hijo de quien.
Bueno, esta lista de nombres equivale a 'tus' expresiones, y la lista jeráquica a una expresión expresada con paréntesis... luego vuelvo a esto... ahora otro ejemplo, de naturaleza más cercana a la programación...

Mira el menú de la calculadora (de win2). Este es su menú (te lo pongo en inglés):

(Menu)
   Edit
       Copy
       Paste
   View
       Standard
       Scientific
       -
       Hex
       Decimal
       Octal
       Binary
       -
       Qword
       Dword
       Word
       Byte
       -
       Digit Grouping
   Help
       Help topics
       -
       About Calculator


Nuevamente puede verse con claridad, que ítems están bajo que otros ítems.
nota: Los ítems Qword... aparecen si se seleccionó: binary, Octal ó Hex, si se elige Decimal aparece Grados, Radianes...

Pongámoslo en columna sin indentacion (o en línea da igual):


Menu
Edit
Copy
Paste
View
Standard
Scientific
-
Hex
Decimal
Octal
Binary
-
Qword
Dword
Word
Byte
-
Digit Grouping
Help
Help topics
-
About Calculator



Igualmente cuando se ponen en columna son una lista sin concierto, todos al mismo nivel son hijos de... pero no se oberva ninguna relación más entre ellos, todos del mismo orden.

Se puede mejorar aún el menú jerárquico a base de poner indicadores de inicio y fin... en muchos menús (la mayoría) no se ponen porque al ocupar espacio, aumenta el área visible que ocupan...
...dando algo con sentido que solo inicio, podría ser algo como esto:


Menu
   Edit
       Portapapeles
           Copy
           Paste
       Fin menu
   View
       Modelo
           Standard
           Scientific
       Fin grupo
       Base numérica
           Hex
           Decimal
           Octal
           Binary
       Fin grupo
       Tipos de datos
           Qword
           Dword
           Word
           Byte
       Fin grupo
       Otros
           Digit Grouping
       Fin grupo
   Help
       Ayuda
           Help topics
       fin grupo
       Autoria
           About Calculator
       Fin grupo
Fin menu



Igualmente podemos proceder con el árbol genealógico, encabezando el padre, y debajo indentado los hijos y terminando con el nombre de la madre (precedido por ejemplo por 2 puntos), a modo de: fin grupo - fin menú.

Si encabeza un hombre, él es el hijo, y por tanto la mujer que cierra los hijos es su cónyuge, en cambio si la lista encabeza por una mujer, es la mujer la descendiente de la familia, y quien cierra la lista de hijos será el hombre, su cónyuge. Si no tienen hijos, solo aparece el nombre del cónyuge...

...a reconstruir el árbol de esta manera:  


Pedro
   Juan
       Fermin
       :Raquel
       Antonio
       Rosa
       :Fernando
       Felipe
   :Rosa
   Luis
       Daniel
           Enrique
           Daniela
               Rosa
               Joaquin
           :Fabian
           Evaristo
       :Sara
    :Encarna
   Maria
   Andres
   :Rocio
   Ana
       Luis
       Antonio
       Marta
           Ines
           Francisco
           Miguel
               Sonia
               Miguel
               Felipe
           :Maria
       :Rafael
   :Martin
:Eva


Ahora puede parecer un poco más lioso de verlo pero al programarlo se podrá buscar recursivamente, mientras esté un nivel más abajo (a la derecha), es hijo. Mientras se mantiene el nivel se suma, cuando cambia el nivel, si sube se hace otra llamada, como padre el actual, los que se devuelvan serán sus hijos, si baja un nivel, se devuelve la cantidad de hijos -1 (se terminó de contar y el último erá el cónyuge).

Bien, todo esto parece no tener nada que ver con tu problema, pero no es así... pese a quien pese y pese a que muy poca gente lo perciba, las expresiones son árboles jerárquicos... en cambio tus expresiones son solo listas...

Vamos a demostrarlo...

z= A + 3 * 5 - B + W / 5 AND T - 2 + X OR P OR H
Podemos obviar los operadores (nos quedamos con los identificadores y las constantes numéricas)y pongámoslos en columna:

Z
A
3
5
B
W
5
T
2
X
P
H

Como se ve es una lista plana, todos al mismo nivel, todos 'hijos' de un supuesto padre... como tus expresiones.

Añadamos paréntesis.... y veremos que pasa...
Supongamos que esta fuera la exresión:
Z = (A + 3) * ((((5 - B) + W) / 5) AND ((T - 2) + X) OR (P OR H))
Ahora pongámoslo en vertical jerárquico (obviando también los operadores, excepto los paréntesis):


Z (
   A
   3
   )
   (
       (
           (
               (
               5
               B
               )
           W
           )
       5
       )
       (
           (
           T
           2
           )
       X
       )
   (
   P
   H
   )
)



Et voilá, eliminando los operadores, esto es dejando el único que al caso importa, puedes ver que subyace una jerarquía... la apertura de paréntesis y cierre delimitan la propia jerarquía, el orden de ejecución... el últérrimo hijo de la descendencia, es el primero que debe ser resuelto, luego el padre, luego el abuelo, etc...

Espero que ahora veas claramente adonde lleva no usar paréntesis. Su uso cordina, da sentido específico...
Igual que si indentas un hijo en otra parte supone que les estás asignando un padre distinto (hijo de su hermano, o nieto, o tío de su hermano, o abuleo de su hermano y padre dle suyo propio), del mismo modo colocar un paréntesis en sitio equivocado cambia el sentido (y el resultado) de la expresión... y del mismo modo que un nieto siempre tendrá padres, es adecuado que ciertos operandos estén entre paréntesis... si deben ejecutarse antes.
También se puede ver que un arbol jerárquico puede ser expresado en línea, y mantiene plenamente su sentido, siempre y cuando sea 'canonizado' con cierres y aperturas, que es lo que hemos hecho anteriormente con el menú de la calculadora y con el árbol geneálogico.

Iguala tu expresión a la lista genealógica, sin pies ni cabezas, sin saber quien es padre y quien es hijo.
Te decía en otro mensaje más arriba, que otra forma es separar una expresión en las subexpresiones que las componen, de modo que sean simples... pero eso da bastante trabajo y tampoco limita la posibilidad de error por confusión...
Observa la genealógica:
Pedro Juan Luis Maria andres Ana Eva
El primer cónyuge es el que aparece en primer lugar, el otro cónyuge el último y en medio los hijos.


Pedro Juan Luis Maria andres Ana Eva
Juan Fermin Antonio Rosa Felipe Rosa
Fermin Raquel
Antonio
Rosa Fernando
Felipe
Luis Daniel Encarna
Daniel Enrique Daniela Evaristo Sara
Daniela Rosa joaquin Fabian
Maria
Andres Rocio
Ana Luis antonio Marta Martin
Luis
antonio
Marta Ines Francisco Miguel Rafael
Miguel Sonia Miguel felipe Maria

Es decir desmontando cada expresión con su propios términos, no requiere paréntesis, pero puedes ver como crece la cantidad de expresiones. Una vez resueltas las subexpresiones, pueden volver a crearse nuevas expresiones con los resultados previos...  hasta llegar a la raíz (la asignación en programación).

La otra forma como ya he expresado varias veces es la notación polaca (no 'el polaco', ni 'en polaco', no es un idioma notación quiere decir "forma, sistema que se usa para expresar conceptos más o menos abstractos", el tipo que lo ideó era polaco, eso sí...).
Usando la notación polaca, no es ni más ni menos que para poder hacer los cálculos ya directamente sin tener que volver a buscar el orden... losd compiladores lo usan, porque al compilar, lo hará de tal forma que la expresión se vaya ejecutando (correctamente) avanzando hacia adelante, sería una caída de rendimiento si tras compilar, cada vez que se evaluara una expresión tuviera que localizar el orden para ejecutarla correctamente... el compilador lo hace una vez y cuando de traduzca a código máquina, ya estará listo, no requiere posterior toqueteo, solo ejecutar...

Resumiendo, no puedes vivir sin paréntesis, la notación polaca primero debes dominarla, pero si te cuesta entender los paréntesis, no es el momento de intentar profundizar en dicha notación...

CitarYo creo que tendría que hacer lo inverso: Que el programa genere expresiones en polaco y luego las transforme a normal sin paréntesis. Porque el problema que quería evitar es que las generadas tengan paréntesis, porque no sé cómo hacer eso bien
...
Porque quiero que las expresiones las genere un programa. Hacer que genere Variable1 Comparador1 Variable2 Operador1 y así todo lo que quiera, es fácil, pero si quisiera hacer que ponga paréntesis por ahí no tengo mucha idea
Es que no sé para que lo necesitas... por lo que alcanzo a entender de como te explicas es que tienes alguna función que 'genera' operandos y operadores (ignoro si al azar o si basado en algo específico)... entonces dado lo poco que he leído respcto de lo que intentas hacer, intuyo que tu programa también debe generar los paréntesis, porque como ya te señalé en el punto 1, y como me he extendido en explicaciones a lo largo de la respuesta, son operadores de prioridad, o si quieres jerárquicos (si se entiende como un árbol), cada paréntesis de apertura aumenta (profundiza) la jerarquía y cada cierre la reduce...

Nota como todos los lenguajes tiene términos o símbolos cuyo único objetivo es precisamente jerárquico, abrir o cerrar expresiones, anidamientos, etc... en C por ejemplo, un comedero de cabeza para los principantes es olvidarse de terminas las expresiones convenientemente con ';' en la mayoría d  lenguajes, el salto de línea es un indicador explícito de fin de una expresión, en C, una expresión continua en varias líneas hasta qwue encuentre dicho símbolo... (el punto y coma). Cada lenguaje tiene su propia convención, pero tiene dichos delimitadores...

CitarAcordate además que cuando inicié este tema ni siquiera sabía eso del orden de procedencia o sea que para mí era un lío mayor que ahora.
Espero que con los ejemplos explícitos que te he expuesto más arriba, puedas finalmente entender la utilidad de la prioridad, la relación de 'inclusión, pertenencia o jerarquía (es todo lo mismo visto bajo diferente prisma). si para una expresión puede ser complejo entenderlo, en cambi sobre un menú, o más cercano un árbol genealógico, es imposible no entender que si no se define debidamente donde empieza y termina los hijos, la confusión es total... Aquí se ha seguido una forma simple y luego la hemos canonizado (se llama canonizar a no omitir nada aunque sea 'sobreentendido', por ejemplo canonizar la frase 'Trabajo el martes', sería: No trabajo el lunes, trabajo el martes, no trabajo el miércoles, ni el jueves, ni el viernes ni el sábado ni el domingo). los hijos quedan encerados en un nivel (+1) indentado entre el padre y la madre, en realidad, los 2 puntos se pueden omitir, si hay indentación el siguiente que aparezca en el mismo nivel será el cónyuge, pero por claridad a veces conviene añadir símbolos, así de un simple vistazo, se acota rápido... (es decir por comodidad 'humana', no estrictamente necesario matemáticamente hablando).

Citar
CitarHay 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*-

Lo decía por:...
Ok, sí. Lapsus mío, pero se deduce que si hay tres espacios y he señalado el centro, y un lado, el del lapsus será el otro lado.  No tiene más importancia.

Citar
CitarXOR no es más complejo que OR ni AND, sino a su mismo nivel...

Tabla de verdad de XOR
----------------------------
0 xor 0 = 0
0 xor 1 = 1
1 xor 0 = 1
1 xor 1 = 0

En resumen es TRUE si solo una de ellas es TRUE. Si se aplica a más de 2 operandos es TRUE, si el número de evaluaciones TRUE es impar, FALSE si son pares...

1 xor 1 xor 1 xor 1 = 0   (4 unos, son pares luego = FALSE)
1 xor 1 xor 1 xor 0 = 1   ( 3 unos, son impares luego es = TRUE)

XOR te puede ahorrar muchas comparaciones..
Me parece más difícil de entender que los otros operadores, pero con lo último que dices tendré que ver.

No creas, es cuestión de práctica...En realidad suple a esta otra expresión:
Z = (Not(A) or B) and (A or Not(B))
Imagina que tienes un un valor para activar y desactivar algo.
Si quieres encenderlo harías algo como:
Enabled = TRUE
Si quieres apagarlo:
Enabled = FALSE
Pero si simplemente quieres poner el estado opuesto, puedes poner:
Enabled = Enabled xor TRUE
En realidad equivale a: Enabled = Not(enabled)
...pero ojo, el not es válido solo porque estamos trabajando con un valor buleano... un valor buleano es un valor donde todos sus bits se comportan como si fueran un único bit.
En cambio si tienes un valor que noe s buleano, el resultado de XOR y NOT, es muy disitnto... con NOT invierte cada bit por el contrario, con XOR solo se invierte si el bit aparece una sola vez (en A o en B)
Not(0011.1010 ) = 1100.0101
0011.1010 xor
1010.1101
-----xor------
1001.0111
Como se ve da un valor muy distinto a los operandos de origen... Xor en realidad es muy interesante se comporta como una suma o como una resta, según el valor de ambos operandos...

Con práctica y tiempo, que consigas entenderlo bien, XOR se volverá un 'amigo invalorable'...

Tachikomaia

#13
Cita de: NEBIRE en 14 Julio 2018, 23:04 PMA veces llega algún usuario, al que resulta extremadamente difícil de ayudar, por varias razones...
En mi caso suele ocurrir cuando pido algo difícil de entender y/o resolver. Otros factores influyen pero creo que ese es bastante clave.

Citar- La primera es porque tiene conocimientos excesivamente sesgados (de algunas cosas parece tener cierto conocimiento y de otras cosas simples, lagunas completas).
¿No es normal?

Citar- Quieren que las cosas se ajusten a su modo de hacer, cuando lo inevitable que es que para algo existente sea 'el nuevo' el que deba adaptarse a lo que hay.
Esto es amplio, no sé a cuántas cosas te refieres. Creo que todos los involucrados deben tener cierta flexibilidad.

Citar- Insisten en lo que creen entender, sin meditar las respuestas que se les dan... pasan por encima (si es que las leen), como aquel que pisa una alfombra que está ahí para ser pisada.
Ya fue explicado. Es que a uno algunos métodos resultan difíciles, entonces intenta 1ero lo que le parece más fácil.

CitarEl caso es que tú encajas en este tipo de usuarios
No sé el 2ndo punto pero los demás sí, supongo.

Citardonde la dificultad, no radica en lo que se pide (que es relativamente fácil) si no en hacer entender lo que se dice...
Veamos...

"C1 or C2 and C3 or C4
No entiendo cómo se interpreta eso"

Sí, eso es fácil de resolver, gracias a uds lo aprendí.

Pero parece que lo plantee mal o algo porque El Benjo y alguien en otro foro me analizaron mis interpretaciones de eso, las cuales sí sabía cómo resolver, pero eso que pedí no lo analizaron xD

Lo planteo de otro modo:
¿Cómo se interpreta esto
C1 or C2 and C3 or C4?
¿como si fuese así
(C1 o C2) y (C3 o C4)?
¿o así C1 o (C2 y C3) o C4?
¿o así C1 o (C2 y (C3 o C4))?

Ya sé que la respuesta es C1 o (C2 y C3) o C4. Lo que estamos hablando es si decirme cómo se interpreta una o cada una de esas cosas resuelve mi duda o no. La respuesta es no.

Es como si dijera que no sé cómo se interpreta la palabra amigo. Por ejemplo:
A- De un ser, ser interesado en favorecerlo.
B- De un ser, ser que suele acompañarlo y ayudarlo.
C- De un ser A, ser dispuesto a sacrificar todo por el beneficio de A.
Y la gente me responda qué significa A, B y C. Yo no pregunté eso. ¿Se entiende?

Tampoco entiendo cuántas formas de interpretar hay, cómo verlas todas.
Esto también ya lo resolví. Aunque la duda de fondo sería dónde tiene sentido meter paréntesis, lo cual he planteado en un nuevo tema.
Ahora que pienso capaz que no me estoy explicando bien de nuevo... A ver. Una expresión puede cambiar su resultado si se meten paréntesis en ciertos lugares. ¿Cuales son las posibles alteraciones de los resultados y cómo se logran? ¿cómo puedo hacer que dada una expresión, un programa genere (como si hiciera una lista) todas las alteraciones posibles sin repetir?
Ejemplo:
Tenemos la expresión C1 or C2 && C3 or C4
Posibles paréntesis (en rojo puse los casos que no causan cambios, los casos que quiero que el programa evite generar):
1- (C1 or C2) && C3 or C4
2- (C1 or C2 && C3) or C4
3- C1 or (C2 && C3) or C4
4- C1 or (C2 && C3 or C4)
5- C1 or C2 && (C3 or C4)
6- ((C1 or C2) && C3) or C4


Y se puede seguir. Pero la verdad me entrevero bastante en cuales son los posibles lugares. Y la interpretación también me lleva un poco de tiempo. Por eso mismo, este proceso de:
1- Generar todas las alteraciones posibles por paréntesis.
2- Descartar las que no cambien el resultado.
lo quiero automatizar.

Cuando hice el tema pensaba: "Ya que esto es tan difícil, voy a ver si puedo evitar tener que usar paréntesis, capaz que puedo generar los cambios sin tener que usarlos."

Es como si quisiera generar textos al azar pero no supiera indicar a la computadora en qué casos "esta" lleva tilde. Tengo 2 opciones: Reviso las frases y los pongo manualmente, o intentar buscar una forma de poder generar frases que digan lo mismo pero sin usar esa palabra.

Bueno, me aburrí de analizar tanto mi texto, algunas cosas que pedí eran fáciles para uds, otras las expliqué mal parece, y más no me acuerdo ni analizaré.

Ah: El Benjo al final me dijo:
"Sigue las reglas del orden de evaluación de los operadores"
pero claro, yo no sabía de qué me estaba hablando, ni idea. Sí, tienes razón en eso. Pero era deducible que yo no lo sabía ¿no?

CitarEs como dar las respuestas correctas a alguien que luego tomará tu texto, lo traducirá al chino, luego al hebreo, luego al latín luego al ruso, luego al inglés, luego al estonio, luego al portugués y al final de nuevo al español, para luego intentar digerirlo... se perderá todo el sentido tras tanta traducción, siempre sucede de un idioma a otro, luego cuantas más atraviese, más distancia existirá entre el original y la traducción final, de hecho puede que al final, no tenga nada que ver con el original y hasta haya dificultades para saber qué tema trataba.
Lo veo medio exagerado, pero cada uno tiene su forma de interpretar las cosas, sí.

CitarIntentaré por última vez, arrojar un poco de luz en tu oscuridad y me conformaré solo con que intentes entenderlo, sin más pretensiones, que luego avances a partir de ahí o sigas en tu luna es cosa tuya...
Por lo que he leído vas a decirme cosas que ya había entendido. Parece en vano. Preferiría que me hubieras respondido mis nuevas dudas.

Citar1 - Los paréntesis también son operadores (no los ignores).
Nunca los ignoré, pero hay casos en que sobran.

A que son operadores no había prestado atención.

Si me preguntabas cual era la estructura de una expresión condicional te decía:
Valor1 Comparador Valor2
Ej: A < B

Y de una más compleja:
Valor1 Comparador1 Valor2 Operador Valor3 Comparador2 Valor4
Ej: A < B && C <= D

Con el nuevo dato que me das tengo que usar un nombre más específico que "Operador" ¿cual me recomiendas?

Perdona si te cae mal lo que digo, pero esa info que me das y esta:
CitarIgual que '+' es para una operación aritmética y 'and' para una operación lógica, un paréntesis aplica una operación de 'prioridad' (orden de ejecución).
Es una lástima que en prácticamente ningún lenguaje se describa así... como un operador de prioridad. Quizás porque todo parte de un cuerpo matemático, en el que se da por sentado que todo el mundo que pretende aprender algo de programación tiene al menos una base matemática mínima... o dicho de otro modo, que no se considera necesario explicarlo porque se da por sobreentendido.
No me cambia (salvo en mi forma de llamar a las cosas, como dije arriba) ¿qué se supone que debo hacer con eso que me dices? Que los paréntesis cambian el orden conque se aplican las cosas lo sabía desde niño, como casi cualquier otra persona. Si los paréntesis son "operadores" o no, no me sirve de mucho saberlo, me parece. Tú mismo dices que casi ningún lenguaje enseña eso. E intentas que yo, que no tengo estudios técnicos, sepa semejante cosa que deduzco la mayoría no sabe. Gracias pero no debiste molestarte en eso.
A mí los tecnicismos no me llaman mucho saberlos.

Citar2 - Es bueno aprender (en realidad si uno estudió, recordar, porque es algo que puede olvidarse), el significado de las propiedades (conceptos mtemáticos): distributivas (que reparten), conmutativas, asociativas (que conecta, que lo une...).
No soy de forzarme a memorizar cosas, si las veo muchas veces me quedan y sino no.
Nunca lo aprendí, resolvía las ecuaciones como podía sin saber cómo se llamaban los métodos que usaba.

Más allá de los nombres parecen métodos para simplificar expresiones, pero el único que no es obvio es la distributiva.
https://es.wikipedia.org/wiki/L%C3%B3gica_binaria#Axiomas
Luego hay números negativos y otras cosas que tendría que ver qué son, pero en este momento no le veo mucho sentido a ponerme a leer eso raro.

No sé si me estás diciendo algo más que eso, perdona pero no te entiendo.
CitarUna sencilla forma de entenderlo, es que en programación los operadores lógicos cumplen dichas funciones, y particularmente resultan mucho más fácil de entender
Si con funciones te refieres a propiedades, lo entiendo. Lo demás no sé, hablas de que los matemáticos usan términos difíciles, que concuerdo, y luego
Citaren programación hay cierta licencia, gracias a que hay muchos programadores que son autodidactas.
Tampoco se puede caer en 'describo todo con mi propio lenguaje', porque entonces no nos entenderíamos. Habría tantas formas de llamar a algo como personas y eso tampoco puede ser... ambos extremos incurren en ineficacia.
Con lo cual también concuerdo. Pero nunca lo he negado ni nada así.

Citar
CitarSi es tan simple como dices, entonces bárbaro, pero yo no sabía y antes de hacer la prueba menos.
De hecho había planteado este tema a un programador que conozco y me dijo que la interpretación dependía del lenguaje, que no había una respuesta única. Tú mismo también me preguntaste por mi lenguaje como si fuese relevante.
Para ayudarte a entender mejor los paréntesis
Nunca tuve problemas en interpretar paréntesis, sino el orden de prioridad de los or y and cuando no había paréntesis que me lo indicaran.

Lo que me confunde de los paréntesis es, como expliqué arriba, dada una expresión sin ellos, dónde es que meterlos causa alteración y dónde no. Pero lo puedo saber si lo pienso. Lo que no sé es la regla general, una que pueda poner en un programa para que me diga "aquí, acá o allá". Ya lo expliqué...
https://foro.elhacker.net/programacion_general/automatizar_complicamiento_de_duda_y_de_programa_que_intenta_resolverla-t485721.0.html

Te lo explico de otro modo.
Suponte que tengo la ecuación:
1+2*3+4*5 = 27
Y te digo: Quiero que el resultado sea 30 ¿cuántas formas hay de variarla para que el resultado sea ese? Muchos ¿no? Ejemplos:
A: 4+2*3+4*5 = 30
B: 1+3*3+4*5 = 30
etc

Bueno, lo que quiero con los paréntesis es algo similar. El programa produce una expresión sin ellos y yo quiero que produzca otras con paréntesis de modo que cambien el resultado de la 1era, es decir, que sea una expresión diferente.
Aunque a diferencia de la analogía, yo quiero que cada resultado pueda ser diferente, no quiero alteraciones que siempre terminen dando lo mismo que otras.

Así se producen todas las combinaciones de texto posibles, o casi:
A
B
C
...
Z
AA

Así se producen todas las expresiones condicionales posibles que no modifican variables:
V1 < V2
V1 <= V2
V1 == V2
V1 != V2
V2 < V1
V2 <= V1
(sep, los símbolos > y => no los uso).
V1 < V2 && V1 < V3
etc, etc
¡Pero llega un punto en que tiene sentido poner paréntesis porque así las expresiones generadas son distintas! ¿Pero exactamente dónde tiene sentido meterlos? Eso es lo que no entiendo. Alguna regla habrá. Dije
"Cuando implican algún "or" no implicado por otros, y hay "&&" fuera."
pero creo que no es correcto.


Citary espero que entonces (al menos), acabes de otorgarle la importancia que merece... y por lo tanto aplicarlo, en vez de querer matarlo (obviarlo).
Me parece que no has entendido.

Nunca dije que los paréntesis fuesen algo "malo", sólo que se me complicaba hacer un programa que generara expresiones con paréntesis que tuvieran razón de ser y entonces quería expresarlas de modo diferente.
Es como si quisiera hacer una máquina de hacer anillos usando basura pero como no sé producir diamantes con ella preguntara si hay algo similar (podría ser una laparita). No estoy diciendo que el diamante sea malo, sólo que no sé producirlo bien con las herramientas o materiales que tengo.

Además ya he dicho que los usaré porque sino las expresiones me quedan muy largas. Una posible alternativa sería ifs anidados pero estoy más bien decidido a usar paréntesis. La duda sigue siendo cómo el programa los puede poner. Más o menos ya expliqué esa duda.

Citar¿Eres capaz en esta lista de determinar quienes son los hijos de quién?.[/b] Imposible...
De acuerdo.

CitarBueno, esta lista de nombres equivale a 'tus' expresiones, y la lista jeráquica a una expresión expresada con paréntesis
Afff, creo que te entendí, pero me estás explicando una cosa que ya sabía.

Me estás diciendo que esto:
V1 < V2 && (V1 < V3 or V2 == V4)
no se puede interpretar igual que esto
V1 < V2 && V1 < V3 or V2 == V4
que sería imposible saber que eso habría que interpretarlo como si la or fuese a aplicarse 1ero.

Si es eso, no te preocupes, lo sabía desde antes (aunque al no saber la forma correcta de interpretar lo último, sí creía que "se podía" como posibilidad, pero no que podía deducirse a ciencia cierta que se había querido decir eso. Es como que alguien escriba "VELA", quite la V, y me pregunte qué escribió, evidentemente puedo adivinar pero sería casualidad).

Lo que no sabía era cómo se interpretaba eso último, así sin paréntesis. Ya me dijeron que las && se aplican antes que las or, lo probé en mi lenguaje y es así, asunto resuelto.


Si me estás hablando de otra cosa no estoy de acuerdo con lo que dices (si es lo que pienso). Si te digo que una expresión es así
V1 < V2 && V1 < V3 or V2 == V4
sin paréntesis, es porque no los tiene, ni los requiere. Si los requiriera los pondría, no te preocupes.

No los quitaría por una cuestión estética o algo así, si los quito es sólo en casos en que sobran.

Citaren cambio tus expresiones son solo listas...

Vamos a demostrarlo...

z= A + 3 * 5 - B + W / 5 AND T - 2 + X OR P OR H
Podemos obviar los operadores (nos quedamos con los identificadores y las constantes numéricas)y pongámoslos en columna:

Z
A
3
5
B
W
5
T
2
X
P
H

Como se ve es una lista plana, todos al mismo nivel, todos 'hijos' de un supuesto padre... como tus expresiones.
Yo jamás hice una cosa así ni plantee hacerla  :o

CitarEspero que ahora veas claramente adonde lleva no usar paréntesis. Su uso cordina, da sentido específico...
Nunca lo puse en duda.

Citardel mismo modo colocar un paréntesis en sitio equivocado cambia el sentido (y el resultado) de la expresión...
Puede suceder, sí, es parte de lo que quiero que haga mi programa a la hora de ponerlos en las expresiones que genere.
Por las dudas: No es que quiera que mi programa interprete mal las cosas o de forma random, es que quiero que invente expresiones que luego yo usaría en otro sitio. ¿Viste los videojuegos que generan mapas al azar? Bueno, esto sería similar, sólo que en vez de hacer mapas serían expresiones.

Citares adecuado que ciertos operandos estén entre paréntesis... si deben ejecutarse antes.
Siempre lo tuve claro.

Aunque en un caso como A<B or (A<C && C==D)
no los usaría. ¿Es un problema?
Se supone que el resultado es el mismo. Lo demás va en la forma de entender de cada uno, si le queda fácil o no. A mí los goto me resultan más fáciles que los do while en algunos casos.

CitarTe decía en otro mensaje más arriba, que otra forma es separar una expresión en las subexpresiones que las componen, de modo que sean simples... pero eso da bastante trabajo y tampoco limita la posibilidad de error por confusión...
No me di cuenta. Voy a pensar algunas cosas y si no me funcionan y me acuerdo reviso eso.

CitarEs decir desmontando cada expresión con su propios términos, no requiere paréntesis, pero puedes ver como crece la cantidad de expresiones.
Por eso decidí que el programa sí genere expresiones con paréntesis. Lo entendí por el tema de la propiedad distributiva.

CitarLa otra forma como ya he expresado varias veces es la notación polaca (no 'el polaco', ni 'en polaco', no es un idioma notación quiere decir "forma, sistema que se usa para expresar conceptos más o menos abstractos", el tipo que lo ideó era polaco, eso sí...).
xD
Vale.

CitarResumiendo, no puedes vivir sin paréntesis
Se podría pero sería extenso, como has dicho.

Citarsi te cuesta entender los paréntesis
Me cuesta entender cual es la regla que determina donde alteran las interpretaciones. Y si me la has dicho no la he entendido. Una regla es algo así:
"Cuando implican algún "or" no implicado por otros, y hay "&&" fuera."
pero creo que no es correcto.


Citarpor lo que alcanzo a entender de como te explicas es que tienes alguna función que 'genera' operandos y operadores (ignoro si al azar o si basado en algo específico)... entonces dado lo poco que he leído respcto de lo que intentas hacer, intuyo que tu programa también debe generar los paréntesis, porque como ya te señalé en el punto 1, y como me he extendido en explicaciones a lo largo de la respuesta, son operadores de prioridad, o si quieres jerárquicos (si se entiende como un árbol), cada paréntesis de apertura aumenta (profundiza) la jerarquía y cada cierre la reduce...
Tendré que traer un pseudocódigo para que se entienda  :-\
Pero sí, es como dices. El tema es evitar que los ponga en lugares donde no cambiarán los resultados.

Citaren C por ejemplo, un comedero de cabeza para los principantes es olvidarse de terminas las expresiones convenientemente con ';'
Jajaja, en AS es igual.

Lo que me reventaba era Clipper... ni me acuerdo pero creo que ni siquiera te decía en qué línea estaba el problema. Una locura.

CitarEspero que con los ejemplos explícitos que te he expuesto más arriba, puedas finalmente entender la utilidad de la prioridad
Eso lo entiendo, ciertos operadores cambian la prioridad... Que los paréntesis lo hacen lo tuve siempre claro, desde niño digo.

engel lex

too long didnt read XD


se han vuelto exacesivamente larga las respuesta me da pereza leer tanto XD

explica puntualmente si tienes dudas XD

Citar2+(3*4) = 2+3*4
A<B || (C<D && E<F) = A<B || C<D && E<F

¿?

Además, me da 14, pero si hago (2+3)*(2+4) me da 30!!!
:o :o

Creo que se confundieron :D es (2*3)+(2*4), y sigue siendo innecesario usar los paréntesis.

creo que fallaste matematica de basica XD

2+(3*4) = 2+3*4

se usa parentesis para que la gente menos acostumbrada no se equivoqe debido al orden de operandos

pero tu erras al hacer una suma distributiva... eso no existe... en multiplicación existe porque la multiplicación es una "suma abreviada"...


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

Cita de: engel lex en 15 Julio 2018, 06:07 AM
se han vuelto exacesivamente larga las respuesta me da pereza leer tanto XD

explica puntualmente si tienes dudas XD
Ok, por ahora sólo te diré 2 bastante simples se supone.

1-
Citarcreo que fallaste matematica de basica XD

2+(3*4) = 2+3*4

se usa parentesis para que la gente menos acostumbrada no se equivoqe debido al orden de operandos

pero tu erras al hacer una suma distributiva... eso no existe... en multiplicación existe porque la multiplicación es una "suma abreviada"...
En wikipedia dice:

A*(B+C) = A*B+A*C
Comprobemos.
2*(3+4) = 2*7 = 14
2*3+2*4 = 6+8 = 14
Correcto.

Ahora el que digo que está mal.

A+(B*C) = (A+B)*(A+C)
2+(3*4) = 2+12 = 14
(2+3)*(2+4) = 5*6 = 30


https://es.wikipedia.org/wiki/L%C3%B3gica_binaria#Axiomas

Dije que el ejemplo está mal, que debería ser:
A+(B*C) = A*B+A*C
4+(10*7) = 4+70 = 74
4*10+4*7 = 40+28 = 68
Bueno, tienes razón, me equivoqué, no es como digo, pero con los otros números me dió bien:
2+(3*4) = 2+12 = 14
2*3+2*4 = 6+8 = 14

Y eso no quita que el ejemplo de ellos esté mal.

Comprobación 2 del 1er caso:
5*(7+3) = 5*10 = 50
5*7+5*3 = 35+15 = 50

¿Cual es el problema? ¿pusieron un ejemplo que no existe o qué?


Duda 2:
Dada una expresión condicional así:
V1<V2
ponerle paréntesis es absurdo. Pero si se le quisiera poner, digamos que sólo hay una forma:
(V1<V2)

NOTA: Ponerlos así por ejemplo (V1)<V2 no me interesa, estoy hablando de las subcondiciones no de las variables.

En esta otra expresión:
V1<V2 y V1<V3
también es absurdo. Pero las posibilidades serían:
V1<V2 y (V1<V3)
(V1<V2 y V1<V3)
(V1<V2 y (V1<V3))
(V1<V2) y V1<V3
(V1<V2) y (V1<V3)
((V1<V2) y (V1<V3))

En esta otra:
V1<V2 y V1<V3 o V1<V4
Tiene sentido porque lo que quiero hacer es producir todas las posibles expresiones y si a esa le pongo paréntesis en ciertos sitios el resultado puede cambiar. Una forma, y probablemente la única que tiene sentido para mí, sería así:
V1<V2 y (V1<V3 o V1<V4)
Pero mi duda es cuales serían las posibilidades, independientemente de si son absurdas o no. Es como lo que hice en los casos anteriores, te muestro un poco:
V1<V2 y V1<V3 o (V1<V4)
V1<V2 y (V1<V3 o V1<V4)
V1<V2 y (V1<V3 o (V1<V4))
V1<V2 y (V1<V3) o V1<V4
V1<V2 y (V1<V3) o (V1<V4)
V1<V2 y ((V1<V3) o (V1<V4))
Y sigue y se complica.

Duda alternativa:
¿Cómo sería un pseudocódigo para que un programa produzca todas esas posibilidades?

Duda alternativa 2:
¿Cómo sería un pseudocódigo para que un programa produzca sólo las posibilidades que no sean repetidas (o absurdas)?

engel lex

Cita de: Tachikomaia en 16 Julio 2018, 04:48 AM

Ahora el que digo que está mal.

A+(B*C) = (A+B)*(A+C)
2+(3*4) = 2+12 = 14
(2+3)*(2+4) = 5*6 = 30


eso pasa por no leer....

CitarPrincipio de dualidad
Todas las expresiones booleanas permanecen válidas si se intercambian los operadores '+' y '·', y los elementos '0' y '1'.

Así para obtener una expresión algebraica dual, se intercambian los operadores "Y" y "Ó" y se reemplazan unos por ceros y viceversa.

no estás haciendo matemática normal... estás en Lógica binaria

esa expresión es equivalente a

A y (B o C) = (A y B) o (A y C)

que es lo mismo que vengo diciendo de más atrás




CitarDuda 2:
Dada una expresión condicional así:
V1<V2
ponerle paréntesis es absurdo. Pero si se le quisiera poner, digamos que sólo hay una forma:
(V1<V2)

NOTA: Ponerlos así por ejemplo (V1)<V2 no me interesa, estoy hablando de las subcondiciones no de las variables.

En esta otra expresión:
V1<V2 y V1<V3
también es absurdo. Pero las posibilidades serían:
V1<V2 y (V1<V3)
(V1<V2 y V1<V3)
(V1<V2 y (V1<V3))
(V1<V2) y V1<V3
(V1<V2) y (V1<V3)
((V1<V2) y (V1<V3))

en este caso

V1<V2 y V1<V3 o V1<V4
V1<V2 y (V1<V3 o V1<V4)


la primera y la segunda expresión son diferentes... (lee mis paraffos anteriores... "o" separa, estás forzandolos a unirse con parentesis entonces cambiaste la logica

sobre las posibilidades, para eso están las formulas estadísticas, revisa sobre formulas de permutaciones




a tus otras 2 dudas ese es tu trabajo XD la parte complicada de ese codigo (que tampoco es tanto) es la algoritmia... y eso es lo que tu tienes que sentarte a hacer...
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

Cita de: engel lex en 16 Julio 2018, 05:10 AMeso pasa por no leer....

no estás haciendo matemática normal... estás en Lógica binaria

esa expresión es equivalente a

A y (B o C) = (A y B) o (A y C)

que es lo mismo que vengo diciendo de más atrás
Ok, pero había leído los axiomas, con eso debería alcanzar ¿desde cuando un axioma requiere de un principio o de otro axioma para ser válido?

También hay otra cosa que para mí no encaja.

En wikipedia se dice que el + equivale a la "o" y que el * equivale a "y".

También dan 2 ejemplos de propiedad distributiva aplicable a lógica binaria.

El 1ero es:

Esa expresión equivale a:
A y (B o C) = A y B o A y C.

Lo que tú has dicho.

Pero la cuestión era el 2ndo ejemplo, y es el que has citado:


Y me dices "esa expresión equivale a A y (B o C) = (A y B) o (A y C)"

Me parece que en realidad "esa" equivale a:
A o (B y C) = (A o B) y (A o C)


Pero bueno, lo principal ya está ¿no? Más allá de tu supuesto despiste creo que ya entendí.

Citaren este caso

V1<V2 y V1<V3 o V1<V4
V1<V2 y (V1<V3 o V1<V4)


la primera y la segunda expresión son diferentes... (lee mis paraffos anteriores... "o" separa, estás forzandolos a unirse con parentesis entonces cambiaste la logica
Claro, lo comenté:
En esta otra:
V1<V2 y V1<V3 o V1<V4
Tiene sentido porque lo que quiero hacer es producir todas las posibles expresiones y si a esa le pongo paréntesis en ciertos sitios el resultado puede cambiar. Una forma, y probablemente la única que tiene sentido para mí, sería así:
V1<V2 y (V1<V3 o V1<V4)

No es que no me haya dado cuenta.

Citarsobre las posibilidades, para eso están las formulas estadísticas, revisa sobre formulas de permutaciones
Veré qué encuentro.

Citara tus otras 2 dudas ese es tu trabajo XD la parte complicada de ese codigo (que tampoco es tanto) es la algoritmia... y eso es lo que tu tienes que sentarte a hacer...
Tsk. Ya se me ocurrió más o menos una forma, pero si plantee el tema fue porque no tenía idea de cómo hacer eso, especialmente el filtro (cosa que aún no sé salvo probando distintos valores a ver si dan distintos resultados, lo cual es poco eficiente).
Una duda offtopic: ¿Qué otra parte es complicada en otros casos?

engel lex

CitarOk, pero había leído los axiomas, con eso debería alcanzar ¿desde cuando un axioma requiere de un principio o de otro axioma para ser válido?

no entiendo que otro axioma...




CitarMe parece que en realidad "esa" equivale a:
A o (B y C) = (A o B) y (A o C)

si, estás en lo cierto, me equivoqué allí





Citar¿Qué otra parte es complicada en otros casos?

me parece que ya tienes discutido lo más extenso y complicado
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

#19
Cita de: engel lex en 16 Julio 2018, 12:14 PM
no entiendo que otro axioma...
Tal vez no es un "otro axioma", pero si uno mira desde donde dice axiomas y ve la propiedad distributiva podría interpretarse como yo lo hice SALVO que antes se hubiera leído el principio que tú me mostraste que yo no había leído.
Entonces es como un axioma que sólo funciona si se sigue otro axioma...

Citarme parece que ya tienes discutido lo más extenso y complicado
No sé qué, pero dejémoslo así.


En cuanto a las fórmulas.

Esto parece inútil:
https://www.vitutor.net/1/estadistica.html

Y esto:
https://www.youtube.com/watch?v=m358EUYS1CQ
Parece ser un método para calcular la cantidad de casos posibles, pero a mí no me interesa ver la cantidad, me interesa ver los casos, es decir no quiero que el programa me diga un número, quiero que me muestre todos los casos.

Este código genera todos los textos (con los caracteres especificados en Data) posibles:
Escena 1
  actions for fotograma 1
     Data = "ABCDEFGHIJKLMNÑOPQRSTUVWXYZ";
     Char0ID = -1;
     Chars = 1;
     Resp = "";
  actions for fotograma 2
     C = "";
     Cursor = 0;
  actions for fotograma 3
     // Caracter listo para aumentar.
     Char_Cursor_ID = "Char"+Cursor+"ID";
     EvaledxChar_Cursor_IDxPlus1 = eval(Char_Cursor_ID)+1;
  actions for fotograma 4
     if (EvaledxChar_Cursor_IDxPlus1<27) {
        // Caracter puede aumentar.
        set (Char_Cursor_ID, EvaledxChar_Cursor_IDxPlus1);
        // Caracter aumenta.
        // Hay que actualizar C.
     } else {
        // El valor del char está fuera del límite.
        set (Char_Cursor_ID, 0);
        Cursor = Cursor+1;
        if (Cursor == Chars) {
           // Hay que agregar un char.
           set ("Char"+Cursor+"ID", 0);
           Chars = Chars+1;
           // Hay que actualizar C.
        } else {
           // Hay que aumentar el char siguiente.
           gotoAndPlay (3);
        }
     }
  actions for fotograma 5
     // Actualizar C.
     C = "";
     Cursor = 0;
  actions for fotograma 6
     C = Data.charAt(eval("Char"+Cursor+"ID"))+C;
     Cursor = Cursor+1;
  actions for fotograma 7
     if (Cursor<Chars) {
        // Continuar actualizando chars.
        gotoAndPlay (6);
     } else {
        // Listo, mostrar en pantalla y crear otro tx.
        Resp = C+"\n"+Resp;
        gotoAndPlay (2);
     }


El resultado llega hasta se quiera, lo corté porque no tiene sentido aquí.
CitarAS
AR
AQ
AP
AO

AN
AM
AL
AK
AJ
AI
AH
AG
AF
AE
AD
AC
AB
AA
Z
Y
X
W
V
U
T
S
R
Q
P
O
Ñ
N
M
L
K
J
I
H
G
F
E
D
C
B
A
Creo que está relacionado.

Esto son las variables que no muestra (por si te interesa entenderlo mejor):
CitarVariable _level0.Data = "ABCDEFGHIJKLMNÑOPQRSTUVWXYZ"
 Variable _level0.Char0ID = 20
 Variable _level0.Chars = 2
 Variable _level0.C = ""
 Variable _level0.Cursor = 0
 Variable _level0.Char_Cursor_ID = "Char0ID"
 Variable _level0.EvaledxChar_Cursor_IDxPlus1 = 20
 Variable _level0.Char1ID = 0
No recuerdo bien el funcionamiento pero básicamente crea variables llamadas CharXID, donde X es el número de caracter, o sea la posición que ocupa en el texto creado. Y el valor se va variando. Entonces se forma el texto:
C = Char0ID + Char1ID
El momento en que lo corté no necesariamente es la parte en que acaba de actualizar C, pero bueno, digamos que
Char0ID es 20, o sea S
y Char1ID es 0, o sea A.

Supongo que hay formas más sencillas de hacerlo pero esa fue la que se me ocurrió.

El código que genera condiciones no lo tengo a mano y quizá ni siquiera lo tengo, pero la "lógica" es similar, se va variando el comparador y las relaciones, y se van agregando. Las variables no me interesa variarlas, pero no sería difícil.

Los paréntesis... sí.

- Los abiertos sólo se pueden poner al comienzo de la expresión y/o luego de una relación.
- Los cerrados, sólo al final de la expresión y/o antes de una relación.
- La cantidad de abiertos debe ser la misma que de cerrados y además, por cada cerrado, debe haber uno abierto antes.

En esta expresión:
A o B y C
Tenemos...
1 A o 3 B 4 y C 6
es decir, esos números son posibles posiciones de los paréntesis.
Los abiertos sólo pueden ir en lugares impares.
Y los cerrados sólo en pares.
El lugar 2 y 5 no cuentan porque sólo encerrarían una subcondición pero para que tengan "sentido" deben encerrar una relación. Antes había dicho otra cosa, me confundí.

Luego es cuestión de "hacer números", casi...
NOTA: X = 0.
0X00X0: A o B y C
0X10X1: A o (B y C)
1X01X0: (A o B) y C
Es sólo esto xD Es más fácil de lo que había pensado y dicho. Pero se va complicando a medida que aumentan las relaciones.
NOTA: Ya sé que al poner paréntesis puede cambiar la lógica, esa es la idea.

0X0000X0: A o B y C o D
0X0010X1: A o B y (C o D)
0X1000X1: A o (B y C o D)
0X1001X0: A o (B y C) o D
0X1010X2: A o (B y (C o D))

O sea, eso es más o menos lo que tengo en mente, pero es difícil de aplicar, porque hay que especificar cuando puede ir un número mayor que 1, cuando puede haber paréntesis contiguos... ¿Alguna otro método?