Мне бы хотелось общее решение для преобразования строк с префиксной нотацией в кортежи. Вот три примера ниже, которые иллюстрируют то, чего я надеюсь достичь. Каждая строка является элементом в списке (только во втором примере имеется более одного элемента).
['neg(or(p,q))']
['imp(p,q)', 'imp(neg(r),neg(q))']
['and(and(p,q),r)']
Становится
[('neg',('or','p','q'))]
[('imp','p','q'), ('imp',('neg','r'),('neg','q'))]
[('and',('and','p','q'),'r')]
В более общем смысле, желаемый формат: ('соединительный',' параметр ',' параметр '), где соединительными могут быть' и ',' или ',' iff ',' imp ',' neg '. Затем за каждым из них следуют два параметра, за исключением «neg», которое принимает только один. Параметры могут быть другими кортежами, как показано выше в примерах, которые демонстрируют вложенные формулы.
Другой способ взглянуть на это с помощью формул, которые мотивировали проблему в первую очередь.
Пример. 1 ((p ∧ q) ∨ (¬p ∧ ¬q)) в конечном итоге становится
[('or',('and','p','q'),('and',('neg','p'),('neg','q')))]
Пр. 2 (p → q), (¬r → ¬q) в конечном итоге становится
[('imp','p','q'), ('imp',('neg','r'),('neg','q'))]
То, что я пробовал:
import re
def tuplify(raw_sequent):
first_split = re.split('\(', raw_sequent, 1)
connective = first_split[0]
second_split = re.split('\,', first_split[1])
right_arg = second_split[-1]
second_split = second_split[:-1]
left_arg = ','.join(second_split)
tup = (connective, left_arg, right_arg[:-1])
return tup
Однако это вообще не обобщает, толькоработая для ввода
'and(and(p,q),or(r))'
Я полагаю, что решение может потребовать комбинации регулярных выражений и рекурсии.