Доделал свой итеративный вариант, он проходит без увеличения памяти и
стеков до 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:... Eisymont Leonid verger-lk_AT_yandex . ru
    • ... Александр Коновалов 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

Ответить