Сравнение выражений rpn (postfix) на эквивалентность

Как можно сравнить любые два выражения с постфиксной нотацией на предмет эквивалентности?

В простейшем примере foo(a, b) возвращает True для

a = [3, 5, 'MUL']

b = [5, 3, 'MUL']

Как будет выглядеть foo() в питоне? Я предполагаю, что один из способов - оценить оба выражения и как-то нормализовать их. Я ожидаю, что это четко определенный процесс, но еще не нашел его.

Редактировать 1:

Это был плохо сформулированный вопрос. Я постараюсь привести лучшие/больше примеров и благодарю вас за терпение, поскольку я пытаюсь задать вопрос четко и точно.

expr1 = [a, b, 'MUL']

expr2 = [b, a, 'MUL']

OR

expr1 = [a, b, 1, 'ADD', 'MUL']

expr2 = [a, b, 'MUL', a, 'ADD']

person Vishal    schedule 02.07.2018    source источник
comment
У вас есть функция, которая вычисляет нотацию? или вы просите здесь кого-то помочь вам создать код и для этого?   -  person Vincent Pakson    schedule 02.07.2018
comment
У меня есть код для оценки постфиксного выражения. Добавление к исходному вопросу, если это полезно.   -  person Vishal    schedule 02.07.2018
comment
Вы можете добавить больше примеров?   -  person Vikas P    schedule 02.07.2018
comment
Вычисление выражения и определение эквивалентности на основе вывода одного набора возможных параметров не кажется надежным (и мне нечем подтвердить это утверждение). Добавление дополнительных оценок увеличит время, необходимое, если мне нужно будет сделать много таких сравнений. Есть ли другой способ подумать об этой проблеме/решении?   -  person Vishal    schedule 02.07.2018


Ответы (2)


Здесь я попробовал вашу проблему с решением, оно работает, если у вас есть больше вариантов, которые вы можете добавить:

a = [3, 5, 'MUL']
b = [5, 3, 'MUL']


def postfix_calc(value, z):
    return {
        'MUL': lambda c: a[0]*a[1],
        'ADD': lambda c: a[0]+a[1],
        'SUB': lambda c: a[0]-a[1],
        'DIV': lambda c: a[0]/a[1]
    }.get(value)(z)


def foo(x, y):
    val1 = postfix_calc(x[2], x)
    val2 = postfix_calc(y[2], y)
    if val1 == val2:
        return True
    else:
        return False


print(foo(a,b))
person Vikas P    schedule 02.07.2018

Поскольку у вас уже есть постфиксная оценка. вы могли бы иметь это как это тогда.

foo(a,b):
    res_a = postfix(a)
    res_b = postfix(b)
    if res_a = res_b:
         return True
    return False

Я думаю, что это самое простое решение, которое вы ищете?

person Vincent Pakson    schedule 02.07.2018