Система, представленная ниже, еще не поддерживает комбинаторику, хотя их добавление не будет огромным усилием, множество хорошего кода уже существует, и это может быть хорошей платформой для его внедрения, поскольку основы довольно хороши. Я надеюсь, что короткий штекер здесь неуместен, это единственный серьезный Clojure CAS, о котором я знаю, но эй, что за система ...
=======
Читателям этой ветки может быть интересно, что система scmutils Джерри Суссмана переносится на Clojure.
Это очень продвинутый CAS, предлагающий такие вещи, как автоматическое дифференцирование, литеральные функции и т. Д., В стиле Maple .
Он используется в MIT для продвинутых программ по динамике и дифференциальной геометрии, а также для электротехники. Это также система, используемая в «продолжении» Sussman & Wisdom (LOL) для SICP , SICM (Структура и интерпретация классической механики).
Хотя изначально это была программа Scheme, это не прямой перевод, а предварительное переписывание, чтобы воспользоваться всеми преимуществами Clojure. Он был назван sicmutils , как в честь оригинала, так и книги.
Это превосходное усилие - работа Колина Смита, и вы можете найти его в https://github.com/littleredcomputer/sicmutils.
Я полагаю, что это может составить основу удивительной Системы компьютерной алгебры для Clojure, конкурирующей со всем, что доступно. Как вы можете себе представить, это довольно большой зверь, и тонны вещей еще предстоит перенести, основы в значительной степени присутствуют, система будет дифференцироваться и довольно хорошо справляться с литералами и буквальными функциями. Это работа в процессе. Система также использует «общий» подход, поддерживаемый Суссманом, в соответствии с которым операции могут применяться к функциям, создавая отличную абстракцию, которая упрощает запись без конца.
Вот дегустатор:
> (def unity (+ (square sin) (square cos)))
> (unity 2.0) ==> 1.0
> (unity 'x) ==> 1 ;; yes we can deal with symbols
> (def zero (D unity)) ;; Let's differentiate
> (zero 2.0) ==> 0
SicmUtils представляет два новых векторных типа «вверх» и «вниз» (так называемые «структуры»), они работают в значительной степени так, как вы ожидаете векторы, но имеют некоторые специальные математические (ковариантные, контравариантные) свойства, а также некоторое программирование свойства в том, что они исполняемые!
> (def fnvec (up sin cos tan)) => fnvec
> (fnvec 1) ==> (up 0.8414709848078965 0.5403023058681398 1.5574077246549023)
> ;; differentiated
> ((D fnvec) 1) ==> (up 0.5403023058681398 -0.8414709848078965 3.425518820814759)
> ;; derivative with symbolic argument
> ((D fnvec) 'θ) ==> (up (cos θ) (* -1 (sin θ)) (/ 1 (expt (cos θ) 2)))
Частичное дифференцирование полностью поддерживается
> (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
Система также поддерживает вывод TeX, полиномиальную факторизацию и множество других вкусностей. Однако многие вещи, которые можно было бы легко реализовать, не были сделаны исключительно из-за нехватки людских ресурсов. Графический вывод и интерфейс «блокнот / рабочий лист» (с использованием Clojure's Gorilla) также работают над этим.
Надеюсь, это каким-то образом спровоцировало ваш аппетит, чтобы зайти на сайт и привести его в движение. Вам даже не нужен Clojure, вы можете запустить его из предоставленного файла JAR.