Prolog表达式简化

3

我是Prolog的新手,需要为微积分课程编写一个符号微分工具。我已经使其按照以下方式运行:

?- diff(ln(x^3),D).
D = 1*3*x^(3-1) / x^3 ;

并且:

?- diff(x*x*x*x,D).
D = x*x*x*1+x*(x*x*1+x*(x*1+x*1)).

虽然这种方法可行,但我更愿意改成这样:

D = 3x^(-2) / x^3;

并且:

D = 4x^(3);

有没有一种简单的方法来简化这些数学表达式。谢谢!

你需要编写一些简化谓词。例如,simp(1*X, X)。你可以使用 number(X),如果 X 是一个数字,则成功。所以 simp(X*Y, Z) :- number(X), number(Y), Z is X*Y. 等等。 - lurker
如果您需要,我有一些可用的代码(SIMPSV.PRO,由Sergio Vaghi于1987年编写)。我认为您也可以在互联网上查找它。 - CapelliC
感兴趣的内容:GitHub - wjur/sym-diff-prolog - Guy Coder
感兴趣的内容:SYMDIFF。大部分代码来自于《Prolog艺术》一书,但该人并未在代码中注明。请谨慎使用,因为它存在重大问题。 - Guy Coder
D = 1*3*x^(3-1) / x^3 is different from D = 3x^(-2) / x^3. Should be D = 3x^(2) / x^3 - Rafalon
显示剩余6条评论
1个回答

0

你可以在编译时使用goal_expansion/2来实现这个功能:

goal_expansion(+, -). 

跟随Prolog - 简化导数

例子:

goal_expansion(X,Y):-simplify(X,Y).

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接