Предложенный код неверен , потому что мы рассматриваем только те сокращения, которые сокращают все три условия хотя бы на один шаг.Чтобы увидеть проблему, представьте, что все три кандидата Int
:
x = 1
l = 0
r = 2
Тогда у нас есть
shrink x = [0]
shrink l = []
shrink r = [1, 0]
Вложенное понимание списка этих трех списков не даст никаких значений, потому что нетподходящего кандидата на l
можно найти.Поэтому мы никогда не пробуем некоторые допустимые сокращения, такие как (0, 0, 1)
.Экземпляр shrink
для кортежей делает правильные вещи (предлагая каждое сокращение, где может быть сокращен хотя бы один термин), поэтому отображение на это решает проблему.