Что-то вроде этого может быть?
string previous = string.Empty;
while (b != previous)
{
previous = b;
b = b.Replace("true and false", "false");
b = b.Replace("true and true", "true");
b = b.Replace("false and true", "false");
b = b.Replace("false and false", "false");
b = b.Replace("false or false", "false");
b = b.Replace("true or false", "true");
b = b.Replace("true or true", "true");
b = b.Replace("false or true", "true");
b = b.Replace("(false)", "false");
b = b.Replace("(true)", "true");
b = b.Replace("not false", "true");
b = b.Replace("not true", "false");
}
Обратите внимание, что спецификация допускает неоднозначные формулировки, такие как эти:
"false and false or true"
"false and true or true"
Оба эти выражения имеют значение "true", если и вычисляются первыми, и "false", если или вычисляются первыми. Следовательно, требовать круглых скобок на каждом уровне было бы лучше. Требование оценки слева направо является еще одним вариантом, но это делает код немного более сложным.
Для тех из вас, кто может возражать против такого стиля решения для этого типа проблемы, помните, что некоторые математики считают, что вся математика может быть сведена к такого рода символьной манипуляции. сказано , что одна из основных критических замечаний Principia Mathematica * Рассела и Уайтхеда заключается в том, что в него входят формулы, имеющие слишком большое значение.