Когда булевы операторы используются для объединения логических операторов , оператор "и" должен иметь приоритет над "или". Я думаю, что путаница заключается в том, что многие языки запросов неявно формируют логические утверждения из существительных, но не ясно, что это за заявления.
Например, «foo & bar» может интерпретироваться, принимая только страницы, на которых выполняются оба следующих условия:
- Страница содержит элемент, который соответствует "foo".
- Страница содержит элемент, который соответствует "bar".
Запрос "foo | bar" может быть интерпретирован для оценки вышеуказанных условий и принятия любой страницы, где выполняется любое из условий, но он также может быть интерпретирован как включающий одно условие:
- Эта страница содержит элемент, который соответствует "foo" или "bar".
Обратите внимание, что в простом случае "foo | bar" не имеет значения, какую интерпретацию вы выбрали, но с учетом "foo & moo | bar" было бы невозможно принять последнюю интерпретацию для оператора |
без отдавая ему приоритет над оператором &
, если не интерпретировать foo & moo
как значение:
- Эта страница содержит элемент, который соответствует "foo" или "moo".
Если аргументы &
включают подстановочные знаки, такое толкование может быть значимым (например, foo* & *oot
может означать, что отдельный элемент должен начинаться с "foo" и заканчиваться "oot", а не означать, что страница имела иметь элемент, начинающийся с «foo» и, возможно, другой элемент, оканчивающийся на «oot»), но без таких подстановочных знаков, нет элементов, которые могла бы содержать любая страница, которые соответствуют «foo» и «moo», и, таким образом, ни одна страница не может содержать такой элемент.
Возможно, решение будет состоять в том, чтобы отдельные операторы объединяли элементы, а не соединяли страницы. Например, если &&
, &&!
и ||
присоединяются к страницам, а &
, &!
и |
объединяют элементы для сопоставления, тогда foo && bar || moo && jar || quack && foo* | m* & *l &! *ll
будет соответствовать каждой странице, содержащей оба " foo "и" bar ", каждая страница, которая содержит как" moo "и" jar ", так и каждую страницу, которая содержит слово" quack ", а также содержит слово, которое начинается с" foo "или начинается с" m " , заканчивается на "l" и не заканчивается на "ll".