Преобразовать пару из списка int в логическую матрицу в OCaml - PullRequest
3 голосов
/ 22 декабря 2011

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

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

РЕДАКТИРОВАТЬ:

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

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

Тип после хода выглядит следующим образом:

[("name"; ["string"]); ("label"; ["nonNegativeInteger"; "name"]) ...]

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

1 Ответ

3 голосов
/ 22 декабря 2011

Функция 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;;

Это явно не лучший способ писать подобные вещи, но вы поняли.

...