уточнить и описать функцию перед написанием кода - PullRequest
0 голосов
/ 18 января 2012

Я хочу написать функцию, и я хочу узнать о том, как уточнить и описать словами (анализом) код, прежде чем я собираюсь написать его.

Итак, вот функция, которую я хочу написать: сравнить два класса эквивалентности, используя булеву матрицу

У меня есть логическая матрица, 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

Я хочу, чтобы вы мне помогли, потому что я хочу иметь возможность написать больше функций, заслуживающих доверия с самого начала, имея хорошее и четкое описание. Огромное спасибо.

1 Ответ

2 голосов
/ 18 января 2012

Я не уверен, что понимаю ваш вопрос, но могу попытаться ответить в любом случае.

  • Чтобы представить ваши классы эквивалентности, вам не нужен список целых чисел.Вы можете выбрать уникальный представитель (например, меньшее целое число в классе) или любой другой (так как вам все равно, так как у вас все равно есть транзитивное замыкание отношения);

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

    let compare m i j = match m.(i).(j), m.(j).(i) with
      (* same class: there is a path between i and j, and between j and i *)
      | true, true  -> 0
    
      (* there is a path between i and j *) 
      | true, false -> -1
    
      (* there is a path between j and i *) 
      | false, true -> 1
    
      (* i and j are not comparable *)
      | false, false -> raise Not_found
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...