Skip to content

Разрешить аргументам прогоняемых функций быть активными #230

@Mazdaywik

Description

@Mazdaywik

В текущей реализации прогонки аргументы встраиваемых и прогоняемых функций могут быть только пассивными:

/* Попытка оптимизации, только если вызов пассивный */
, <IsPassiveCall e.Args>: True
= <Solve

/* Попытка оптимизации, только если вызов пассивный */
, <IsPassiveCall e.Args>: True
= <Solve

Это было намеренным ограничением на ВКР @InfiniteDisorder‘а, поскольку содержательной частью работы был алгоритм обобщённого сопоставления и собственно прогонка.

Однако, можно прогонять и вызовы, аргументы которых содержат другие вызовы. Причём это описано даже в классических статьях Турчина (Турчин, 1972 и Турчин, 1974). Вызовы функций заменяются новыми e-переменными (т.н. «неразменными» переменными), которые запрещено сужать. Если решение уравнения содержит сужение «неразменной» переменной — то этот вызов просто оптимизировать нельзя.

Тонкость здесь в том, что вызовы функций могут иметь побочный эффект, а при встраивании-прогонке они могут переупорядочиться (включая дублирование и удаление). Соответственно, также нужно будет контролировать, что прогонка не меняет относительный порядок вызовов.

Metadata

Metadata

Assignees

Labels

Type

No type
No fields configured for issues without a type.

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions