Смоделируйте уравнение в виде дерева - PullRequest
0 голосов
/ 16 июня 2011

Я хочу смоделировать уравнение в виде дерева на питоне. например:

x = exp(((-0.5)*((f/sqrt(d))**2)))

как мне это сделать? я хочу иметь возможность переключать ветви деревьев, удалить части дерева и т. д., а затем преобразовать его обратно в новое уравнение в текстовом виде.

Можете ли вы привести пример кода / библиотеки, которые могут это сделать?

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

Я зашел так далеко:

import compiler
import pprint
import parser
import ast
class Py2Neko(ast.NodeTransformer):
    def generic_visit(self, node):
        print type(node).__name__
        ast.NodeVisitor.generic_visit(self, node)

    def visit_Name(self, node):
        print 'Name :', node.id

    def visit_Num(self, node):
        print 'Num :', node.__dict__['n']

    def visit_Str(self, node):
        print "Str :", node.s

    def visit_Print(self, node):
        print "Print :"
        ast.NodeVisitor.generic_visit(self, node)

    def visit_Assign(self, node):
        print "Assign :"
        ast.NodeVisitor.generic_visit(self, node)

    def visit_Expr(self, node):
        print "Expr :"
        ast.NodeVisitor.generic_visit(self, node)

if __name__ == '__main__':
    node = ast.parse("res= exp(((-0.5*one)*((delta_w*one/delta*one)**2)))")

    # print ast.dump(node)
    v = Py2Neko()
    v.visit(node)

Теперь он печатает все узлы дерева. Однако я хочу иметь возможность переключать ветви, удалять ветви, вставлять ветви и менять операторы / операнды. Мне это нужно, потому что я хочу иметь возможность изменять дерево случайным образом.

Ответы [ 3 ]

1 голос
/ 16 июня 2011

Операторы и функции являются родительскими узлами, а операнды - листьями.

x = exp(((-0.5)*((f/sqrt(d))**2)))

Начните с нисходящего подхода: [operator {operand1, operand2}]

[ = { x, exp(((-0.5)*((f/sqrt(d))**2))) }]

с последующим:

[ = { x, [ * { exp(((-0.5), ((f/sqrt(d))**2))) }] }]

тогда:

[ = { x, [ * { [ exp { -0.5 }],  [ ** { f/sqrt(d)), 2 }] }] }]

Вы поняли идею.

Эта ссылка может быть вашим ответом.

0 голосов
/ 16 июня 2011

То, что вы хотите, это строить и работать с деревьями разбора. Помимо встроенного синтаксического анализа, если ваши уравнения выходят за пределы собственного синтаксиса python, взгляните на этот обзор , который может быть устаревшим. Там много вариантов.

0 голосов
/ 16 июня 2011

PyParsing должен быть в состоянии помочь вам.(Я предполагаю, что ваше уравнение не обязательно использует сам синтаксис Python, строго говоря.)

...