我遇到了以下F#示例,發現它很有趣。Clojure與F的符號數學計算#
http://www.codeproject.com/KB/net-languages/SymbolicCalcInFS.aspx
Clojure的是否有做這樣的事情輕鬆的語言/圖書館設施?如果這可以讓事情變得更簡單,那麼強制使用波蘭公式表示法是可以的。
謝謝,並讓我知道是否有問題。
我遇到了以下F#示例,發現它很有趣。Clojure與F的符號數學計算#
http://www.codeproject.com/KB/net-languages/SymbolicCalcInFS.aspx
Clojure的是否有做這樣的事情輕鬆的語言/圖書館設施?如果這可以讓事情變得更簡單,那麼強制使用波蘭公式表示法是可以的。
謝謝,並讓我知道是否有問題。
我還沒試過,但Clojuratica看起來很有趣。
我對Clojure瞭解不多,但至少在這裏有一些提示。
的關鍵功能,使F#代碼好的是圖案代數數據類型匹配。代數數據類型例如是Expression
類型(用於表示數學表達式)的聲明,並且模式匹配是match
構造,用於在實現簡化或區分時檢查各種已知情況。
我不認爲Clojure有任何內置的模式匹配支持,但它可以作爲一個庫來實現。一個看起來很有趣的圖書館是patter-match module(在Clojars中)。這是一個使用它的例子to implement algebraic evaluator(這非常接近F#文章)。
F#文章中出現的另一件事是活動模式(它允許您聲明和重用模式)。我不認爲有這樣的Clojure庫,但考慮到語言的靈活性,它應該也可以實現它們(但是,它們在F#文章中並不是必需的)
Lisp has象徵性計算曆史悠久。見Peter Norvig的the AI case study book。 Lisp提供了很多偉大的語言功能來抽象符號上的常用操作。有時你可以寫出真正簡潔的代碼(比F#更簡潔/更短)。
像F#這樣的靜態語言在數據類型上具有強類型系統和方便的模式匹配。編譯器可以發現類型系統捕獲的錯誤,例如,沒有考慮一個特例。考慮數據的類型也可以減少運行時錯誤的機率。 F#中的類型推斷也使得F#代碼非常簡潔。
爲PAIP +1,一直在閱讀它兩週,這是偉大的迄今 – spacemanaki 2010-10-04 19:04:43
符號差異化是lisp的第一個應用之一!
我做了一個關於簡單的符號差異的博文。它只處理+和*,但它很容易擴展。
這是我寫的一個系列文章的一部分,它介紹初學者在倫敦召開的一次會議上介紹clojure,以展示clojure操縱自己的代碼是多麼容易。
當然可愛的東西是做了差異化,代碼可以編譯!因此,您可以生成用戶輸入的不同版本,或生成函數及其派生的宏等。
原來是在這裏,和很好的語法高亮:
http://www.learningclojure.com/2010/02/clojure-dojo-4-symbolic-differentiation.html
但是我在這裏發佈的代碼,所以你可以看看:
;; The simplest possible symbolic differentiator
;; Functions to create and unpack additions like (+ 1 2)
(defn make-add [ a b ] (list '+ a b))
(defn addition? [x] (and (=(count x) 3) (= (first x) '+)))
(defn add1 [x] (second x))
(defn add2 [x] (second (rest x)))
;; Similar for multiplications (* 1 2)
(defn make-mul [ a b ] (list '* a b))
(defn multiplication? [x] (and (=(count x) 3) (= (first x) '*)))
(defn mul1 [x] (second x))
(defn mul2 [x] (second (rest x)))
;; Differentiation.
(defn deriv [exp var]
(cond (number? exp) 0 ;; d/dx c -> 0
(symbol? exp) (if (= exp var) 1 0) ;; d/dx x -> 1, d/dx y -> 0
(addition? exp) (make-add (deriv (add1 exp) var) (deriv (add2 exp) var)) ;; d/dx a+b -> d/dx a + d/dx b
(multiplication? exp) (make-add (make-mul (deriv (mul1 exp) var) (mul2 exp)) ;; d/dx a*b -> d/dx a * b + a * d/dx b
(make-mul (mul1 exp) (deriv (mul2 exp) var)))
:else :error))
;;an example of use: create the function x -> x^3 + 2x^2 + 1 and its derivative
(def poly '(+ (+ (* x (* x x)) (* 2 (* x x))) 1))
(defn poly->fnform [poly] (list 'fn '[x] poly))
(def polyfn (eval (poly->fnform poly)))
(def dpolyfn (eval (poly->fnform (deriv poly 'x))))
;;tests
(use 'clojure.test)
(deftest deriv-test
(testing "binary operators"
(is (= (let [m '(* a b)] [(multiplication? m) (make-mul (mul1 m) (mul2 m))]) [true '(* a b)]))
(is (= (let [m '(* a b)] [(addition? m) (make-add (add1 m) (add2 m))]) [false '(+ a b)])))
(testing "derivative function"
(is (= (deriv '0 'x) '0))
(is (= (deriv '1 'x) '0))
(is (= (deriv 'x 'x) '1))
(is (= (deriv 'y 'x) '0))
(is (= (deriv '(+ x x) 'x) '(+ 1 1)))
(is (= (deriv '(* x x) 'x) '(+ (* 1 x) (* x 1))))
(is (= (deriv '(* x x) 'y) '(+ (* 0 x) (* x 0))))
(is (= (deriv '(* x (* x x)) 'x) '(+ (* 1 (* x x)) (* x (+ (* 1 x) (* x 1)))))))
(testing "function creation: d/dx (x^3 + 2x^2 + 1) = 3x^2 + 4x "
(let [poly '(+ (+ (* x (* x x)) (* 2 (* x x))) 1)]
(is (= ((eval (poly->fnform poly)) 3) 46))
(is (= ((eval (poly->fnform (deriv poly 'x))) 3))))))
好了,現在的Clojure提供了強大的模式匹配庫:
是的,一個系統,如您現在描述上存在Clojure的!它不過是格里蘇斯曼的同伴系統,而他的智慧的--SICM(經典力學的結構和解釋)一書。對於Clojure,它被命名爲sicmutils,並由Colin Smith移植。
我在別處簡單描述了它 - https://stackoverflow.com/a/41646455/4070712 - 但總而言之,它確實做了F#文章提到的四件事情,即,
和其他更多的
1)分化(全部分分化支持)
> (defn ff [x y] (* (expt x 3)(expt y 5)))
> ((D ff) 'x 'y) ==> (down (* 3 (expt x 2) (expt y 5)) (* 5 (expt x 3) (expt y 4)))
> ;; i.e. vector of results wrt to both variables
NB。兩種類型的載體支持,「向上」和「向下」,以適應協變和逆變表達
2)表達的簡化:哦,是的......
> (def unity (+ (square sin) (square cos)))
> (unity 'x) ==> 1 ;; yes we can deal with symbols
3)格式:表達式可以在TeX中呈現爲美麗的展示。 我不能在這裏輕鬆展示,但目前正在開發中,使用Clojure的「Gorilla」作爲楓式風格的筆記本電腦/工作休息室。
4)解析:很明顯。表達式和函數之間的轉換是系統的核心部分。
看一看https://github.com/littleredcomputer/sicmutils。你甚至不需要Clojure來運行它,你可以使用提供的Java jar文件。
Clojars不是圖書館,而是Clojure圖書館的回購:http://clojars.org/ – 2010-10-04 07:39:05
@Matti:感謝您的更正! (我更正了我的答案) – 2010-10-04 12:12:18