Если у вас есть два выражения с переменными, тогда алгоритм объединения пытается сопоставить два выражения и дает вам присваивание переменных, чтобы сделать два выражения одинаковыми.
Например, если вы представляли выражения в F #:
type Expr =
| Var of string // Represents a variable
| Call of string * Expr list // Call named function with arguments
И имели два таких выражения:
Call("foo", [ Var("x"), Call("bar", []) ])
Call("foo", [ Call("woo", [ Var("z") ], Call("bar", []) ])
Тогда алгоритм объединения должен дать вам назначение:
"x" -> Call("woo", [ Var("z") ]
Это означает, что если вы замените все вхождения переменной "x" в двух выражениях, результаты этих двух замен будут одним и тем же выражением.Если у вас были выражения, вызывающие различные функции (например, Call("foo", ...)
и Call("bar", ...)
), тогда алгоритм скажет вам, что они не являются единообразными.
В WikiPedia также есть некоторые объяснения , ипри поиске в Интернете вы наверняка найдете полезное описание (и, возможно, даже реализацию на каком-то функциональном языке, похожем на F #).