5

Tradicionalmente, la mayoría de los lenguajes de programación tienen prioridad de Y más alta que la prioridad de O, de modo que la expresión "a OR b AND c" se trata como "a OR (b Y c)". Siguiendo esa idea, los motores de búsqueda y los lenguajes de consulta/direccionamiento (css, xpath, sql, ...) utilizaron la misma priorización. ¿No fue un error?¿Deben los idiomas de consulta tener prioridad de operador O más que la prioridad de AND?

Cuando se trata de datos suficientemente grandes, esa priorización es inconveniente porque hace que sea imposible crear un contexto de consulta reutilizable sin el uso de paréntesis. Es más conveniente crear contexto mediante el uso de OR y luego los resultados de la unión en ese contexto mediante el uso de OR. Es aún más conveniente si se usa espacio como operador AND y la coma se usa como operador OR.

Ejemplos: Al buscar en la Internet para los billetes de avión a Bahamas en noviembre o diciembre que sería más conveniente que escribir "bahamas de billetes de avión noviembre, diciembre" en lugar de "Línea aérea Bahamas billetes de noviembre", "bahamas de billetes de avión de diciembre" o "billete de avión bahamas (noviembre, diciembre)"

En CSS si necesitamos establecer el estilo rojo de 2 elementos, tenemos que hacer eso: body.app1 div.d1 td.phone span.area, body.app1 div.d1 td.fax span.area {color: red} esencialmente el prefijo de duplicación body.app1 div.d1 y el sufijo span.area

Si la prioridad de O fuera mayor que AND, escribiríamos esto en CSS: body.app1 div.d 1 td.phone, td.fax span.area {color: red}

Por supuesto, esta idea se puede desarrollar para tener 2 operadores O uno con mayor prioridad que AND y uno con menor, por ejemplo ',' es más alto, ';' es más bajo, pero en muchos casos los idiomas no tienen símbolos de repuesto para extenderse de esa manera y también la prioridad existente de "," donde se usa es baja.

+0

Tenga en cuenta que los filtros de gmail ya están utilizando esta prioridad inversa - prioridad de | está por encima del espacio (Y) – alpav

+0

Tenga en cuenta que cuando diseña criterios para consultas en MS Access, puede poner A o B en una columna y C en otra y MS Access generar consultas con (A o B) y C. – alpav

Respuesta

9

Teniendo en cuenta que el origen de OR y AND proviene de la lógica matemática, donde tienen una precedencia bien definida, no se puede violar esa precedencia en el diseño sin confundir a la mayoría VAST de los usuarios.

+0

Pero la notación matemática ya se ha violado reemplazando el símbolo OR lógico (que se parece a V) con || y el símbolo AND lógico (que se ve como A) con && simplemente porque el teclado no tiene esos símbolos. Si esa violación no era el fin del mundo, ¿por qué no violarla más cambiando las prioridades? – alpav

+2

Hay una gran diferencia entre un cambio en notatio y un cambio en la lógica. – DVK

9

Prefiero tener consistencia en todas partes, en código, SQL, consultas de búsqueda, para que no tenga que recordar en qué dirección va en esta situación particular.

+0

Estoy de acuerdo con que la coherencia tiene mayor prioridad que muchas otras incluso buenas mejoras. Por eso, cuando inventan nuevos lenguajes o tecnologías, cualquier error se convierte en permanente. Por cierto, al programar en SQL, ¿observa que cuando usa O casi siempre tiene que poner paréntesis, pero no cuando usa AND? – alpav

3

Creo que le falta el sentido de prioridad de los operadores. Están allí simplemente como una conveniencia para el programador/escritor de libros. El uso del orden de las operaciones hace que ciertas cláusulas se puedan escribir sin parens, pero el uso de parens garantiza que el lector sepa exactamente qué está haciendo el código, especialmente cuando los diferentes idiomas tienen un orden de operaciones diferente.

+0

Incluso si estoy perdido, estoy en esto junto Charles Babbage: ["La cantidad de significado comprimido en un espacio pequeño por signos algebraicos, es otra circunstancia que facilita los razonamientos que estamos acostumbrados a llevar a cabo con su ayuda".] https://books.google.com/books?id=b4Y_AAAAcAAJ&pg=PA6&lpg=PA6) – alpav

