Знаете мне очеь понравился ваш ход решения:
def is_prop_formula(string):
def reduce(string):
result = re.sub("\(?&[A-Z]\)?|\(?[A-Z]>[A-Z]\)?|\(?[A-Z]<[A-Z]\)?|\(?[A-Z]=[A-Z]\)?|\(?[A-Z]_[A-Z]\)?|\([A-Z]\)", "X", string)
if result != string:
return reduce(result)
return result
return reduce(string) == "X"
Я всё пытаюсь разобратся в re.sub и в reduce , но у меня ничего не вышло, хелпы мне непомогают, в них что-то совсем непонятное наисано.
Что толком делают эти функции?
И кстати reduce у меня требует 2 аргумента, а вы емё предоставили 1.
Да и ещё это решение
In [1]: is_prop_formula("(A=B)>(&C<D)=C=T>Z")
Out[1]: True
In [2]: is_prop_formula("+(A=B)>(&C<D)=C=T>Z")
Out[2]: False
Во первых, скольно уже не переситываю хелпы и ту документацию, практически ничего я понять не могу. Почему ваша функция reduce работает с 1 переменной в функции а по одиночке не работает, и что толком делает re.sub.
Ну это ладно ещё, просто решение не верно
Т.к мы делаем функцию без правила экономии скобок( это условие)
Формуля является формулой только если
1. Неизвестные в ней являются символами определённого алфавита( ранее заданого)( но это не сложно написать)
2.Эти символы могут создавать формулу только таким способом
(&X), (X>Y), (X<Y),(X=Y),(X_Y) # насколько я понял вы опрераруете такими символами ?,&,\,-,| но я как не старался не смог оределить что из них что.
3. Вмето переменных можно поставить другую формулу, только в том случае если эта форула которую мы вставляем справедлива.
тоесть выражение вида (A=B)>(&C<D)=C=T>Z") будет являтся ошибкой.
Т.к. (&C) надо обязательно брать в скобки. И нельзя записать С=Т>Z
Если исправить:
(((A=B)>((&C)<D))=(C=(T>Z))) вот теперь правильно.
ТОесть я
1. Поставил самые большие внешние скобки
2. поставил скобки там где есть чтото типа С=К=Р.
3. взял скобки выражение (&C)
Я думаю что это можно задать, и думаю я смогк
Только обьясните мне принцип работы этой программы
def is_prop_formula(string):
def reduce(string):
result = re.sub("\(?&[A-Z]\)?|\(?[A-Z]>[A-Z]\)?|\(?[A-Z]<[A-Z]\)?|\(?[A-Z]=[A-Z]\)?|\(?[A-Z]_[A-Z]\)?|\([A-Z]\)", "X", string)
if result != string:
return reduce(result)
return result
return reduce(string) == "X"