Ocaml 传递闭包与等价类

Ocaml 传递闭包与等价类,ocaml,Ocaml,我想问一下等价类中的传递闭包和排序 我有一个布尔矩阵,我想要的结果是,从布尔矩阵,我计算传递闭包,找到等价类,并对所有这些等价类排序 例如:我有一个图表 0 <-> 1 | v 2 01 | v 2. 我有两个等价类{0;1};{2},对这个类进行排序的结果是:{2}在类{0;1}之后 1) 我想更多地了解为什么从传递闭包中我可以找到等价类?你能给我举个例子吗?我很容易通过例子理解 2) 这里有一个例子。我正在用上面描述的算法进行测试 let

我想问一下等价类中的传递闭包和排序

我有一个布尔矩阵,我想要的结果是,从布尔矩阵,我计算传递闭包,找到等价类,并对所有这些等价类排序

例如:我有一个图表

0 <-> 1
      |
      v
      2
01
|
v
2.
我有两个等价类{0;1};{2},对这个类进行排序的结果是:{2}在类{0;1}之后

1) 我想更多地了解为什么从传递闭包中我可以找到等价类?你能给我举个例子吗?我很容易通过例子理解

2) 这里有一个例子。我正在用上面描述的算法进行测试

let matrix = 
[|[| false; true; false; false|];
  [| false; false; false; false|];
  [| true; true; false; true|];
  [| false; false; false; false|];
|]

(* compute a transitive closure of a matrix *)
let transClosure matrix =
  let n = Array.length matrix in
  for k = 0 to n - 1 do
    let mk = matrix.(k) in
    for i = 0 to n - 1 do
      let mi = matrix.(i) in
      for j = 0 to n - 1 do
    mi.(j) <- max mi.(j) (min mi.(k) mk.(j))
      done;
    done;
  done;
  matrix;;

(* compute transitive closure of boolean matrix *)
let tc_ma = transClosure matrix;;
(* compute equivalence classes on transitive closure*)
let eq = equivalence_classes tc_ma;;
(* sorting all equivalence classes *)
let sort = sort_equivalence_classes tc_ma eq;;
let矩阵=
假的;真的;假的;假的;
[|假;假;假;假|];
[真;真;假;真];
[|假;假;假;假|];
|]
(*计算矩阵的传递闭包*)
let变换闭矩阵=
设n=Array.length矩阵in
对于k=0到n-1 do
设mk=矩阵(k)in
对于i=0到n-1 do
设mi=矩阵(i)in
对于j=0到n-1 do
mi.(j)在您的示例中,转换闭合函数不会改变矩阵。这对于您的示例是正确的,但是您应该使用更多的输入来测试此函数,以了解它是否工作

一个错误是等价类函数假设所有关系都是对称的,并且只检查一个方向。如果它看到i->j,它也假设j->i。 您的数据并非如此,因此您得到的结果不正确。您的矩阵示例具有关系0->1、2->0、2->1和2->3。没有循环,因此不应生成等价类。一旦有了循环,传递闭包就应该将它们转换为自反对称子集

另一个问题是你们的关系不是自反的,但你们需要自反才能得到单例等价集

因此,要实现这一点,您需要1)使关系自反,2)修复等价类函数以检查两个方向。

在您的示例中,转换闭合函数不会改变矩阵。这对于您的示例是正确的,但是您应该使用更多的输入来测试此函数,以了解它是否工作

一个错误是等价类函数假设所有关系都是对称的,并且只检查一个方向。如果它看到i->j,它也假设j->i。 您的数据并非如此,因此您得到的结果不正确。您的矩阵示例具有关系0->1、2->0、2->1和2->3。没有循环,因此不应生成等价类。一旦有了循环,传递闭包就应该将它们转换为自反对称子集

另一个问题是你们的关系不是自反的,但你们需要自反才能得到单例等价集


因此,要使其正常工作,您需要1)使关系自反,2)修正等价类函数以检查两个方向。

非常感谢,您的答案对我来说非常清楚。谢谢:)非常感谢,你的回答我很清楚。谢谢:)