You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Скачать: bloat-condition.ref. Последнее условие в первом предложении пустое, и оно нужно. Без него ошибка не воспроизводится.
Я достал из лога программу с рассахаренными условиями (т.к. выпало на тесте без -OC+), упростил полученную программу, переименовал функции и переменные:
$ENTRY START {
(e.A) t.B (e.C) = <Loop (e.A) t.B W S e.C>;
}
Loop {
(e.Acc) e.Begin t.U t.V W e.End
= <Loop (e.Acc e.Begin t.U) t.V W e.End>;
(e.Acc) e.Rest = e.Acc e.Rest;
}
Скачать: bloat-basic.ref. Заметим, что функция Loop является синтаксическим мономом, если первое предложение убрать, её поведение сохранится.
Так вот, для функции 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).
$ENTRY START;
START {
(e.A) t.B (W W W W W e.C5) = <Loop@10 (e.A t.B W S) W W W e.C5>;
(e.A) t.B (W W W W t.C4 W W e.C7)
= <Loop@26 (e.A t.B W S W W) W W t.C4 e.C7>;
(e.A) t.B (W W W W t.C4 W t.C6 W W e.C9)
= <Loop@26 (e.A t.B W S W W W W) t.C4 W t.C6 e.C9>;
(e.A) t.B (W W W W t.C4 W t.C6 W t.C8 W e.C10)
= <Loop@31 (e.A t.B W S W W W) W t.C4 W t.C6 t.C8 e.C10>;
(e.A) t.B (W W W W t.C4 W t.C6 W e.C8)
= <Loop@27*2 (e.A t.B W S W) W W W t.C4 t.C6 e.C8>;
(e.A) t.B (W W W W t.C4 W e.C6) = <Loop@17*2 (e.A t.B W) S W W t.C4 e.C6>;
(e.A) t.B (W W W W e.C4) = <Loop@10*2 (e.A t.B W) S W W e.C4>;
(e.A) t.B (W W W t.C3 W W e.C6) = <Loop@26 (e.A t.B W S W) W W t.C3 e.C6>;
(e.A) t.B (W W W t.C3 W t.C5 W W e.C8)
= <Loop@26 (e.A t.B W S W W W) t.C3 W t.C5 e.C8>;
(e.A) t.B (W W W t.C3 W t.C5 W t.C7 W e.C9)
= <Loop@31 (e.A t.B W S W W) W t.C3 W t.C5 t.C7 e.C9>;
(e.A) t.B (W W W t.C3 W t.C5 W e.C7)
= <Loop@27*2 (e.A t.B W S) W W W t.C3 t.C5 e.C7>;
(e.A) t.B (W W W t.C3 W e.C5) = <Loop@17*2 (e.A t.B) W S W t.C3 e.C5>;
(e.A) t.B (W W W e.C3) = <Loop@10*2 (e.A t.B) W S W e.C3>;
(e.A) t.B (W W t.C2 W W e.C5) = <Loop@18 (e.A t.B W S) W t.C2 e.C5>;
(e.A) t.B (W W t.C2 W t.C4 W W W W W W e.C11)
= <Loop@52 (e.A t.B W S W W t.C2) W t.C4 W W W W e.C11>;
…
Почему вопиющий случай? Зачем новая заявка (почему не #332)?
Вопиющая потому что
во-первых, 11 строк кода взрываются до 835/15 555, что, очевидно, жесть,
во-вторых, я уже хотел выпустить версию 3.4, как вылезла эта ошибка.
Заявка #332 предполагается как долгоиграющая — когда я её буду исправлять, не известно. А эту хочется исправить в самое ближайшее время.
Возможные решения
Забить
Т.е. запушить новый коммит (он должен быть с обновлением NEWS.md, и, если повезёт, в случайных тестах эта ошибка не повторится.
✔Самое простое решение.
❌Ошибку всё равно придётся решать.
❌Не красиво, что ошибка сборки в Версия 3.4 #361 не исправлена (другие ошибки сборки исправлялись последующими коммитами).
Придумать костыль
Например, снизить наибольшее число экземпляров (сейчас такой костыль есть, ограничивает число экземпляров 99, 54c28ca). Либо можно ограничить максимальную глубину истории. Для последнего можно самоприменить компилятор и посмотреть максимальную глубину истории в нём.
✔Относительно простое решение.
❌Костыль всегда не эстетичен. Грязное решение.
Ослабить отношение остановки
Сейчас используется честное отношение Хигмана-Крускала. Выбор другого варианта — это всё-таки исследовательская работа, быстро сделать не получится. Идеи описаны в комментариях #332 (comment), #332 (comment) и #332 (comment).
✔Возможно, заработает.
❌Другое отношение снизит глубину оптимизации. Возможно, снизит криво — очевидные оптимизируемые места оптимизироваться не будут. Т.е. надо внимательно исследовать.
❌Хз, какое новое отношение выбрать.
Специальное сопоставление с образцом для специализации
Описано оно в комментарии #332 (comment). Если кратко, то алгоритм сопоставления с образцом, злоупотребляя динамическим обобщением, гарантирует, что для любого предложения специализируемой функции построится не более одного предложения в экземпляре. Участки аргумента, сопоставление с которыми приводит к ветвлению, принудительно обобщаются.
✔Скорее всего, решит описываемую проблему. В экземплярах сейчас строится по 4 предложения, т.е. первое предложение расщепляется на 3. Применение нового алгоритма сопоставления с образцом приведёт, скорее всего, к динамическому обобщению до тривиальной сигнатуры.
❌Нетривиальная правка алгоритма обобщённого сопоставления. В состояние алгоритма нужно будет протащить флаг, указывающий на специальный режим работы.
❌Нужно проверить, насколько ухудшится в этом режиме оптимизация.
Перестройка сверху (честная)
В комментарии #332 (comment) предлагается серьёзно модифицировать алгоритм оптимизации, чтобы при специализации использовалась перестройка сверху. Скорее всего, это снизит число экземпляров в данной задаче до разумной величины (см. первый комментарий #362 (comment)).
✔Скорее всего, это решит проблему. По историям сигнатур видно, что в некоторых случаях перестройка сверху срезала бы часть истории:
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-переменными:
Loop@10 {
(e.X) t.X s.X s.X1 W e.X2 = <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 = <Loop@17 (e.X) t.X s.X s.X1 t.X1 e.X3>;
(e.X) t.X s.X s.X1 e.X2 t.X3 t.X4 W e.X6
= <Loop@4 (e.X t.X s.X s.X1 W W e.X2) t.X3 t.X4 e.X6>;
(e.X) t.X s.X s.X1 e.X1 = e.X t.X s.X s.X1 W W e.X1;
}
Loop@26 {
(e.X1) t.X2 s.X2 t.X3 W e.X3 = <Loop@28 (e.X1 t.X2) s.X2 t.X3 W e.X3>;
(e.X1) t.X2 s.X2 t.X3 t.X4 W e.X5
= <Loop@39 (e.X1) t.X2 s.X2 t.X3 t.X4 e.X5>;
(e.X1) t.X2 s.X2 t.X3 e.X3 t.X5 t.X6 W e.X8
= <Loop@4 (e.X1 t.X2 s.X2 t.X3 W W e.X3) t.X5 t.X6 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:
F@i {
ARG = <F@k ARG′>
}
История экземпляра F@k будет расти не от истории F@j, а от F@i. Назовём это халтурной перестройкой сверху.
Очевидно, что экземпляры, построенные после F@i, в программе останутся, хоть вызываться из F@i не будут. Возможно, специализатор продолжит оптимизировать в них заведомо бессмысленные вызовы. Они могут потом потереться на последнем проходе — удалении невызываемых функций¹. Или не потереться, если в них есть «косые стрелки».
¹ Этот проход в качестве корневого множества рассматривает все функции без суффиксов — функции исходной программы. Поэтому в логе можно видеть функцию Loop, которая ниоткуда не вызывается.
Пропатченные экземпляры вида F@i из примера выше будут встраиваться в точки вызова на проходе прогонки экземпляров.
Если специализация разных дочерних экземпляров будет требовать разный патч для родителя, то будет выбираться произвольный патч — какой первый попадётся.
✔Подход будет снижать объём остаточной программы как минимум из-за того, что размер некоторых экземпляров будет сокращаться (тем более, они в режиме -OA будут встраиваться в точки вызова, а затем вытираться как неиспользуемые).
✔Вероятно, решит и текущую задачу. Выход за лимит шагов возникал вроде на стадии прогонки экземпляров.
✔❓Думаю, проблему можно решить не более чем 100 новыми строками кода. Серьёзно сломаться ничего не должно.
Вывод
А нет пока вывода. Я ещё не выбрал вариант. Напишу в комментариях. Склоняюсь к последнему.
Проблема
При проверке pull request’а #361 упали автотесты: https://github.com/bmstu-iu9/refal-5-lambda/pull/361/checks?check_run_id=3404836202.
Из артефактов стало понятно, что не хватило лимита шагов на случайно сгенерированный тест:
Сам тест.
Данный тест удалось сузить до следующей программы (которой по-прежнему не хватает шагов):
Скачать: bloat-condition.ref. Последнее условие в первом предложении пустое, и оно нужно. Без него ошибка не воспроизводится.
Я достал из лога программу с рассахаренными условиями (т.к. выпало на тесте без
-OC+), упростил полученную программу, переименовал функции и переменные:Скачать: bloat-basic.ref. Заметим, что функция
Loopявляется синтаксическим мономом, если первое предложение убрать, её поведение сохранится.Полный лог компиляции (11 мегабайт): bloat-basic.log.
Так вот, для функции
Loopстроится 56 экземпляров:Фрагмент лога
Остаточная программа до прогонки экземпляров содержит 835 строк, после прогонки экземпляров — 15 555 строк (да, четыре пятёрки: residual.txt).
Типичный экземпляр до прогонки экземпляров:
Начало финальной остаточной программы:
Почему вопиющий случай? Зачем новая заявка (почему не #332)?
Вопиющая потому что
Заявка #332 предполагается как долгоиграющая — когда я её буду исправлять, не известно. А эту хочется исправить в самое ближайшее время.
Возможные решения
Забить
Т.е. запушить новый коммит (он должен быть с обновлением
NEWS.md, и, если повезёт, в случайных тестах эта ошибка не повторится.Придумать костыль
Например, снизить наибольшее число экземпляров (сейчас такой костыль есть, ограничивает число экземпляров 99, 54c28ca). Либо можно ограничить максимальную глубину истории. Для последнего можно самоприменить компилятор и посмотреть максимальную глубину истории в нём.
Ослабить отношение остановки
Сейчас используется честное отношение Хигмана-Крускала. Выбор другого варианта — это всё-таки исследовательская работа, быстро сделать не получится. Идеи описаны в комментариях #332 (comment), #332 (comment) и #332 (comment).
Специальное сопоставление с образцом для специализации
Описано оно в комментарии #332 (comment). Если кратко, то алгоритм сопоставления с образцом, злоупотребляя динамическим обобщением, гарантирует, что для любого предложения специализируемой функции построится не более одного предложения в экземпляре. Участки аргумента, сопоставление с которыми приводит к ветвлению, принудительно обобщаются.
e.X … e.Y, описанных в том же комментарии Древесные оптимизации раздувают программы #332 (comment) и реализованных в фиксации 916efbf.Перестройка сверху (честная)
В комментарии #332 (comment) предлагается серьёзно модифицировать алгоритм оптимизации, чтобы при специализации использовалась перестройка сверху. Скорее всего, это снизит число экземпляров в данной задаче до разумной величины (см. первый комментарий #362 (comment)).
Loop@10иLoop@26различаются только s- и t-переменными:Перестройка сверху (халтурная)
Сейчас при обнаружении зацикливания между старой сигнатурой
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:История экземпляра
F@kбудет расти не от историиF@j, а отF@i. Назовём это халтурной перестройкой сверху.Очевидно, что экземпляры, построенные после
F@i, в программе останутся, хоть вызываться изF@iне будут. Возможно, специализатор продолжит оптимизировать в них заведомо бессмысленные вызовы. Они могут потом потереться на последнем проходе — удалении невызываемых функций¹. Или не потереться, если в них есть «косые стрелки».¹ Этот проход в качестве корневого множества рассматривает все функции без суффиксов — функции исходной программы. Поэтому в логе можно видеть функцию
Loop, которая ниоткуда не вызывается.Пропатченные экземпляры вида
F@iиз примера выше будут встраиваться в точки вызова на проходе прогонки экземпляров.Если специализация разных дочерних экземпляров будет требовать разный патч для родителя, то будет выбираться произвольный патч — какой первый попадётся.
-OAбудут встраиваться в точки вызова, а затем вытираться как неиспользуемые).Вывод
А нет пока вывода. Я ещё не выбрал вариант. Напишу в комментариях. Склоняюсь к последнему.
@TonitaN, какой вариант тебе больше нравится?