符号和数值计算

Symbolic & Numeric Calculation

我是一名计算机科学专业的学生,​​上学期我们学习了使用 Prolog 编程。现在我想从中获得乐趣。 我正在尝试构建一个给定 symbolic/mathematical 输入 return 结果的程序。 示例:

? solve(2+3+Z+K+5+Z+1, R).
R = 11+2*Z+K or R = 11+Z+K+Z

这是代码片段(用于 + 操作)

solve(X, R) :-
    eval(X, R).

eval(X, X) :- var(X),!.
eval(X, X) :- number(X), !.  
eval(+(X, Y), R) :-
    eval(X, A),
    eval(Y, B),
    add(A, B, R), !.

add(A, B, R) :-
    number(A),
    number(B),
    !,
    R is A + B.
add(A, B, A+B) :-
    var(A); var(B),!.
add(A+X, B, R+X) :-
    number(A),
    number(B),
    var(X),
    !,
    R is A + B.
add(X+A, B, R+X) :-
    number(A),
    number(B),
    var(X),
    !,
    R is A + B.

当数字被许多变量分隔时,我遇到了一些问题,例如:

? solve(5+Z+5+4+K+Z+6, R).
FALSE.

或者,(不是上面的源代码),如果数字被许多变量分隔,它们不是 "processed",例如:

? solve(5+Z+K+7, R).
R = 5+Z+K+7.

感谢您的帮助,如有任何建议或参考,我们将不胜感激。

这比您的代码目前所做的要复杂一些。最后,你似乎想要一个符号方程的求解器,是这样吗?因此,例如,如果您在 Wolfram Alfa 中输入您的等式 2+3+Z+K+5+Z+1 = R,您将得到答案 K+2 Z+11 = R.

例如 metafont 提供了类似的功能:

$ mf
This is METAFONT, Version 2.7182818 (TeX Live 2014) (preloaded base=mf)
**\relax

*tracingequations:=tracingonline:=1;

*2+3+a+b+5+a+1=r;
## a=0.5r-0.5b-5.5

*x^2+3=0;
## x^2=-3

...我猜每个程序都像 Matlab、Mathematica 等

在 Prolog 中,对于整数,如果您使用 library(clpfd):

,您可以免费获得非常相似的东西
?- use_module(library(clpfd)).
true.

?- 2 + 3 + Z + K + Z + 1 #= R.
2*Z+K+ -1*R#= -6.

如果您想自己对此进行编程,您可能应该首先决定要如何表示您的答案:如您所见,此处演示的三个程序选择了不同的方法。从那里,您可以自己尝试看看如何实现(请参阅@lurker 的评论),或者尝试弄清楚其他人是如何实现它的。