2012-01-11 46 views
1

请按照我上一个问题的示例:Error when convert to Boolean matrix以Coq格式打印等同类

let entries = [("name", ["string"]); ("label", ["nonNegativeInteger"; "symbol"]); 
("symbol", ["name"; "symbol"; "symbol"; "label"]); ("var", ["string"]); 
("term", ["var"; "symbol"; "term"]); ("rule", ["term"; "term"]); 
("rules", ["rule"]); ("dps", ["rules"]); ("trs", ["rules"]); 
("usableRules", ["rules"]); 
("number", ["integer"; "integer"; "positiveInteger"]); 
("coefficient",["number"; "minusInfinity"; "plusInfinity"; "vector"; "matrix"]) 
("vector", ["coefficient"]); ("matrix", ["vector"])] 

let defined = ["name"; "label"; "symbol"; "var"; "term"; "rule"; "rules"; 
"dps"; "trs"; "usableRules"; "number"; "coefficient"; "vector"; "matrix"] 

let undefined = ["string"; "nonNegativeInteger"; "integer"; "positiveInteger"; 
"minusInfinity"; "plusInfinity"] 

我计算具有以下功能:(详情请参阅此处:Transitive closure and equivalence classesAsking about return type, list and set data structure in OCaml

let rec position x = function 
| [] -> raise Not_found 
| y :: ys -> if x = y then 0 else 1 + position x ys 

let len_undefined = List.length undefined 

let num_of_name xsds undefined len_undefined s = 
    try (position s xsds) + len_undefined; 
    with Not_found -> position s undefined 

let name_of_num xsds undefined len_undefined k = 
    if k < len_undefined then 
    List.nth undefined k else 
    List.nth xsds (k - len_undefined) 

let matrix = 
    let len = List.length defined + len_undefined in 
    let boolmat = Array.make_matrix len len false in 
    List.iter (fun (s, strs) -> 
    let pos1 = num_of_name defined undefined len_undefined s in 
     List.iter (fun t -> 
    let pos2 = num_of_name defined undefined len_undefined t in 
    boolmat.(pos1).(pos2) <- true) strs) entries; 
    boolmat 

let transClosure m = 
    let n = Array.length m in 
    for k = 0 to n - 1 do 
    let mk = m.(k) in 
    for i = 0 to n - 1 do 
     let mi = m.(i) in 
     for j = 0 to n - 1 do 
    mi.(j) <- max mi.(j) (min mi.(k) mk.(j)) 
     done; 
    done; 
    done; 
    m;; 

let eq_class m i = 
    let column = m.(i) 
    and set = ref [] in 
    Array.iteri begin fun j l -> 
    if j = i || column.(j) && m.(j).(i) then 
     set := j :: !set else ignore l 
    end column; 
    !set;; 

let eq_classes m = 
    let classes = ref [] in 
    Array.iteri begin fun e _ -> 
    if not (List.exists (List.mem e) !classes) then 
     classes := eq_class m e :: !classes 
    end m; 
    !classes;; 

let cmp_classes m c c' = if c = c' then 0 else 
    match c, c' with 
    | i :: _, j :: _ -> if m.(i).(j) then 1 else -1 
    | _ -> assert false 

let sort_eq_classes m = List.sort (cmp_classes m);; 

let order_xsds = 
    let tc_xsds = transClosure matrix in 
    let eq_xsds = eq_classes tc_xsds in 
    let sort_eq_xsds = sort_eq_classes tc_xsds eq_xsds in 
    sort_eq_xsds 

let print = 
let f elem = 
    print_int elem ; print_string " " 
in List.iter f (List.flatten order_xsds);; 

let xsds_of_int = 
    List.map (List.map (name_of_num defined undefined len_undefined)) 

let xsds_sort = xsds_of_int order_xsds 

let print_string = 
let f elem = 
    print_string elem ; print_string " \n" 
in List.iter f (List.flatten xsds_sort);; 

我尝试打印结果看排序等价类:

var name symbol label plusInfinity minusInfinity positiveInteger integer number 
matrix vector coefficient nonNegativeInteger string term rule rules usableRules 
trs dps 

因为我必须以Coq格式打印,所以我必须将文件输出组合起来,所以我想按等效类结果的顺序打印结果,它看到一个等价类(“标签” - “符号”; “系数” - “基质” - “载体”)它应该打印:

编辑:

Inductive label := all the type label depends 
with symbol := all the type symbol depends. 

例如:

Inductive label := 
    | Label : nonNegativeInteger -> symbol -> label 
    with symbol := 
    | Symbol : name -> symbol -> symbol -> label -> symbol. 

当一个类型取决于它将打印对我来说,例如:

Definition name := string. 

并且当它大于2时依赖性PE,

Inductive numer := all the type number depends. 

例如:

Inductive number := 
|Number : integer -> integer -> positiveInteger -> number. 

我想类型的undefined类型列表之前应该打印后,将在列表中的排序后的结果打印(和所有类型undefined名单不应该再次打印),例如,结果我希望是这样的:

Definition string := string. 
Definition nonNegative := int. 
... 
Definition var := string. 
Definition name := string. 
Inductive label := ... 
with symbol := ... 

等等

你能帮我吗?

回答

1

我可能会感到困惑,但我认为你只是在寻找Printf模块和String.concat?例如

List.iter 
    (fun name -> 
     Printf.printf "Definition %s := %s.\n" name (defn_of name)) 
    undefined; 
List.iter 
    (fun eqvclass -> 
     Printf.printf "Inductive %s.\n" 
      (String.concat "\nwith " 
       (List.map 
        (fun name -> 
         Printf.sprintf "%s := %s" name (defn_of name)) 
        eqvclass))) 
    order_xsds 

(其中defn_of给出了定义的右侧)。