Я хочу написать функцию, и я хочу узнать о том, как уточнить и описать словами (анализом) код, прежде чем я собираюсь написать его.
Итак, вот функция, которую я хочу написать: сравнить два класса эквивалентности, используя булеву матрицу
У меня есть логическая матрица, 2 класса эквивалентности являются входными данными, они представляют собой список int
. Выходными данными является сравнение двух классов эквивалентности.
Условия для сравнения 2 списка классов эквивалентности:
1) булева матрица является транзитивным замыканием
2) проверить каждый элемент каждого класса, если эти элементы сопоставимы (имеет путь, связанный с ними), сравнить их. Элемент может подключаться к элементу 0
или n
в другом классе. Бросьте исключение, когда между ними нет связи.
например: i
подключен к j
и h
; k
и u
находятся в одном классе эквивалентности; j
подключен к k
i -> j -> k <-> u
|
v
h
3) если два элемента находятся в одном классе эквивалентности, они равны (0
); если они имеют путь от i
до j
, то i < j (-1)
, в противном случае i > j (1).
4) каждый класс эквивалентности появляется только один раз, и каждый класс эквивалентности содержит хотя бы один элемент.
Вот функция:
let cmp_classes m c c' =
match c, c' with
| i :: is, j :: js ->
(* when i and j has path *)
if m.(i).(j) = true then compare i j else
(* when i and j don't have path*)
if m.(i).(j) = false then
(* find k in js *)
...
(* check if i and k has path or not, if yes: compare i k; if no: find h in is*)
....
(* find h in is*)
....
(* check if h has path to j or not, if yes: compare h j; if no: check h and k *)
.....
(* check h and k has path or not, if yes: compare h k; if no: there is no path*)
.....
| _ -> assert false
Я хочу, чтобы вы мне помогли, потому что я хочу иметь возможность написать больше функций, заслуживающих доверия с самого начала, имея хорошее и четкое описание. Огромное спасибо.