Spec-Zone.ru › OCaml

Модуль Диффинга

module Diffing: sig .. end

Параметрический диффинг

Этот модуль реализует диффинг над списками произвольного содержимого. Он параметризован

  • Содержимым двух списков
  • Свидетелем равенства, когда элемент сохраняется
  • Свидетелем диффинга, когда элемент изменяется

Диффинг расширен для поддержания состояния в зависимости от вычисленных изменений во время прохода по двум спискам.

Основной алгоритм — это модифицированный алгоритм Вагнера-Фишера (см. <https://en.wikipedia.org/wiki/Wagner%E2%80%93Fischer_algorithm>).

Мы предоставляем следующую гарантию: для двух списков l и r, если разные патчи приводят к разным состояниям, мы говорим, что состояние расходится.

  • Мы всегда возвращаем оптимальный патч для префиксов l и r, на которых состояние не расходится.
  • В противном случае мы возвращаем корректный, но не оптимальный патч, где подпатчи без расходящихся состояний являются оптимальными для заданного начального состояния.

Более точно, оптимальность Вагнера-Фишера зависит от свойства, что расстояние редактирования между k-префиксом левого входного списка и l-префиксом правого входного списка d(k,l) удовлетворяет

d(k,l) = min ( стоимость_удаления + d(k-1,l), стоимость_вставки + d(k,l-1), стоимость_изменения + d(k-1,l-1) )

При этом предположении, оптимальным является жадное выбор состояния минимального патча, преобразующего левый k-префикс в правый l-префикс, в качестве представителя состояний всех возможных патчей, преобразующих левый k-префикс в правый l-префикс.

Если это свойство не выполняется, мы все равно можем жадно выбрать представительское состояние. Однако вычисленный патч больше не гарантированно является глобально оптимальным. Тем не менее, это по-прежнему корректный патч, который является даже оптимальным среди всех изученных патчей.

module type Defs = sig .. end

Основные типы реализации диффинга

type change_kind = 
| Deletion
| Insertion
| Modification
| Preservation

Вид изменений, используемый для совместного использования печати и стилей в реализации

val prefix : Format.formatter -> int * change_kind -> unit
val style : change_kind -> Misc.Style.style list
type ('left, 'right, 'eq, 'diff) change = 
| Delete of 'left
| Insert of 'right
| Keep of 'left * 'right * 'eq
| Change of 'left * 'right * 'diff
val classify : ('a, 'b, 'c, 'd) change -> change_kind
module Define: functor (D : Defs) -> sig .. end

Define(Defs) создает типы диффинга из типов, определенных в Defs, и функторы, которые необходимо инициировать параметрами алгоритма диффинга

© 1995-2024 INRIA.
https://ocaml.org/manual/5.2/api/compilerlibref/Diffing.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API