Библиотека Haskell, такая как SymPy?

Мне нужно манипулировать такими выражениями, как 1 + sqrt(3), и выполнять базовые арифметические действия, такие как сложение, вычитание и деление. Я хотел бы, чтобы результат был в какой-то канонической форме, чтобы его можно было использовать в качестве ключа на карте. Преобразование 1 + sqrt(3) в число с плавающей запятой невозможно из-за проблем с округлением.

Я использовал SymPy для этой задачи в Python. Есть ли эквивалентная нативная библиотека для Haskell?


person carlo_hamalainen    schedule 21.07.2010    source источник
comment
Вы хотите √2 - 1 == 1 / (√2 + 1)?   -  person kennytm    schedule 21.07.2010


Ответы (3)


Ознакомьтесь с пакетом numbers. Если все, что вам нужно, это хранить точные числа, такие как «1 + √3», вы можете использовать Data.Number.CReal вместо символьной арифметики. Он хранит выражения и может быть вычислен до произвольного количества цифр, когда это необходимо.

Prelude Data.Number.CReal> let cx = 1 + sqrt (3 :: CReal)
Prelude Data.Number.CReal> showCReal 400 cx 
"2.7320508075688772935274463415058723669428052538103806280558069794519330169088000370811461867572485756756261414154067030299699450949989524788116555120943736485280932319023055820679748201010846749232650153123432669033228866506722546689218379712270471316603678615880190499865373798593894676503475065760507566183481296061009476021871903250831458295239598329977898245082887144638329173472241639845878553977"

В пакете также есть модуль Data.Number.Symbolic, но в описании сказано: «В основном он полезен для отладки».

person kennytm    schedule 21.07.2010
comment
Однако CRreal не даст вам равенства, верно? Так что я бы подумал, что это недопустимо. - person sclv; 21.07.2010
comment
@sclv: он реализует CRreal, за исключением того, что это может занять бесконечно много времени, если все сделано правильно. CRreal == заканчивается после 40 цифр. - person kennytm; 21.07.2010
comment
Обратите внимание, что операции сравнения в CRreal могут расходиться, так как (по необходимости) невозможно реализовать их корректно и они всегда завершаются. Это исключает CRreal для меня. Мне нужно избегать преобразования в реальные числа, чтобы хэшировать эти значения. - person carlo_hamalainen; 22.07.2010

Кажется, вы ищете систему компьютерной алгебры (CAS) в Haskell. Несмотря на такое количество ссылок на алгебраические объекты в именах пакетов/модулей Haskell, я никогда не слышал об универсальной и хорошо поддерживаемой системе условного доступа в Haskell (например, SymPy или Sage в Python).

Однако в списке систем компьютерной алгебры в Википедии я нашел ссылку на

DoCon. Конструктор алгебраического домена

Он использует нестандартную лицензию, но я рискну говорят, что это все еще открытый исходный код (хотя и с требованиями переименования и атрибуции). По состоянию на июль 2010 года docon-2.11 все еще собирается с GHC 6.12.1 и запускает демо/тесты (мне нужно было только вставить прагму LANGUAGE FlexibleContexts в один файл демо).

DoCon хорошо документирован (362 страницы руководства). Руководство упаковано в zip с исходниками, поэтому для удобства я выложил его отдельно:

Руководство по DoCon 2.11.ps

Пожалуйста, просмотрите, чтобы проверить, соответствует ли это вашим потребностям.

person sastanin    schedule 21.07.2010
comment
DoCon кажется немного тяжеловесным для постера. - person sclv; 21.07.2010
comment
Я согласен, но я не знаю ничего другого для Haskell. - person sastanin; 21.07.2010
comment
DoCon выглядит довольно внушительно. Все, что мне действительно нужно, — это реализация на Haskell алгоритма Ландау для извлечения радикалов (и что-то, чтобы делать базовую арифметику с рациональными числами, квадратными корнями и т. д.). - person carlo_hamalainen; 23.07.2010
comment
Ссылка на DoCon на haskell.org кажется мертвой, а последняя ее версия находится на ftp.botik.ru/pub/local/Mechveliani/docon/2.11 - person Qrilka; 16.02.2014
comment
Знаете ли вы, какие функции поддерживает DoCon? - person CMCDragonkai; 15.08.2015

Ознакомьтесь с пакетом cyclotomic, который реализует точную арифметику для циклотомических чисел. К ним относятся все алгебраические числа (отсюда, в частности, 1+sqrt(3)) и ключевые операции (например, равенство) разрешимы.

Они не предоставляют экземпляр Ord (по той же причине, что и комплексные числа), но можно реализовать несемантический экземпляр, если все, что нужно, это использовать их в качестве ключей в таблице поиска. Вы можете связаться с автором о том, как это сделать правильно, так как могут быть некоторые неочевидные инварианты (например, может потребоваться быть осторожным с нулями в карте coeffs).

person Daniel Wagner    schedule 09.01.2015