【问题标题】:Symbolic & Numeric Calculation符号和数值计算
【发布时间】:2015-02-25 19:00:24
【问题描述】:

我是一名计算机科学专业的学生,​​上学期我们学会了用 Prolog 编程。现在我正试图从中获得乐趣。 我正在尝试构建一个给定符号/数学输入的程序,它会返回结果。 示例:

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

这是sn-p(用于+操作)

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.

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

【问题讨论】:

标签: prolog logic


【解决方案1】:

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

【讨论】:

  • 感谢资源,我想我会尝试了解库 clpfd 是如何实现的,并使用@lurker 提供的源代码实现我的解决方案。我将尝试将我的结果作为学生在作业中给出的解决方案来呈现。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-03
  • 1970-01-01
  • 2018-05-12
  • 1970-01-01
相关资源
最近更新 更多