2011-12-22 82 views
3

我有一個將(int * int list) list作爲布爾矩陣的函數。我測試了我的反例,它給了我一個正確的答案。像下面的代碼。在OCaml中將一對int列表轉換爲布爾矩陣

let to_matrix l = 
let n = List.length l in 
    let m = Array.make_matrix (n + 1) (n + 1) false in 
    List.iter (fun (i, j) -> 
    List.iter (fun t -> 
    m.(i).(t) <- true) j) l; 
    m;; 

let ex = to_matrix [(0, [1; 0]); (1, [0]); (2, [1])];; 

它給了我一個矩陣:

true true false false 
true false false false 
false true false false 
false false false false 

我就來測試一下我的真實數據,這是一個的XSD列表,像下面的數據腳本。例如:

[Elt ("name", Some (SimpleType "string"), 1, Bound 1); 
    Group ("label", 
    Some 
    (Choice 
     [Elt ("numberLabel", 
     Some 
      (Sequence 
      [Elt ("number", Some (SimpleType "nonNegativeInteger"), 0, 
       Unbounded)]), 
     1, Bound 1); 
     Elt ("symbolLabel", 
     Some (Sequence [GroupRef ("name", 0, Unbounded)]), 1, Bound 1)]), 
    1, Bound 1)] 

編輯:

感謝托馬斯的答案。

我錯過了關於從遍歷這些樹返回的類型的解釋。

遍歷它看起來像該列表後的類型:

[( 「姓名」; 「字符串」]); (「label」; [「nonNegativeInteger」;「name」])...]

從這個xsds列表我想要表示一個布爾矩陣來顯示它們之間的依賴關係,例如:類型名稱取決於類型串;鍵入 標籤取決於類型nonNegativeInteger和名稱。

回答

3

功能to_matrix是錯誤的。

你可以看到它,如果你有to_matrix [(0, [2])];;

爲了測試它,使其工作,你需要找到一種方法,你的列表'a映射到[0..(n-1)]其中n是出現在元素的個數您名單。

一種可能的方法是使用的關聯列表:

let mapping = ref [] 
let int_of_a a = 
    if List.mem_assq a !mapping then 
    List.assq a !mapping 
    else 
    let n = List.length !mapping in 
    mapping := (a, n) :: !mapping; 
    n 

,並改變你的to_matrix功能是:

let to_matrix l = 
    (* step 1: registering your inputs *) 
    mapping := []; 
    let register i = ignore (int_of_a i) in 
    List.iter (fun (i, j) -> 
    register i; 
    List.iter register j 
) l; 
    let n = List.length !mapping in 
    (* step 2: creating and populating your matrix *) 
    let m = Array.make_matrix n n false in 
    List.iter (fun (i, j) -> 
     List.iter (fun t -> 
     m.(int_of_a i).(int_of_a t) <- true 
    ) j 
    ) l; 
    m;; 

這顯然不寫這樣的事情最好的辦法,但你明白了。

+0

感謝您的回答。有什麼辦法,我可以把我的xsd列表沒有拆分我的xsd列表到(int * int列表)列表到matrx?是否有可能分裂我的xsd列表?因爲在我用我的數據測試時,結果總是像[(0;(0,1);(1;(0; 1))]這樣的位置,我不知道如何才能獲得正確的位置並返回它們之間的正確連接,例如:「label」與「name」具有連接,其中標籤具有位置1,並且名稱在列表中具有名稱(0)的位置,不在一個列表我想要的是我可以顯示它們之間的關係依賴 – Quyen 2011-12-23 04:16:53

+0

'映射'包含你想要的關聯 – Thomas 2011-12-23 11:44:42

+0

非常感謝你,現在我明白了爲什麼我卡住了:) – Quyen 2011-12-30 04:39:03