Сложные вычисления, состоящие из союзов, пересечений и различий, часто могут быть выражены разными способами. Существуют ли какие-либо теории или конкретные реализации, которые пытаются свести к минимуму количество вычислений, необходимых для достижения заданного ответа?
Например, я впервые наткнулся на практическое применение этого при попытке разложения атомов при моделировании аморфного материала в соседние оболочки, где первая оболочка является непосредственными соседями некоторого заданного атома происхождения, а вторая оболочка - это атомы которые являются соседями первой оболочки не в первой оболочке, а в ней раньше:
nth 0 = singleton i
nth 1 = neighbors i
nth n = reduce union (map neighbors (nth(n-1))) - nth(n-1) - nth(n-2)
Существует много разных способов решить эту проблему. Вы можете поэтапно проверять членство в каждом наборе при составлении результата или вы можете вычислить объединение трех соседних оболочек и использовать пересечение, чтобы удалить предыдущие две оболочки, оставив самую удаленную. На практике решения, требующие построения больших промежуточных наборов, медленнее.
Предположительно, реализация интеллектуального набора может составить выражение, которое должно быть оценено, а затем оптимизировать его (например, уменьшить размер промежуточных наборов), прежде чем оценивать его, чтобы повысить производительность. Существуют ли такие реализационные реализации?