3

No conozco ningún lenguaje que haga esto, pero quizás debería ser un error tener AND y OR combinados sin paréntesis. Esta es una causa muy común de errores estúpidos.

+0

Pueden ser esos errores estúpidos como consecuencia de una priorización incorrecta. – alpav

+0

Sé dos: MS Access y filtros de Gmail. Ver mis 2 comentarios debajo de la pregunta principal. – alpav

1

Cuando se utilizan operadores booleanos para unir declaraciones lógicas, el operador "y" debe tener prioridad sobre "o". Creo que el punto de confusión es que muchos lenguajes de consulta implícitamente forman declaraciones lógicas a partir de sustantivos, pero no dejan en claro cuáles son esas declaraciones.

Por ejemplo, "foo & bar" podría interpretarse aceptando sólo páginas en las dos condiciones siguientes son verdaderas:

  1. La página contiene un elemento que coincida con "foo".
  2. La página contiene un elemento que coincide con "barra".

La consulta "foo | bar" podría ser interpretada para evaluar las condiciones anteriores y aceptar cualquier página donde cualquiera de estas condiciones es cierto, pero también podría interpretarse como que implica una única condición:

  1. Este La página contiene un elemento que coincide con "foo" o "bar".

Tenga en cuenta que en la simple | caso "foo bar" que no importa qué interpretación se elegía, pero teniendo en cuenta "foo & moo | bar", que sería imposible adoptar esta última interpretación para el operador | sin darle prioridad sobre el operador & a menos que uno interpretado en el sentido de foo & moo:

  1. Esta página contiene un elemento que coincide tanto con "foo" o "mu".

Si los argumentos a & comodines incluidos, tal interpretación podría ser significativo (por ejemplo foo* & *oot podría significar que un solo artículo debe comenzar con "foo" y termina con "oot", en lugar de lo que significa que la página tenía que tiene un elemento que comienza con "foo" y un elemento posiblemente diferente que termina en "oot"), pero sin tales comodines, no hay elementos que pueda contener ninguna página que coincida con "foo" y "moo", y por lo tanto no la página podría contener dicho artículo.

Quizás la solución sería tener operadores separados para unir elementos en lugar de unir páginas. Por ejemplo, si &&, &&! y || se unen a las páginas, mientras que &, &! y | se unen a las cosas que se ajustará, a continuación, foo && bar || moo && jar || quack && foo* | m* & *l &! *ll coincidiría con cada página que contiene "foo" y "bar", cada página que contiene tanto "mu "y" jar ", así como también cada página que contiene la palabra" quack "y también contiene una palabra que comienza con" foo ", o que comienza con" m ", termina con" l "y no termina con" ll ".

+0

mezcló 2 idiomas de consulta, el que coincide con el conjunto de páginas y el que coincide con el conjunto de tokens dentro del texto. Mi idea era simplemente sobre el conjunto de páginas y SQL, en cuyo caso no hay ambigüedad en la interpretación de "foo & moo | bar". El lenguaje de consulta de tokens puede necesitar prioridades y prioridades diferentes porque se trata de una pequeña cantidad de patrones de texto, Regex funciona bien para eso. Me gusta su idea de tener diferentes símbolos para operadores booleanos de 2 idiomas diferentes cuando se mezclan. – alpav

0

Irónicamente, en su primer ejemplo se utiliza implícitamente la AND con mayor prioridad, ya que

airline tickets bahama november 

es, sin duda, debe entenderse como, por ejemplo

.... WHERE transport = "AIR" AND target like "%bahamas%" AND month = "Nov" 

Esto expone muy bien la estupidez de su idea.

El punto es que siempre es posible hacer consultas que son más largas si los precedences son como son, y serían más cortos con precedencias alternativas. Al igual que sería posible crear expresiones aritméticas que podrían escribirse con menos paréntesis si la adición tuviera una precedencia mayor que la multiplicación. Pero esto en sí mismo no es razón suficiente para alterar el comportamiento.

+0

que olvidó O diciembre. Sin él, solo hay AND y la prioridad no importa. Tu respuesta es tonta – alpav

Cuestiones relacionadas