Доброй ночи!

Запустил исходный пример Аркадия на Рефале+ (с компиляцией C++). Heap
пришлось увеличить до 2GB. Время - 2.05 секунды.

С уважением,
    Юрий Климов

P.S. Попутно обнаружил ошибочку в компиляторе. Сразу видно, что раньше
компилятор тестировался на машинах с меньше, чем 2ГБ памяти ;).

On Mon, 25 Feb 2019 at 20:53, Arkady Klimov arkady.klimov_AT_gmail.com <
refal@botik.ru> wrote:

> Доделал свой итеративный вариант, он проходит без увеличения памяти и
> стеков до N=100000 (сто тысяч) за 1м40сек (100 сек).
> 10000 (десять тысяч) проходит за 1 сек.
>
> // Здесь строка eS еще не проверена на отсутствие повтора в ее начале
> EX1 sN eS : {
> // Goal!
>    0 e = eS;
> // eS is unacceptable
>    sN vA vA e = <Next sN eS>; // tail recursion, eS is not empty
> (otherwise previous sentence works)
> // eS is acceptable
>    sN e = <EX1 <SUB sN 1> 'a' eS>;
>    };
> Next  {
>    sN = (); // Global Fail
>    sN sX eS = {
>          /* Choose next symbol after sX if any */
>          'abc' : e sX sY e = <EX1 sN sY eS>;
>          /* No next symbol -> go back */
>          = <Next <ADD sN 1> eS>;
>          };
>   };
>
> Это по структуре похоже на то, что прислал Василий. Но наверно, более
> экономно.
> Здесь нет откатов, простой цикл, состояние - вся текущая строка.
>
>
> пн, 25 февр. 2019 г. в 19:48, swi_AT_cnshb.ru <refal@botik.ru>:
>
>> Уважаемые господа!
>> Я тоже дочитал...
>> А тест Аркадия меня подвиг его повторить.
>> У меня на рефале/2 получилась следующая программа:
>> a =/0/k/P/k/EX//10000/..
>> EX /0/eS=eS
>>    sN eS=k/EX1/('abc'sN)eS.
>> EX1 (sa eb sN)eS=k/EXc/(eb sN)sa eS.
>>     (sN)saeS=k/EX1p/k/P1/sN.sa('abc')eS.
>> EX1p sN sa(e1 sa eb)eS=k/EX1/(eb sN)eS.
>> EXc w0 sa eA sa eA ee=k/EX1/w0 eA sa eA ee.
>>     (eb sN)eR=k/EX/k/M1/sN.eR.
>>
>> я старался использовать идентификаторы переменных как на рефале-6...
>>
>> Кстати, ех 10000 у меня прошло, и менее чем за минуту (разница во времени
>> файла результата "компиляции" и результата) см. приложенный файл.
>>
>> 25.02.2019, 16:51, "Arkady Klimov arkady.klimov_AT_gmail.com" <
>> refal@botik.ru>:
>>
>> Я не только дочитал, наконец, но и внес свои правки-дополнения (в раздел
>> по Рефал-6, и чуток по Рефал Плюс), поместив этот замечательный текст в
>> doc-файл, который можно взять по ссылке:
>>
>> https://www.dropbox.com/s/eq4yv9g7atu59d7/CompareRefals.doc?dl=0
>>
>> Я подумал, что хорошо бы моему примеру последовали и "держатели" других
>> диалектов.
>> Александр, поручаю Вам быть "хозяином" этого файла, можете забрать его и
>> выложить где-то от себя. Мои добавки, помеченные цветом и префиксом "АрК",
>> можете в своем стиле адоптировать.
>> Будет замечательно, если Вы сможете сделать из этого публикацию в
>> ближайшее время. Призываю всех, кто чем может (правками, замечаниями и тп),
>> этому посодействовать.
>> ***
>> Я по ходу решил еще раз почитать документацию-руководство по Рефалу Плюс.
>> У меня сложное отношение к нему, то есть он как-то всегда был сложен для
>> меня. Как я сейчас понял, возможно это из-за специфического описания
>> синтаксиса, содержащего понятия "тропы" и "хвосты". Они очень похожи, и я
>> всегда их путал и не мог привыкнуть различать. Для этого было бы полезно
>> видеть их семантическое различие, чем я не владею. А описание языка
>> такового не предлагает. Остается только "зазубривать" формальные
>> особенности, напрягая свою внутреннюю "нейросеть". Хорошо бы те, кто
>> владеют семантическим пониманием хвостов и троп Рефала Плюс, если таковое
>> существует, его как-то эксплицировали.
>> ***
>> В руководстве мне встретился интересный пример - задача "о цепочках" (из
>> Вирта), раздел 1.10. Надо породить строку из трех знаков (a, b, c), чтобы в
>> ней не было одинаковых смежных подстрок.
>> Решение довольно мутное, тем более оно дважды использует $Iter, который я
>> не люблю (вероятно, авторы, хотели именно его иллюстрировать этим
>> примером). И мне захотелось переписать его в более "чистых" терминах. И вот
>> что у меня получилось:
>> ----------------------------------------------------------------------------------------------------------
>> файл abc.ref
>> // <EX sN eS> - расширить строку eS влево sN знаками a,b,c,
>> //                        не допуская повторов смежных подстрок
>> EX {
>>    0 eS = eS;
>>    sN eS , 'abc' : e sX e , sX eS : eR : # vA vA e, <EX <SUB sN 1> eR>;
>>    };
>>
>> ------------------------------------------------------------------------------------------------------------
>> Это рефал-6, но думаю, можно по аналогии и на Плюсе написать (может даже
>> и так пройдет).
>> Функция EX откатная, при успехе выдает продолженную строку, иначе откат.
>> Образец e sX e перебирает три варианта продолжения, образец vA vA e под
>> отрицанием проверяет, что выражение не начинается с двух одинаковых
>> непустых подстрок, дальше идет рекурсивный вызов, все через запятую
>> прозрачно для откатов.
>> Назвал функцию заглавными покороче, чтобы в интерактивной моде вызывать:
>> d:\ref6\TEST>d:\ref6\rix.exe i+abc+*ask -S1000000 -T1000000 -H1000000
>> #>ex 5
>> 'acaba'
>> #>ex 10
>> 'bcacbacaba'
>> #>ex 100
>>
>> 'cacbacabacbabcabacabcbabcacbacabacbabcabacabcacbabcabacbabcacbacabacbabcabacabcacbacabacbabcacbacaba'
>> #>ex 1000
>>
>> 'acbabcacbacabacbabcbacbcabacbabcacbacabacbabcabacabcbabcabacbabcacbacabacbabcabacabcacbabcabacbabcacbacabacbabcabacabcbabcacbacabacbabcbacbcabacbabcabacabcacbabcabacbabcbacabacbabcabacabcacbabcabacbabcacbacabacbabcabacabcacbabcabacbabcbacabacbabcacbacabacbabcbacabacbcacbacabacbabcacbacabacbcacbabcabacabcacbabcabacbabcbacabacbabcabacabcacbabcabacbabcacbacabacbabcabacabcacbabcabacbabcbacabacbabcacbacabacbabcbacbcabacbabcabacabcacbabcabacbabcbacabacbabcabacabcacbabcabacbabcacbacabacbabcabacabcacbabcabacbabcbacabacbabcacbacabacbabcbacabacbcacbacabacbabcacbacabacbcacbabcabacabcacbabcabacbabcbacabacbabcabacabcacbabcabacbabcacbacabacbabcabacabcacbabcabacbabcbacbcabacbabcabacabcacbabcabacbabcbacabacbabcabacabcacbabcabacbabcacbacabacbabcabacabcacbabcabacbabcbacabacbabcacbacabacbabcbacbcabacbabcabacabcacbabcabacbabcbacabacbabcabacabcacbabcabacbabcacbacabacbabcabacabcacbabcabacbabcbacabacbabcabacabcacbacabacbabcabacabcbabcacbacabacbabcabacabcacbabcabacbabcacbacabacbabcabacabcacbacabacbabcacbacaba'
>> #>ex 10000
>> EVAL: *** SYSTEM: Reference counter overflow
>> The referenced object is: *EX
>> EVAL: Act Vf Fre Run [n]Step [n]Trc Evl Chg Kil New Inf M W D H cLr Quit>
>>
>> Пришлось задать большой стек S и таблицу элементов Т (по 1000000
>> элементов, по 16 и 8 байтов соответственно), и 1 ГБ (H Kb) общей памяти,
>> иначе стеки быстро переполнялись. Здесь на каждый следующий элемент строки
>> вводится уровень в стеке из-за возможности откатов. Но все равно на
>> аргументе 10000 сломалось - по переполнению счетчика ссылок на объект *EX
>> (символ функции). По-видимому, каждый уровень стека содержал несколько
>> экземпляров ссылок, а всего в реализации счетчик ссылок не может превысить
>> 2^15.
>>
>> Хороший тест получился. Показал некоторые пределы реализации.
>>
>> Решение на Рефал Плюс из руководства тоже жадно до стека. Интересно,
>> какие там пределы?
>>
>> На получение строки наибольшей длины (около 6500) ушло чуть меньше
>> секунды. По-видимому, на последней версии Рефала Плюс будет быстрее: либо
>> из-за не копирований eS и eR (благодаря "дыркам"), либо из-за более
>> оптимального отождествления vA vA e: уравнения на длинах должны ограничить
>> удлинение переменной vA только до половины длины аргумента, а в Рефале-6
>> она тупо продолжает удлиняться до конца аргумента.
>>
>> Надеюсь, было не скучно.
>> Аркадий
>>
>>
>
> --
> _______________
> *С уважением, *
> *Аркадий Климов,*
> *с.н.с. ИППМ РАН,*
> *+7(499)135-32-95*
> *+7(916)072-81-48*
>
  • RE:... Александр Коновалов a . v . konovalov87_AT_mail . ru
    • ... Eisymont Leonid verger-lk_AT_yandex . ru
    • ... Arkady Klimov arkady . klimov_AT_gmail . com
    • ... Sergei M. Abramov
    • ... Arkady Klimov arkady . klimov_AT_gmail . com
    • ... Andrei Klimov andrei_AT_klimov . net
    • ... Александр Коновалов a . v . konovalov87_AT_mail . ru
    • ... Sergei M. Abramov
    • ... swi_AT_cnshb . ru
    • ... Arkady Klimov arkady . klimov_AT_gmail . com
    • ... Yuri Klimov yuri_AT_klimov . net
    • ... Sergei M. Abramov
    • ... Yuri Klimov yuri_AT_klimov . net
    • ... Arkady Klimov arkady . klimov_AT_gmail . com
    • ... Yuri Klimov yuri_AT_klimov . net
    • ... Yuri Klimov yuri_AT_klimov . net
    • ... Arkady Klimov arkady . klimov_AT_gmail . com
    • ... Andrei Klimov andrei_AT_klimov . net
    • ... Anton Orlov orlovan_AT_gmail . com
    • ... Arkady Klimov arkady . klimov_AT_gmail . com
    • ... Anton Orlov orlovan_AT_gmail . com

Ответить