我正在写一个小的计算机代数系统,它允许基本的算术运算和根式。因此表达式是二叉树,其中内部节点是运算符+ - * / ^,叶是有理数。现在,像其他CAS一样,我希望简化表达式,例如
(5+sqrt(2)+sqrt(8)) / (1+sqrt(2)) = 1 + sqrt(8)如果从左侧开始,就不能很明显地将其重写到RHS中。那么其他CAS如何做到这一点呢?有没有这些表达式的范式,使得每个表达式都可以唯一地写成范式?有没有一种确定性的算法,可以将任何表达式重写成范式?
发布于 2014-10-05 06:22:11
我不知道CAS是如何建立的,但我认为简化过程可以通过状态空间搜索来完成。你可以有一套如何将一个表达式转录成另一个等效表达式的规则。这些规则的应用是搜索图中的边,节点是表达式树。然后,您可以搜索此图以找到最小的可能树(或者足够小,或者可能是不能进一步应用规则的树)。
一个更简单的任务可能是区分过程,它实际上只应用规则,而不需要(几乎)实际进行任何搜索。它可以非常简单的用prolog编写(尽管我从来没有做过,只有我们大学的prolog老师告诉我们)。
https://stackoverflow.com/questions/26197709
复制相似问题