簡體   English   中英

符號和數值計算

[英]Symbolic & Numeric Calculation

我是計算機科學專業的學生,​​上學期我們學會了在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.

感謝您的幫助,任何建議或參考將不勝感激。

這比您的代碼目前正在做的事情要復雜得多。 最后,您似乎想要一個符號方程的求解器,是嗎? 因此,例如,如果您在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的評論),也可以嘗試弄清楚其他人如何實現它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM