我的問題是關於在書中具體語義練習2.11(http://concrete-semantics.org/):伊莎貝爾書練習2.11:轉型表達式多項式形式
定義超過整數 (類型int
)作爲數據類型的變量算術表達式:
datatype exp = Var | Const int | Add exp exp | Mult exp exp
定義一個函數eval :: exp => int => int
使得eval e x
在 x的值的計算結果即 多項式可以表示爲係數列表,從 開始。例如,[4,2,-1,3]表示多項式4+2x-x^2+3x^3
。
定義一個函數evalp :: int list => int => int
,其計算給定值的多項式 。定義將 表達式轉換爲多項式的函數coeffs :: exp => int list
。這可能需要輔助功能。證明 coeffs保留表達式的值:evalp (coeffs e) x = eval e x
。
---結束
,直到你得到coeffs
這一切都非常簡單。我們不得不處理像(X + X)*(2*X + 3*X*X)
這樣的表達式,它必須使用分配律自底向上遞增擴展,直到它以多項式形式出現。由此產生的表達式可能仍然是類似於(X*X + X*2*X + 3*X*X + 4*X*X*X)
的東西,因此它有必要對產品條款進行規範化(例如X*2*X
變成2*X*X
),像條款一樣收集起來,最後按順序遞增排列!這似乎比迄今爲止的任何練習都要複雜得多,我不知道我是否錯過了一些東西或者過於複雜。