Интеллектуальные чисто функциональные множества

Сложные вычисления, состоящие из союзов, пересечений и различий, часто могут быть выражены разными способами. Существуют ли какие-либо теории или конкретные реализации, которые пытаются свести к минимуму количество вычислений, необходимых для достижения заданного ответа?

Например, я впервые наткнулся на практическое применение этого при попытке разложения атомов при моделировании аморфного материала в соседние оболочки, где первая оболочка является непосредственными соседями некоторого заданного атома происхождения, а вторая оболочка - это атомы которые являются соседями первой оболочки не в первой оболочке, а в ней раньше:

nth 0 = singleton i
nth 1 = neighbors i
nth n = reduce union (map neighbors (nth(n-1))) - nth(n-1) - nth(n-2)

Существует много разных способов решить эту проблему. Вы можете поэтапно проверять членство в каждом наборе при составлении результата или вы можете вычислить объединение трех соседних оболочек и использовать пересечение, чтобы удалить предыдущие две оболочки, оставив самую удаленную. На практике решения, требующие построения больших промежуточных наборов, медленнее.

Предположительно, реализация интеллектуального набора может составить выражение, которое должно быть оценено, а затем оптимизировать его (например, уменьшить размер промежуточных наборов), прежде чем оценивать его, чтобы повысить производительность. Существуют ли такие реализационные реализации?

Ответ 1

Ваш вопрос сразу же напомнил мне о потоке Haskell, описанном в этой статье. Общий принцип можно легко обобщить: вместо хранения списка вы сохраняете способ создания списка. Затем функции преобразования списка работают непосредственно на генераторе списка, что означает, что все операции сливаются в одно поколение данных без каких-либо промежуточных структур. Затем, когда вы закончите выполнение операций, вы запускаете генератор и создаете данные.

Итак, я думаю, что ответ на ваш вопрос заключается в том, что если вам нужен какой-то подобный интеллектуальный механизм, который сплавил вычисления и устранил промежуточные структуры данных, вам нужно будет найти способ превратить набор в "со-структуру" (что то, что называет бумага), которая генерирует набор и действует непосредственно на нем, а затем фактически генерирует набор, когда вы закончите.

Я думаю, что существует очень глубокая теория, лежащая в основе этой концепции, о которой намекает газета, но никогда не говорит, и если кто-то еще знает, что это такое, пожалуйста, дайте мне знать, потому что это очень важно для чего-то еще, что я делаю, тоже!