我刚刚开始学习Prolog,这学期的作业是实现一个相当基础的d(function, variable, derivative)
函数,我的实现如下:
d(X,X,1) :- !.
d(C,X,0) :- atomic(C). %, (C \= X).
d(X**E,X,E*X**(E-1)).
d(U+V,X,A+B) :- d(U,X,A), d(V,X,B).
d(U-V,X,A-B) :- d(U,X,A), d(V,X,B).
d(U*V,X,DU*V+U*DV) :- d(U,X,DU), d(V,X,DV).
d(U/V,X,(DU*V-U*DV)/(V*V)) :- d(U,X,DU), d(V,X,DV).
我知道这并不完整,但它涵盖了练习中所需的所有任务。
然而,
?- d((x*x+2*x+3)/(3*x),x,R).
导致
R = ((1*x+x*1+ (0*x+2*1)+0)* (3*x)- (x*x+2*x+3)* (0*x+3*1))/ (3*x* (3*x)).
这看起来一点也不美观。 is/2 不喜欢我的 x,因为它不是一个数字...
有没有简单的解决方法可以实现更干净的结果?
is/2
是用于算术计算的,其中你知道变量的数值实例化情况,因此它不适用于这个目的。如果你想要更漂亮的结果,你需要创建一个谓词来简化表达式。 - lurker