Subject: Маленькая компьютерная алгебр
From: Sergei M. Abramov (abram@botik.ru)
Date: Sat Aug 28 2004 - 10:23:51 MSD
Друзья!
В приложении маленькая система компьютерной алгебры -- реализованны операции
с полиномами ("+", "*", "^", "//" -- последнее -- это подстановка полинома в
полином вместо переменной). Всего лишь.
В исходном тексте есть комментарии про историю создания системы и про разные
другие штуки (например, одно правило оптимизирующего эквивалентного
преобразования Рефал-Плюс-программ...)
Зачем я посылаю это все?
(1) Мне кажется, история данного кода (см. комментарии) -- забавный пример
преподавания Рефала Плюс (жаль, я не сохранял -- CVS -- версии, историю
изменений исходного файла)...
(2) Мне кажется, программа может использоваться как тест или демо в
дистрибутивах Рефалов. И как тест, для сравнений различных версий одного и
того же диалекта Рефала, или разных диалектов (правда, тогда ее надо
садаптировать под эти диалекты).
Отдельно про "демо". Наличие читабельных, миниатюрные и зрелищных "демо" в
дистрибутиве много значит для пропаганды языка (мое мнение). Самый яркий
пример? Я отсылаю всех своих студентов читать и наслаждаться демо из
поставки Хаскеля/Хакса.
Недавно посмотрел "демо" в Refal 6/Java. Многое понравилось. В Рефале Плюс
были отличные "демо", как мне помнится. Но, все равно, для успеха Рефала
нужны новые симпатичные, читабельные, миниатюрные и зрелищные демо.
Я не говорю, что мне это удалось ;-), но я сделал попытку.
(3) Мне кажется, что программа может спровоцировать обсуждение стилей
программирования и шаблонов (идиоматических оборотов) реализации различных
типичных случаев.
Например, (либо у меня склероз, либо я действительно не знал такого шаблона)
надо проверить (написать функцию "$func? IsPoly e.P = ;"), что все термы t.M
из e.P удовлетворяют условию "$func? IsMon t.M = ;"... Решение:
* \forall t.M \in e.P, <IsMon? t.M>
* <==> \not ( \exists t.M \in e.P, #<IsMon? t.M>))
IsPoly? e.P, #\{ e.P : e t.M e, #<IsMon? t.M> = ; };
(4) В любом разе, программа -- хороший тест для Рефала Плюс. Мой добрый,
надежный Рефал Плюс для ДОСа 16 бит от 28.02.1994 -- я до сих пор работаю на
нем, поскольку не знаю, где есть иной дистрибутив, который я мог бы
бесхлопотно поставить под Виндовс -- так вот, мой старый Рефал Плюс
откровенно "бузит" на некоторых входных данных (описано ниже).
Разве плохой тест для новой (новых) реализаций Рефала Плюс?
Файлы:
==> pol.rf и pol.exe -- исходный код программы и исполняемый файл
(собран тем самым старым Рефалом Плюс).
==> p-test.txt -- поток "трехадресных команд" над полиномами -- там
все читаемо и есть комментарии в стиле Рефала Плюс. Программа читает и
исполняет этот поток команд и на стандартный выход выдает протокол и
результаты вычислений...
==> res.txt -- как раз содержит результат: "pol.exe > res.txt".
Можно написать свой поток трехадресных команд и посчитать результаты.
Удачи
С.
===========================================================================
Теперь об ошибках старого Рефала Плюс...
В строке 5 колонке 33 файла p-test.txt написано число 3.
Видно, вычисления построены так, что полиномы с именами P6 и "(1-1) ^ k"
должны получаться равными нулю, если мы это число 3 заменим на любое иное
число k > 0.
Так вот, для k = 1, 2, 3 -- все работает нормально. Дальше -- начинается
чехарда --- то P6 не равно "0", то сбои поиска в таблице значения ранее
посчитанных полиномов случается ("The variable (poly) is undefined ...")
В файлах
p-test1.txt == p-test.txt
p-test2.txt
p-test3.txt
в принципе одни и те же вычисления... Только имена полиномов разные (и в
p-test3.txt промежуточные результаты затираются "в памяти").
И вот результат: разные файлы правильно считаются при разных k:
p-test1.txt k=1..3
p-test2.txt k=1..8
p-test3.txt k=1..11 (замысловато грохается при 12)
This archive was generated by hypermail 2b25 : Mon Oct 25 2004 - 21:25:01 MSD