2011-12-22 2 views
3

У меня есть функция, которая принимает (int * int list) list в булевую матрицу. Я опробовал свой счетчик, и он дал мне правильный ответ. Как и код ниже.Преобразование пары int-списка в булевую матрицу в OCaml

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 

я должен проверить это в моих реальных данных, это список xsds, как сценарий данных ниже. Например:

[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)] 

EDIT:

Спасибо за ответ от Томаса.

Я пропустил объяснение о типе, который я вернул, пересекая эти деревья.

Тип после обхода это выглядит этот список:

[("название" [ "строка"]); («label»; [«nonNegativeInteger»; «name»]) ...]

Из этого списка xsds я хотел бы представить булевую матрицу, чтобы показать зависимость между ними, например: имя типа зависит от типа строка; type этикетка зависит от типа nonNegativeInteger и name.

ответ

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 list) на matrx? Можно ли разбить список xsd? потому что в моем результате, когда я тестировал свои данные, он всегда занимал такую ​​позицию, как [(0; (0, 1); (1; (0; 1))], я не знаю, как я могу получить правильную позицию и вернуть правильное соединение между ними, например: «label» имеет соединение с «именем», где метка имеет позицию 1, а имя имеет позицию имени (0) в списке, а не начало новой позиции в список, я хочу, чтобы я мог показать зависимость между ними. – Quyen

+0

'mapping' содержит ассоциацию, которую вы хотите – Thomas

+0

Большое спасибо, теперь я понял, почему я застрял :) – Quyen