Сравнение изменений
module Diffing: sig .. end
Параметрическое сравнение изменений
Этот модуль реализует сравнение изменений в списках произвольного содержимого. Оно параметризуется следующими элементами:
- Содержимое двух списков
- Свидетельство равенства, когда элемент сохраняется
- Свидетельство изменения, когда элемент изменяется
Сравнение изменений расширено для сохранения состояния, зависящего от вычисленных изменений при обходе двух списков.
В основе лежит модифицированный алгоритм Вагнера — Фишера (см. <https://en.wikipedia.org/wiki/Wagner%E2%80%93Fischer_algorithm>).
Мы гарантируем следующее: для двух списков l и r, если разные патчи приводят к разным состояниям, мы говорим, что состояние расходится.
- Мы всегда возвращаем оптимальный патч для префиксов
lиr, на которых состояние не расходится. - В противном случае мы возвращаем корректный, но неоптимальный патч, в котором подпatti без расходящихся состояний оптимальны для заданного начального состояния.
Точнее, оптимальность алгоритма Вагнера — Фишера зависит от того, что расстояние редактирования между k-префиксом левого входного списка и l-префиксом правого входного списка d(k,l) удовлетворяет условию
d(k,l) = min ( del_cost + d(k-1,l), insert_cost + d(k,l-1), change_cost + d(k-1,l-1) )
При этом условии оптимально жадно выбирать состояние минимального патча, преобразующего k-префикс левого списка в l-префикс правого списка, в качестве представителя состояний всех возможных патчей, преобразующих k-префикс левого списка в l-префикс правого списка.
Если это свойство не выполняется, мы всё ещё можем жадно выбрать представляющее состояние. Однако вычисленный патч больше не гарантированно будет глобально оптимальным. Тем не менее это по-прежнему корректный патч, который даже оптимален среди всех рассмотренных патчей.
module type Defs = sig .. end
Основные типы реализации сравнения изменений
type change_kind =
|
| Deletion
|
|
| Insertion
|
|
| Modification
|
|
| Preservation
|
Тип изменений, используемый для унификации вывода и оформления в разных реализациях
val prefix : (int * change_kind) Format_doc.printer
val style : change_kind -> Misc.Style.style list
type ('left, 'right, 'eq, 'diff) change =
|
| Delete of
|
|
| Insert of
|
|
| Keep of
|
|
| Change of
|
val classify : ('a, 'b, 'c, 'd) change -> change_kind module Define: functor (D : Defs) -> sig .. end
Define(Defs) создаёт типы сравнения изменений на основе типов, определённых в Defs, и функторов, которые необходимо инстанцировать с параметрами алгоритма сравнения изменений
© 1995-2026 INRIA.
https://ocaml.org/manual/5.5/api/compilerlibref/Diffing.html