我想编写一个函数,我想在编写代码之前通过单词(分析)来了解澄清和描述。
所以这是我想写的函数:使用布尔矩阵
比较两个等价类我有一个布尔矩阵,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
我希望你能帮助我,因为我希望能够从一开始就通过一个清晰的描述来编写更多值得信赖的功能。非常感谢。
答案 0 :(得分:2)
我不确定我理解你的问题,但无论如何我都可以尝试回答。
要重新发布您的等价类,您不需要一个整数列表。你可以选择一个唯一的代表(例如,类的较小的int),或者你可以选择任何(因为你并不在乎,因为你有关系可用的关系的传递闭包);
如果您的布尔矩阵表示关系的传递闭包,那么为了比较两个元素,您只需检查布尔值......
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