2011-07-16 70 views
4

在數學,我想一起做東西線:我可以自動懶惰地評估Mathematica中的函數參數嗎?

f[Rational[a_, b_], Rational[c_, d_]] := {a+c, b+d} 

但是,如果我用下面的形式表達評價它,我得到錯誤的結果:

In: f[Rational[50, 100], Rational[4, 10]] 
Out: {3, 7} 
(* Expected: 54/110 -> 27/55 *) 

有任何方式我可以強制Mathematica立即停止簡化表達式?我可以對所通過的任何東西進行保留,然後讓問題的功能在任何通過的內容上調用ReleaseHold [..]。

雖然這個解決方案非常難看,但我不想必須這樣做。我知道Mathematica中的一些函數會自動保存通過的任何函數,並且由於某種原因延遲評估它,我想在此處執行此操作。

簡而言之:如何強制Mathematica懶惰地評估某些東西被傳入函數而不必手動持有它?

回答

5

在標準評估程序中,函數的每個參數依次進行評估。這可以通過設置HoldFirst,HoldRest和HoldAll屬性來防止。這些屬性使得Mathematica以一種未評估的形式「保留」特定的參數。

http://reference.wolfram.com/legacy/v5/TheMathematicaBook/PrinciplesOfMathematica/EvaluationOfExpressions/2.6.5.html

例如

文檔說任何自動召開參數自動計算你在函數體中使用它們的第一次。但是,如果由於某種原因,您希望繼續使用保留表單中的參數(例如,如果您想對錶達式的未評估形式進行模式匹配和重寫),那麼也許您可以將其重寫爲Hold它。

1

使用HoldAll屬性ninjagecko提到我能夠制定一個解決方案。

有竟是怎麼回事,我是不是能夠立即看到另一個問題。具體來說,我的功能不是我認爲的模式匹配。

我想我最初的問題,只是認爲,數學是自動簡化我的表情,我需要延遲計算傳遞的參數正確的行爲。

在現實中,我忘了,有代表Mathematica表達式的多種方式。作爲玩具的例子考慮下面的函數,提取一個分數的分子和分母:

ExtractNumDem[Fraction[a_, b_]] := {a, b} 
(* Already incorrect, ExtractNumDem[4/100] gives {1, 25} *) 

只需添加手提袋(或者HoldFirst偶數)在另一個問題屬性的結果:

SetAttributess[ExtractNumDem, HoldAll]; 
ExtractNumDem[4/100] (* Gives ExtractNumDem[4/100] *) 

表達4/100實際上是評估爲Times[4, Power[100, -1]]。要解決此第二個問題,我不得不添加一個定義的部分看起來像:

ExtractNumDem[Times[a_, Power[b_, -1]] := {a, b} 
ExtractNumDem[4/100] (* Now gives {4, 100} *) 

我的解決方案在我原來的答覆固定發佈應用完全相同的原則。下面是一些代碼,可以看到我遇到的問題:

ClearAll[ExtractNumDem] 

ExtractNumDem[Rational[a_, b_]] := {a, b} 
ExtractNumDem[4/100] 

SetAttributes[ExtractNumDem, HoldAll]; 
ExtractNumDem[4/100] 

ExtractNumDem[Times[a_, Power[b_, -1]]] := {a, b} 
ExtractNumDem[4/100]