2012-01-18 12 views
-1

私は関数を書いておきたいと思います。書く前にコードを明確にし、記述(解析)したいと思っています。だからここ コードを書く前に関数を明確に記述する

は私が書きたいの関数である:私はブール行列を持つブール行列

を使用して、2つの等価クラスを比較し、2つの等価クラスは、彼らがintのリストです入力されています。出力は、2つの等価クラスの比較です。

2つのリスト等価クラス比較する条件:

1)ブール行列は、推移閉包

2である)これらの要素は(パスがそれらを接続した)同等である場合、各クラスのすべての要素を確認し、それらを比較する。要素は、別のクラスの0またはn要素に接続できます。それらの間に接続がない場合は例外をスローします。

例えば、ijhに接続します。 kuは同じ等価クラスにあります。 j 2つの要素は、それらが等しい同じ等価クラス(0)にある場合k

i -> j -> k <-> u 
| 
v 
h 

3)に接続されています。それらは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 

私は良いと明確な記述を持つことで、最初からより多くの機能を信頼できるを書くことができるようにしたいので、私は、あなたが私を助けたいです。どうもありがとうございます。

+0

私は本当に私たちとは思いませんあなたがしようとしていることがわからないため、あなたがしようとしていることを説明するのに役立ちます。 –

答えて

2

私はあなたの質問を理解しているとは確信していませんが、とにかく答えることができます。

  • 等価クラスを返すには、intのリストは必要ありません。一意の表現子(たとえば、クラスのより小さいint)を選択するか、いずれにしても(実際には気にしないように)、いずれかを選ぶことができます。

  • あなたのブール行列は2つの要素を比較するために、その後、あなたの関係の推移閉包を表している場合、あなただけのブール値をチェックする必要が...

    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 
    
関連する問題