bmstu-iu9 / bmstu-iu9/refal-5-lambda
Вопиющий случай распухания кода
- Dominant language
- C++
- Stars
- 97
- Forks
- 40
- PR merge metrics
- No merged PRs in 30d
Description
Проблема
=======
При проверке pull request’а #361 упали автотесты: .
Из артефактов стало понятно, что не хватило лимита шагов на случайно сгенерированный тест:
```
2021-08-23T21:51:28.7711414Z Passing test-10_Mon-Aug-23-21-51-16-UTC-2021 (-OAS):
2021-08-23T21:51:39.5990547Z Passing test-10_Mon-Aug-23-21-51-16-UTC-2021 (-OADS):
2021-08-23T21:54:44.2696789Z TEST FAILED
```
[Сам тест.](https://github.com/bmstu-iu9/refal-5-lambda/files/7040081/test-10_Mon-Aug-23-21-51-16-UTC-2021.ref.txt)
Данный тест удалось сузить до следующей программы (которой по-прежнему не хватает шагов):
```Refal5
$ENTRY Block {
e.A t.B t.C X e.D
, : e.X A e.Y e.D
, :
= ;
e.X = e.X;
}
```
Скачать: [bloat-condition.ref](https://github.com/bmstu-iu9/refal-5-lambda/files/7040092/bloat-condition.ref.txt). Последнее условие в первом предложении пустое, и оно нужно. Без него ошибка не воспроизводится.
Я достал из лога программу с рассахаренными условиями (т.к. выпало на тесте без `-OC+`), упростил полученную программу, переименовал функции и переменные:
```Refal5
$ENTRY START {
(e.A) t.B (e.C) = ;
}
Loop {
(e.Acc) e.Begin t.U t.V W e.End
= ;
(e.Acc) e.Rest = e.Acc e.Rest;
}
```
Скачать: [bloat-basic.ref](https://github.com/bmstu-iu9/refal-5-lambda/files/7040110/bloat-basic.ref.txt). Заметим, что функция `Loop` является синтаксическим мономом, если первое предложение убрать, её поведение сохранится.
Полный лог компиляции (11 мегабайт): [bloat-basic.log](https://github.com/bmstu-iu9/refal-5-lambda/files/7040313/bloat-basic.log).
Так вот, для функции `Loop` строится 56 экземпляров:
Фрагмент лога
```
Tue Aug 24 18:00:46 2021: History of START
START@0: [(e.1) t.2 (e.3)]
Tue Aug 24 18:00:46 2021: History of Loop
Loop@0: [(e.1) e.2]
Tue Aug 24 18:00:46 2021: History of Loop@1
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Tue Aug 24 18:00:46 2021: History of Loop@2
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Tue Aug 24 18:00:46 2021: History of Loop@3
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@3: [(e.0 t.1 W S) t.2 W e.3]
Tue Aug 24 18:00:46 2021: History of Loop@4
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@4: [(e.0 t.1) t.2 W e.3]
Tue Aug 24 18:00:46 2021: History of Loop@5
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@5: [(e.0 t.1 W S) W W e.2]
Tue Aug 24 18:00:46 2021: History of Loop@6
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@6: [(e.0 t.1 W S W) t.2 W e.3]
Tue Aug 24 18:00:46 2021: History of Loop@7
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@3: [(e.0 t.1 W S) t.2 W e.3]
Loop@7: [(e.0 t.1 W S t.2) W W e.3]
Tue Aug 24 18:00:46 2021: History of Loop@8
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@3: [(e.0 t.1 W S) t.2 W e.3]
Loop@8: [(e.0 t.1 t.2 s.3) t.4 W e.5]
Tue Aug 24 18:00:46 2021: History of Loop@9
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@4: [(e.0 t.1) t.2 W e.3]
Loop@9: [(e.0 t.1 t.2) W W e.3]
Tue Aug 24 18:00:46 2021: History of Loop@10
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@5: [(e.0 t.1 W S) W W e.2]
Loop@10: [(e.0 t.1 s.2 s.3) W W e.4]
Tue Aug 24 18:00:46 2021: History of Loop@11
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@5: [(e.0 t.1 W S) W W e.2]
Loop@11: [(e.0 t.1 W S W W) t.2 W e.3]
Tue Aug 24 18:00:46 2021: History of Loop@12
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@6: [(e.0 t.1 W S W) t.2 W e.3]
Loop@12: [(e.0 t.1 W S W t.2) W W e.3]
Tue Aug 24 18:00:46 2021: History of Loop@13
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@6: [(e.0 t.1 W S W) t.2 W e.3]
Loop@13: [(e.0 t.1 W t.2 W) t.3 W e.4]
Tue Aug 24 18:00:46 2021: History of Loop@14
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@3: [(e.0 t.1 W S) t.2 W e.3]
Loop@7: [(e.0 t.1 W S t.2) W W e.3]
Loop@14: [(e.0 t.1 s.2 t.3 t.4) W W e.5]
Tue Aug 24 18:00:46 2021: History of Loop@15
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@3: [(e.0 t.1 W S) t.2 W e.3]
Loop@7: [(e.0 t.1 W S t.2) W W e.3]
Loop@15: [(e.0 t.1 W s.2) t.3 W e.4]
Tue Aug 24 18:00:46 2021: History of Loop@16
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@3: [(e.0 t.1 W S) t.2 W e.3]
Loop@8: [(e.0 t.1 t.2 s.3) t.4 W e.5]
Loop@16: [(e.0 t.1 t.2 s.3 t.4) W W e.5]
Tue Aug 24 18:00:46 2021: History of Loop@17
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@5: [(e.0 t.1 W S) W W e.2]
Loop@10: [(e.0 t.1 s.2 s.3) W W e.4]
Loop@17: [(e.0 t.1 s.2 s.3 W W) t.4 W e.5]
Tue Aug 24 18:00:46 2021: History of Loop@18
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@5: [(e.0 t.1 W S) W W e.2]
Loop@11: [(e.0 t.1 W S W W) t.2 W e.3]
Loop@18: [(e.0 t.1 W t.2) W W e.3]
Tue Aug 24 18:00:46 2021: History of Loop@19
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@5: [(e.0 t.1 W S) W W e.2]
Loop@11: [(e.0 t.1 W S W W) t.2 W e.3]
Loop@19: [(e.0 t.1 W s.2 t.3 W) t.4 W e.5]
Tue Aug 24 18:00:46 2021: History of Loop@20
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@6: [(e.0 t.1 W S W) t.2 W e.3]
Loop@12: [(e.0 t.1 W S W t.2) W W e.3]
Loop@20: [(e.0 t.1 s.2 s.3 t.4 t.5) W W e.6]
Tue Aug 24 18:00:46 2021: History of Loop@21
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@6: [(e.0 t.1 W S W) t.2 W e.3]
Loop@12: [(e.0 t.1 W S W t.2) W W e.3]
Loop@21: [(e.0 t.1 t.2 s.3 W) t.4 W e.5]
Tue Aug 24 18:00:46 2021: History of Loop@22
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@6: [(e.0 t.1 W S W) t.2 W e.3]
Loop@13: [(e.0 t.1 W t.2 W) t.3 W e.4]
Loop@22: [(e.0 t.1 W t.2 W t.3) W W e.4]
Tue Aug 24 18:00:46 2021: History of Loop@23
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@3: [(e.0 t.1 W S) t.2 W e.3]
Loop@7: [(e.0 t.1 W S t.2) W W e.3]
Loop@14: [(e.0 t.1 s.2 t.3 t.4) W W e.5]
Loop@23: [(e.0 t.1 t.2 t.3 t.4) W W e.5]
Tue Aug 24 18:00:46 2021: History of Loop@24
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@3: [(e.0 t.1 W S) t.2 W e.3]
Loop@7: [(e.0 t.1 W S t.2) W W e.3]
Loop@14: [(e.0 t.1 s.2 t.3 t.4) W W e.5]
Loop@24: [(e.0 t.1 s.2 t.3 t.4 W W) t.5 W e.6]
Tue Aug 24 18:00:46 2021: History of Loop@25
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@3: [(e.0 t.1 W S) t.2 W e.3]
Loop@7: [(e.0 t.1 W S t.2) W W e.3]
Loop@15: [(e.0 t.1 W s.2) t.3 W e.4]
Loop@25: [(e.0 t.1 W s.2 t.3) W W e.4]
Tue Aug 24 18:00:46 2021: History of Loop@26
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@5: [(e.0 t.1 W S) W W e.2]
Loop@10: [(e.0 t.1 s.2 s.3) W W e.4]
Loop@17: [(e.0 t.1 s.2 s.3 W W) t.4 W e.5]
Loop@26: [(e.0 t.1 s.2 t.3) W W e.4]
Tue Aug 24 18:00:46 2021: History of Loop@27
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@5: [(e.0 t.1 W S) W W e.2]
Loop@10: [(e.0 t.1 s.2 s.3) W W e.4]
Loop@17: [(e.0 t.1 s.2 s.3 W W) t.4 W e.5]
Loop@27: [(e.0 t.1 s.2 s.3 t.4 W) t.5 W e.6]
Tue Aug 24 18:00:46 2021: History of Loop@28
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@5: [(e.0 t.1 W S) W W e.2]
Loop@11: [(e.0 t.1 W S W W) t.2 W e.3]
Loop@18: [(e.0 t.1 W t.2) W W e.3]
Loop@28: [(e.0 t.1 t.2 t.3) W W e.4]
Tue Aug 24 18:00:46 2021: History of Loop@29
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@5: [(e.0 t.1 W S) W W e.2]
Loop@11: [(e.0 t.1 W S W W) t.2 W e.3]
Loop@18: [(e.0 t.1 W t.2) W W e.3]
Loop@29: [(e.0 t.1 W t.2 W W) t.3 W e.4]
Tue Aug 24 18:00:46 2021: History of Loop@30
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@5: [(e.0 t.1 W S) W W e.2]
Loop@11: [(e.0 t.1 W S W W) t.2 W e.3]
Loop@19: [(e.0 t.1 W s.2 t.3 W) t.4 W e.5]
Loop@30: [(e.0 t.1 W s.2 t.3 W t.4) W W e.5]
Tue Aug 24 18:00:46 2021: History of Loop@31
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@5: [(e.0 t.1 W S) W W e.2]
Loop@11: [(e.0 t.1 W S W W) t.2 W e.3]
Loop@19: [(e.0 t.1 W s.2 t.3 W) t.4 W e.5]
Loop@31: [(e.0 t.1 t.2 s.3 t.4 W) t.5 W e.6]
Tue Aug 24 18:00:46 2021: History of Loop@32
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@6: [(e.0 t.1 W S W) t.2 W e.3]
Loop@12: [(e.0 t.1 W S W t.2) W W e.3]
Loop@20: [(e.0 t.1 s.2 s.3 t.4 t.5) W W e.6]
Loop@32: [(e.0 t.1 s.2 t.3 t.4 t.5) W W e.6]
Tue Aug 24 18:00:46 2021: History of Loop@33
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@6: [(e.0 t.1 W S W) t.2 W e.3]
Loop@12: [(e.0 t.1 W S W t.2) W W e.3]
Loop@20: [(e.0 t.1 s.2 s.3 t.4 t.5) W W e.6]
Loop@33: [(e.0 t.1 s.2 s.3 t.4 t.5 W W) t.6 W e.7]
Tue Aug 24 18:00:46 2021: History of Loop@34
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@6: [(e.0 t.1 W S W) t.2 W e.3]
Loop@12: [(e.0 t.1 W S W t.2) W W e.3]
Loop@21: [(e.0 t.1 t.2 s.3 W) t.4 W e.5]
Loop@34: [(e.0 t.1 t.2 s.3 W t.4) W W e.5]
Tue Aug 24 18:00:46 2021: History of Loop@35
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@6: [(e.0 t.1 W S W) t.2 W e.3]
Loop@12: [(e.0 t.1 W S W t.2) W W e.3]
Loop@21: [(e.0 t.1 t.2 s.3 W) t.4 W e.5]
Loop@35: [(e.0 t.1 t.2 t.3 W) t.4 W e.5]
Tue Aug 24 18:00:46 2021: History of Loop@36
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@6: [(e.0 t.1 W S W) t.2 W e.3]
Loop@13: [(e.0 t.1 W t.2 W) t.3 W e.4]
Loop@22: [(e.0 t.1 W t.2 W t.3) W W e.4]
Loop@36: [(e.0 t.1 t.2 t.3 t.4 t.5) W W e.6]
Tue Aug 24 18:00:46 2021: History of Loop@37
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@3: [(e.0 t.1 W S) t.2 W e.3]
Loop@7: [(e.0 t.1 W S t.2) W W e.3]
Loop@14: [(e.0 t.1 s.2 t.3 t.4) W W e.5]
Loop@23: [(e.0 t.1 t.2 t.3 t.4) W W e.5]
Loop@37: [(e.0 t.1 t.2 t.3 t.4 W W) t.5 W e.6]
Tue Aug 24 18:00:46 2021: History of Loop@38
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@3: [(e.0 t.1 W S) t.2 W e.3]
Loop@7: [(e.0 t.1 W S t.2) W W e.3]
Loop@14: [(e.0 t.1 s.2 t.3 t.4) W W e.5]
Loop@24: [(e.0 t.1 s.2 t.3 t.4 W W) t.5 W e.6]
Loop@38: [(e.0 t.1 t.2 t.3 t.4 t.5 W) t.6 W e.7]
Tue Aug 24 18:00:46 2021: History of Loop@39
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@5: [(e.0 t.1 W S) W W e.2]
Loop@10: [(e.0 t.1 s.2 s.3) W W e.4]
Loop@17: [(e.0 t.1 s.2 s.3 W W) t.4 W e.5]
Loop@26: [(e.0 t.1 s.2 t.3) W W e.4]
Loop@39: [(e.0 t.1 s.2 t.3 W W) t.4 W e.5]
Tue Aug 24 18:00:46 2021: History of Loop@40
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@5: [(e.0 t.1 W S) W W e.2]
Loop@11: [(e.0 t.1 W S W W) t.2 W e.3]
Loop@18: [(e.0 t.1 W t.2) W W e.3]
Loop@28: [(e.0 t.1 t.2 t.3) W W e.4]
Loop@40: [(e.0 t.1 t.2 t.3 W W) t.4 W e.5]
Tue Aug 24 18:00:46 2021: History of Loop@41
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@5: [(e.0 t.1 W S) W W e.2]
Loop@11: [(e.0 t.1 W S W W) t.2 W e.3]
Loop@18: [(e.0 t.1 W t.2) W W e.3]
Loop@29: [(e.0 t.1 W t.2 W W) t.3 W e.4]
Loop@41: [(e.0 t.1 W t.2 t.3 W) t.4 W e.5]
Tue Aug 24 18:00:46 2021: History of Loop@42
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@5: [(e.0 t.1 W S) W W e.2]
Loop@11: [(e.0 t.1 W S W W) t.2 W e.3]
Loop@19: [(e.0 t.1 W s.2 t.3 W) t.4 W e.5]
Loop@30: [(e.0 t.1 W s.2 t.3 W t.4) W W e.5]
Loop@42: [(e.0 t.1 s.2 t.3 t.4 t.5 t.6) W W e.7]
Tue Aug 24 18:00:46 2021: History of Loop@43
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@5: [(e.0 t.1 W S) W W e.2]
Loop@11: [(e.0 t.1 W S W W) t.2 W e.3]
Loop@19: [(e.0 t.1 W s.2 t.3 W) t.4 W e.5]
Loop@31: [(e.0 t.1 t.2 s.3 t.4 W) t.5 W e.6]
Loop@43: [(e.0 t.1 t.2 s.3 t.4 W t.5) W W e.6]
Tue Aug 24 18:00:46 2021: History of Loop@44
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@6: [(e.0 t.1 W S W) t.2 W e.3]
Loop@12: [(e.0 t.1 W S W t.2) W W e.3]
Loop@20: [(e.0 t.1 s.2 s.3 t.4 t.5) W W e.6]
Loop@32: [(e.0 t.1 s.2 t.3 t.4 t.5) W W e.6]
Loop@44: [(e.0 t.1 s.2 t.3 t.4 t.5 W W) t.6 W e.7]
Tue Aug 24 18:00:46 2021: History of Loop@45
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@6: [(e.0 t.1 W S W) t.2 W e.3]
Loop@12: [(e.0 t.1 W S W t.2) W W e.3]
Loop@20: [(e.0 t.1 s.2 s.3 t.4 t.5) W W e.6]
Loop@33: [(e.0 t.1 s.2 s.3 t.4 t.5 W W) t.6 W e.7]
Loop@45: [(e.0 t.1 t.2 s.3 t.4 t.5) W W e.6]
Tue Aug 24 18:00:46 2021: History of Loop@46
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@6: [(e.0 t.1 W S W) t.2 W e.3]
Loop@12: [(e.0 t.1 W S W t.2) W W e.3]
Loop@20: [(e.0 t.1 s.2 s.3 t.4 t.5) W W e.6]
Loop@33: [(e.0 t.1 s.2 s.3 t.4 t.5 W W) t.6 W e.7]
Loop@46: [(e.0 t.1 t.2 t.3 t.4 t.5 t.6 W) t.7 W e.8]
Tue Aug 24 18:00:46 2021: History of Loop@47
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@6: [(e.0 t.1 W S W) t.2 W e.3]
Loop@12: [(e.0 t.1 W S W t.2) W W e.3]
Loop@21: [(e.0 t.1 t.2 s.3 W) t.4 W e.5]
Loop@35: [(e.0 t.1 t.2 t.3 W) t.4 W e.5]
Loop@47: [(e.0 t.1 t.2 t.3 W t.4) W W e.5]
Tue Aug 24 18:00:46 2021: History of Loop@48
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@6: [(e.0 t.1 W S W) t.2 W e.3]
Loop@13: [(e.0 t.1 W t.2 W) t.3 W e.4]
Loop@22: [(e.0 t.1 W t.2 W t.3) W W e.4]
Loop@36: [(e.0 t.1 t.2 t.3 t.4 t.5) W W e.6]
Loop@48: [(e.0 t.1 t.2 t.3 t.4 t.5 W W) t.6 W e.7]
Tue Aug 24 18:00:46 2021: History of Loop@49
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@3: [(e.0 t.1 W S) t.2 W e.3]
Loop@7: [(e.0 t.1 W S t.2) W W e.3]
Loop@14: [(e.0 t.1 s.2 t.3 t.4) W W e.5]
Loop@24: [(e.0 t.1 s.2 t.3 t.4 W W) t.5 W e.6]
Loop@38: [(e.0 t.1 t.2 t.3 t.4 t.5 W) t.6 W e.7]
Loop@49: [(e.0 t.1 t.2 t.3 t.4 t.5 W t.6) W W e.7]
Tue Aug 24 18:00:46 2021: History of Loop@50
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@5: [(e.0 t.1 W S) W W e.2]
Loop@10: [(e.0 t.1 s.2 s.3) W W e.4]
Loop@17: [(e.0 t.1 s.2 s.3 W W) t.4 W e.5]
Loop@26: [(e.0 t.1 s.2 t.3) W W e.4]
Loop@39: [(e.0 t.1 s.2 t.3 W W) t.4 W e.5]
Loop@50: [(e.0 t.1 s.2 t.3 t.4 W) t.5 W e.6]
Tue Aug 24 18:00:46 2021: History of Loop@51
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@5: [(e.0 t.1 W S) W W e.2]
Loop@11: [(e.0 t.1 W S W W) t.2 W e.3]
Loop@18: [(e.0 t.1 W t.2) W W e.3]
Loop@28: [(e.0 t.1 t.2 t.3) W W e.4]
Loop@40: [(e.0 t.1 t.2 t.3 W W) t.4 W e.5]
Loop@51: [(e.0 t.1 t.2 t.3 t.4 W) t.5 W e.6]
Tue Aug 24 18:00:46 2021: History of Loop@52
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@5: [(e.0 t.1 W S) W W e.2]
Loop@11: [(e.0 t.1 W S W W) t.2 W e.3]
Loop@19: [(e.0 t.1 W s.2 t.3 W) t.4 W e.5]
Loop@30: [(e.0 t.1 W s.2 t.3 W t.4) W W e.5]
Loop@42: [(e.0 t.1 s.2 t.3 t.4 t.5 t.6) W W e.7]
Loop@52: [(e.0 t.1 t.2 t.3 t.4 t.5 t.6) W W e.7]
Tue Aug 24 18:00:46 2021: History of Loop@53
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@5: [(e.0 t.1 W S) W W e.2]
Loop@11: [(e.0 t.1 W S W W) t.2 W e.3]
Loop@19: [(e.0 t.1 W s.2 t.3 W) t.4 W e.5]
Loop@30: [(e.0 t.1 W s.2 t.3 W t.4) W W e.5]
Loop@42: [(e.0 t.1 s.2 t.3 t.4 t.5 t.6) W W e.7]
Loop@53: [(e.0 t.1 s.2 t.3 t.4 t.5 t.6 W W) t.7 W e.8]
Tue Aug 24 18:00:46 2021: History of Loop@54
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@6: [(e.0 t.1 W S W) t.2 W e.3]
Loop@12: [(e.0 t.1 W S W t.2) W W e.3]
Loop@20: [(e.0 t.1 s.2 s.3 t.4 t.5) W W e.6]
Loop@33: [(e.0 t.1 s.2 s.3 t.4 t.5 W W) t.6 W e.7]
Loop@45: [(e.0 t.1 t.2 s.3 t.4 t.5) W W e.6]
Loop@54: [(e.0 t.1 t.2 s.3 t.4 t.5 W W) t.6 W e.7]
Tue Aug 24 18:00:46 2021: History of Loop@55
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@6: [(e.0 t.1 W S W) t.2 W e.3]
Loop@12: [(e.0 t.1 W S W t.2) W W e.3]
Loop@20: [(e.0 t.1 s.2 s.3 t.4 t.5) W W e.6]
Loop@33: [(e.0 t.1 s.2 s.3 t.4 t.5 W W) t.6 W e.7]
Loop@46: [(e.0 t.1 t.2 t.3 t.4 t.5 t.6 W) t.7 W e.8]
Loop@55: [(e.0 t.1 t.2 t.3 t.4 t.5 t.6 W t.7) W W e.8]
Tue Aug 24 18:00:46 2021: History of Loop@56
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@3: [(e.0 t.1 W S) t.2 W e.3]
Loop@7: [(e.0 t.1 W S t.2) W W e.3]
Loop@14: [(e.0 t.1 s.2 t.3 t.4) W W e.5]
Loop@24: [(e.0 t.1 s.2 t.3 t.4 W W) t.5 W e.6]
Loop@38: [(e.0 t.1 t.2 t.3 t.4 t.5 W) t.6 W e.7]
Loop@49: [(e.0 t.1 t.2 t.3 t.4 t.5 W t.6) W W e.7]
Loop@56: [(e.0 t.1 t.2 t.3 t.4 t.5 t.6 t.7) W W e.8]
```
Остаточная программа до прогонки экземпляров содержит 835 строк, после прогонки экземпляров — 15 555 строк (да, четыре пятёрки: [residual.txt](https://github.com/bmstu-iu9/refal-5-lambda/files/7040337/residual.txt)).
Типичный экземпляр до прогонки экземпляров:
```Refal5
Loop@32 {
(e.X1) t.X3 s.X2 t.X4 t.X5 t.X6 W e.X4
= ;
(e.X1) t.X3 s.X2 t.X4 t.X5 t.X6 t.X7 W e.X5
= ;
(e.X1) t.X3 s.X2 t.X4 t.X5 t.X6 e.X4 t.X7 t.X8 W e.X8
= ;
(e.X1) t.X3 s.X2 t.X4 t.X5 t.X6 e.X3
= e.X1 t.X3 s.X2 t.X4 t.X5 t.X6 W W e.X3;
}
```
Начало финальной остаточной программы:
```Refal5
$ENTRY START;
START {
(e.A) t.B (W W W W W e.C5) = ;
(e.A) t.B (W W W W t.C4 W W e.C7)
= ;
(e.A) t.B (W W W W t.C4 W t.C6 W W e.C9)
= ;
(e.A) t.B (W W W W t.C4 W t.C6 W t.C8 W e.C10)
= ;
(e.A) t.B (W W W W t.C4 W t.C6 W e.C8)
= ;
(e.A) t.B (W W W W t.C4 W e.C6) = ;
(e.A) t.B (W W W W e.C4) = ;
(e.A) t.B (W W W t.C3 W W e.C6) = ;
(e.A) t.B (W W W t.C3 W t.C5 W W e.C8)
= ;
(e.A) t.B (W W W t.C3 W t.C5 W t.C7 W e.C9)
= ;
(e.A) t.B (W W W t.C3 W t.C5 W e.C7)
= ;
(e.A) t.B (W W W t.C3 W e.C5) = ;
(e.A) t.B (W W W e.C3) = ;
(e.A) t.B (W W t.C2 W W e.C5) = ;
(e.A) t.B (W W t.C2 W t.C4 W W W W W W e.C11)
= ;
…
```
Почему _вопиющий случай?_ Зачем новая заявка (почему не #332)?
-------------------------------------------------------------------------------
Вопиющая потому что
* во-первых, 11 строк кода взрываются до 835/15 555, что, очевидно, жесть,
* во-вторых, я уже хотел выпустить версию 3.4, как вылезла эта ошибка.
Заявка #332 предполагается как долгоиграющая — когда я её буду исправлять, не известно. А эту хочется исправить в самое ближайшее время.
Возможные решения
==============
Забить
--------
Т.е. запушить новый коммит (он должен быть с обновлением `NEWS.md`, и, если повезёт, в случайных тестах эта ошибка не повторится.
* ✔Самое простое решение.
* ❌Ошибку всё равно придётся решать.
* ❌Не красиво, что ошибка сборки в #361 не исправлена (другие ошибки сборки исправлялись последующими коммитами).
Придумать костыль
----------------------
Например, снизить наибольшее число экземпляров (сейчас такой костыль есть, ограничивает число экземпляров 99, 54c28cad9). Либо можно ограничить максимальную глубину истории. Для последнего можно самоприменить компилятор и посмотреть максимальную глубину истории в нём.
* ✔Относительно простое решение.
* ❌Костыль всегда не эстетичен. Грязное решение.
Ослабить отношение остановки
-------------------------------------
Сейчас используется честное отношение Хигмана-Крускала. Выбор другого варианта — это всё-таки исследовательская работа, быстро сделать не получится. Идеи описаны в комментариях https://github.com/bmstu-iu9/refal-5-lambda/issues/332#issuecomment-808697324, https://github.com/bmstu-iu9/refal-5-lambda/issues/332#issuecomment-815664005 и https://github.com/bmstu-iu9/refal-5-lambda/issues/332#issuecomment-883934769.
* ✔Возможно, заработает.
* ❌Другое отношение снизит глубину оптимизации. Возможно, снизит криво — очевидные оптимизируемые места оптимизироваться не будут. Т.е. надо внимательно исследовать.
* ❌Хз, какое новое отношение выбрать.
Специальное сопоставление с образцом для специализации
----------------------------------------------------------------------
Описано оно в комментарии https://github.com/bmstu-iu9/refal-5-lambda/issues/332#issuecomment-890483185. Если кратко, то алгоритм сопоставления с образцом, злоупотребляя динамическим обобщением, гарантирует, что для любого предложения специализируемой функции построится не более одного предложения в экземпляре. Участки аргумента, сопоставление с которыми приводит к ветвлению, принудительно обобщаются.
* ✔Скорее всего, решит описываемую проблему. В экземплярах сейчас строится по 4 предложения, т.е. первое предложение расщепляется на 3. Применение нового алгоритма сопоставления с образцом приведёт, скорее всего, к динамическому обобщению до тривиальной сигнатуры.
* ✔Возможно, можно будет отказаться от явного обобщения участков вида `e.X … e.Y`, описанных в том же комментарии https://github.com/bmstu-iu9/refal-5-lambda/issues/332#issuecomment-890483185 и реализованных в фиксации 916efbf.
* ❌Нетривиальная правка алгоритма обобщённого сопоставления. В состояние алгоритма нужно будет протащить флаг, указывающий на специальный режим работы.
* ❌Нужно проверить, насколько ухудшится в этом режиме оптимизация.
Перестройка сверху (честная)
-----------------------------------
В комментарии https://github.com/bmstu-iu9/refal-5-lambda/issues/332#issuecomment-901267648 предлагается серьёзно модифицировать алгоритм оптимизации, чтобы при специализации использовалась перестройка сверху. Скорее всего, это снизит число экземпляров в данной задаче до разумной величины (см. первый комментарий https://github.com/bmstu-iu9/refal-5-lambda/issues/362#issuecomment-904865271).
* ✔Скорее всего, это решит проблему. По историям сигнатур видно, что в некоторых случаях перестройка сверху срезала бы часть истории:
```
START@0: [(e.1) t.2 (e.3)]
Loop@1: [(e.0) t.1 W S e.2]
Loop@2: [(e.0 t.1 W) S W e.2]
Loop@5: [(e.0 t.1 W S) W W e.2]
Loop@10: [(e.0 t.1 s.2 s.3) W W e.4] ← здесь
Loop@17: [(e.0 t.1 s.2 s.3 W W) t.4 W e.5]
Loop@26: [(e.0 t.1 s.2 t.3) W W e.4] ← и здесь
Loop@39: [(e.0 t.1 s.2 t.3 W W) t.4 W e.5]
Loop@50: [(e.0 t.1 s.2 t.3 t.4 W) t.5 W e.6]
```
Экземпляры `Loop@10` и `Loop@26` различаются только s- и t-переменными:
```Refal5
Loop@10 {
(e.X) t.X s.X s.X1 W e.X2 = ;
(e.X) t.X s.X s.X1 t.X1 W e.X3 = ;
(e.X) t.X s.X s.X1 e.X2 t.X3 t.X4 W e.X6
= ;
(e.X) t.X s.X s.X1 e.X1 = e.X t.X s.X s.X1 W W e.X1;
}
```
```Refal5
Loop@26 {
(e.X1) t.X2 s.X2 t.X3 W e.X3 = ;
(e.X1) t.X2 s.X2 t.X3 t.X4 W e.X5
= ;
(e.X1) t.X2 s.X2 t.X3 e.X3 t.X5 t.X6 W e.X8
= ;
(e.X1) t.X2 s.X2 t.X3 e.X2 = e.X1 t.X2 s.X2 t.X3 W W e.X2;
}
```
* ✔Это довольно общее решение.
* ❌Громоздкие переделки архитектуры оптимизатора, для быстрого патча не подходит.
Перестройка сверху (халтурная)
-------------------------------------
Сейчас при обнаружении зацикливания между старой сигнатурой `F@i` и новой сигнатурой `F@j` вычисляется их обобщение, назовём его `F@k = MSG(F@i, F@j)`. Если `F@k ≡ F@i`, то это обычное зацикливание, вызываем ранее построенный экземпляр. Если нет, то вызывается и строится экземпляр для обобщённой сигнатуры `F@k`. История экземпляра `F@k` растёт от истории `F@j`. **Это перестройка снизу.**
Предлагается сделать почти грязный хак. А именно, при срабатывании условия остановки в случае `F@k = MSG(F@i, F@j) ≠ F@i` строить не только экземпляр `F@k`, как и раньше, но ещё и патчить старый экземпляр `F@i`, заменяя всё его тело на единственный вызов `F@k`:
```Refal5
F@i {
ARG =
}
```
История экземпляра `F@k` будет расти не от истории `F@j`, а от `F@i`. Назовём это **халтурной перестройкой сверху.**
Очевидно, что экземпляры, построенные после `F@i`, в программе останутся, хоть вызываться из `F@i` не будут. Возможно, специализатор продолжит оптимизировать в них заведомо бессмысленные вызовы. Они могут потом потереться на последнем проходе — удалении невызываемых функций¹. Или не потереться, если в них есть «косые стрелки».
¹ Этот проход в качестве корневого множества рассматривает все функции без суффиксов — функции исходной программы. Поэтому в логе можно видеть функцию `Loop`, которая ниоткуда не вызывается.
Пропатченные экземпляры вида `F@i` из примера выше будут встраиваться в точки вызова на проходе прогонки экземпляров.
Если специализация разных дочерних экземпляров будет требовать разный патч для родителя, то будет выбираться произвольный патч — какой первый попадётся.
* ✔Подход будет снижать объём остаточной программы как минимум из-за того, что размер некоторых экземпляров будет сокращаться (тем более, они в режиме `-OA` будут встраиваться в точки вызова, а затем вытираться как неиспользуемые).
* ✔Вероятно, решит и текущую задачу. Выход за лимит шагов возникал вроде на стадии прогонки экземпляров.
* ✔❓Думаю, проблему можно решить не более чем 100 новыми строками кода. Серьёзно сломаться ничего не должно.
Вывод
====
А нет пока вывода. Я ещё не выбрал вариант. Напишу в комментариях. Склоняюсь к последнему.
@TonitaN, какой вариант тебе больше нравится?
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.