Перепишите логическое выражение без скобок

У меня есть система обработки черного ящика, которая принимает логические выражения, но не поддерживает круглые скобки. Я хочу ввести такое логическое выражение:

A && (B || C)

Однако, когда я ввожу его как:

A && B || C

он оценивает выражения, как если бы я ввел:

(A && B) || C

Есть ли способ переписать мое выражение, чтобы получить желаемое поведение A && (B || C) без скобок? Спасибо!


person random-angular-questions    schedule 30.01.2018    source источник


Ответы (2)


Существует связь между приоритетом, но вы можете использовать ассоциативные и распределительные законы, чтобы решить эту проблему.

A && B || A && C

Таблицы истинности совпадают.

Будьте осторожны при реализации этого. Не все компиляторы и языки используют одинаковый приоритет и порядок оценки.

person IvanGrasp    schedule 30.01.2018

Изменить: нет приоритета левого и правого, извините.

Используйте закон о дистрибуции и приоритет && для проверки если оба A и B истинны или оба A и C истинны.

Решение

A && B || A && C

Распределительное право

x ^ (y v z) = (x ^ y) v (x ^ z)

x && (y || z) = (x && y) || (x && z)

function original(A, B, C) {
  return A && (B || C);
}

function mySolution(A, B, C) {
  return A && B || C && A;
}

console.log(original(true, true, true) == mySolution(true, true, true));
console.log(original(true, true, false) == mySolution(true, true, false));
console.log(original(true, false, true) == mySolution(true, false, true));
console.log(original(true, false, false) == mySolution(true, false, false));
console.log(original(false, true, true) == mySolution(false, true, true));
console.log(original(false, true, false) == mySolution(false, true, false));
console.log(original(false, false, true) == mySolution(false, false, true));
console.log(original(false, false, false) == mySolution(false, false, false));

person Matt Goodrich    schedule 30.01.2018
comment
хотя мне нравится ваша идея, таблицы истинности не совпадают - вот онлайн-генератор таблиц истинности - web.stanford.edu/class/cs103/tools/truth-table-tool, если вы введете мое исходное выражение, а затем ваше, значения для выходных данных будут другими - person random-angular-questions; 30.01.2018
comment
Изначально я был неправ, но нашел решение, протестировав. Похоже, что @IvanGrasp одновременно нашла то же самое. - person Matt Goodrich; 30.01.2018
comment
Но этот оценщик, вероятно, не выполняет приоритет слева направо. - person the4thamigo_uk; 30.01.2018