2014-09-01 66 views
3

我編寫了一個Prolog程序來解決簡單的三角方程。我寫它來獲取三角函數的值。例如,我可以獲得值sin(45),但我無法將sin(45)的值分配到術語sin(45)。我嘗試了=,==,=:=運營商,但他們沒有工作。實際上,我想將sin(45)的值傳遞給程序的下一個代碼,而不是術語sin(45)。 謝謝...在序言中將sin函數的答案分配給術語sin(X)

回答

0

我學習和理解,值不能被分配使用=一個術語, ,===:=類似過程語言。當我們使用這個運算符時,prolog只是比較兩個值。因此,我們應該通過 值作爲參數。作爲一個例子,

isolax(1,sin(U) = V,U = R):- 
    getasin(V,R). 

getatan(X,R):-R is atan(X). 

即使我們不定義爲獲得罪孽,餘弦,正切,序言答案爲罪,餘弦,正切自動事實或規則。

+0

這不是一個完全準確的答案。 '=/2'運算符將*統一*這兩個參數。它可以有比較的效果,但它也可以有分配的效果。'is/2'的用途是專門爲右側的算術表達式分配給左側的變量。 – lurker 2014-12-10 17:13:13

4

算術通過一些專門的內建進行的,像is/2,或(<)/ 2,即評估他們的右手項作爲表達,並用左手統一的數值手邊。最常見的用法是在

?- X is sin(pi/2). 
X = 1.0. 

音符值分配給一個免費變量,像罪/參數1它的弧度。評估之後,您將現在綁定到數值的變量傳遞給下一個代碼。

1

prolog中的複合詞(「functors」或「structures」)沒有任何數值「值」。 Prolog的算術引擎不計算值「分配」這樣的術語,它只是使用所計算出的值作爲外操作參數 或界定的計算值給一個變量(如「是」內置謂詞一樣)

Y is sin(45), ... % Y is now now bound to the numeric result of sin(45), do with Y what you whant 

如果你想令自己不要忘記罪(45), 您可以創建其他參數其他項的值的成因,例如

Y is sin(45), MyTerm=funcresult(sin,45,Y), ... % then pass MyTerm wherever you whant or return it to the caller 

MyTerm的消費者可以再統一

MyTerm= funcresult(F,X,Y), 

,並同時獲取函數名(F = SIN),並用結果本身沿參數(X = 45)(Y)

你甚至可以

assert(funcresult(sin,X,Y)) 

,並提供一個數據庫對於所有已計算的函數值(不要忘記

:-dynamic(funcresult/3). 

指令在這種情況下)。

還要注意,罪()通常接受弧度,沒有等級,所以罪(45)也許得到的東西,你不要指望