Маленькая компьютерная алгебр


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