我是计算机科学专业的学生,在上学期我们学会了在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.
感谢您的帮助,任何建议或参考将不胜感激。
答案 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的评论),或试着弄清楚其他人是如何实现它的。