Предположим, я дал вам список классов эквивалентности. Можете ли вы выяснить, как вставить еще один элемент в этот список?
Например, предположим, что элементы - это строки, а классы эквивалентности - строки одинаковой длины. Тогда список [["fox","the","dog"],["brown","jumps"],["over","lazy"]]
является списком классов эквивалентности, потому что, например, "fox"
соответствует длине "dog"
, "brown"
соответствует длине "jumps"
и т. Д.
Если мы теперь вставим строку "quick"
в этот список классов, как должен выглядеть результат? Ясно, что он должен быть добавлен в список ["brown","jumps"]
, поэтому, возможно, результат будет выглядеть как [["fox","the","dog"],["quick","brown","jumps"],["over","lazy"]]
Как только вы решите эту проблему, все остальное легко. Вот подсказка:
fun equivalenceClasses (f, xs) =
case xs of
[] => ???
| x :: xs' => let
val c = equivalenceClasses xs'
in
???
end