象征性的数值计算

时间:2015-02-25 19:00:25

标签: prolog logic

我是计算机科学专业的学生,​​在上学期我们学会了在Prolog中学习。现在我正试着玩得开心。 我正在尝试构建一个程序,给出符号/数学输入它返回结果。 例如:

? 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.

或,(不是上面的源代码),如果数字由许多变量分隔,则它们不会被“处理”,例如:

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

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

1 个答案:

答案 0 :(得分:2)

这比您的代码目前所做的更为复杂。最后,你似乎想要一个符号方程的求解器,是这样的吗?例如,如果您输入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的评论),或试着弄清楚其他人是如何实现它的。