我正在编写一个小型计算机代数系统,它允许基本的算术运算和激进。所以表达式是二叉树,其中内部节点是运算符+ - * / ^
,叶子是有理数。现在我想像其他CAS一样简化表达式,例如它是
(5+sqrt(2)+sqrt(8)) / (1+sqrt(2)) = 1 + sqrt(8)
如果从左侧开始,您可以将其重写到RHS中并不明显。那么其他CAS怎么做呢?这些表达式是否有正常形式,这样每个表达式都可以以正常形式唯一地写入?是否有确定性算法,将任何表达式重写为正常形式?
答案 0 :(得分:0)
我不知道如何制作CAS,但我认为简化程序可以通过状态空间搜索来完成。您可以拥有一组规则,如何将一个表达式转录为另一个表达式。这些规则的应用是搜索图中的边,节点是表达式树。然后,您可以搜索此图表以查找可能最小的树(或者足够小,或者可能无法进一步应用规则的树)。
更简单的任务可能是差异化过程,它实际上只是在没有(几乎)需要实际进行任何搜索的情况下应用规则。它可以非常容易地写在prolog中(尽管我从来没有这样做过,只有我们大学的prolog老师告诉我们)。