2012-01-13 47 views
2

我在這個問題上明確提出問題。 我有這樣一個圖:有條件打印

a <-> b -> e -> f 
|   | 
v   v 
h <------- g 
|   | 
v   v 
u   k 

有依賴關係列表中的描述entries

let entries = [ 
    ("a", ["b"; "h"]); 
    ("b", ["a"; "e"]); 
    ("e", ["f"; "g"]); 
    ("g", ["h"; "k"]); 
    ("h", ["u"]); 
] 

我提取的列表definedundefined,結果是這樣的:

let defined = ["a"; "b"; "e"; "g"; "h"; "u"] 
let undefined = ["f"; "k"] 

經過計算,我得到了一個新的名單與他們的訂購:

let ordered = [["u"];["h"]; ["k"]; ["g"]; ["f"]; ["e"]; ["b"; "a"]] 

我想寫打印ordered輸出在這樣的條件下這樣的功能:

1)我想有就會在列表中ordered產生一個新的列表功能如果undefined元素出現它會將其刪除。我期待一個newordered這樣的:

newordered = [["u"]; ["h"]; ["g"]; ["e"]; ["b"; "a"]] 

2)我想打印其取決於這個條件:

當它只是一種依賴,它會打印:

Definition name := type depend. 

當它是一個等價性(一個< - > b)中,將打印:

Inductive name1 := type depend 1 
with name2 := type depend 2. 

WH恩它的類型取決於列表,它會打印:

Inductive name := type depend. 

當看到undefined列表中的類型,當它不依賴型,它將打印:

Definition name := name. 

,並與順序在newordered列表

輸出我期待這樣的順序:

Definition k := k. 
Definition f := f. 
Definition u := u. 
Definition h := u. 
Inductive g := h -> k. 
Inductive e := f -> g. 
Inductive b := a -> e 
with a := b -> h. 

我寫這些功能,首先我打印不確定的列表中的所有元素:

let print_undfined = 
List.iter (fun name -> Printf.printf "\nDefinition %s := %s." name name; 
     print_string "\n")undefined 

我有打印權限的功能 - 條目列表的右側:

let defn_of = 
    List.iter (fun (_, xs) -> 
    List.iter (fun t -> Printf.printf "%s" t) xs) 

我有另一個功能刪除在ordered列表中的重複與undefined列表

let rec uniquify = function 
| [] -> [] 
| x::xs -> x :: uniquify (List.filter ((<>) x) xs) 

let new_sort = uniquify (undefined @ List.flatten ordered) 

但這份名單是string list,並將其添加編輯字體中的undefined列表。所以如果我打印我的最後一個功能,它將複製undefined如果我選擇先打印undefined中的所有元素。我不想那樣。

而我不是我怎麼能寫出最後的功能與打印我輸出我想在最後。

回答

1

首先,我糾正defn_of功能,通過查找entries返回標籤的關係的字符串表示:

let defn_of label = 
    try 
     let (_, xs) = List.find (fun (l, ys) -> l = label) entries in 
     String.concat "->" xs 
    with 
     Not_found -> "" 

其次,你在new_sort返回(這應該是newordered),顯然是錯誤的。你真正想要的是undefined篩選出一個元素髮生的歷史所有列表:

let newordered = List.filter (function [x] -> List.for_all((<>) x) undefined 
             | _ -> true) ordered 

像往常一樣,打印功能是基於Printf模塊和String.concat功能。 有兩種情況在您的打印任務:

案例1:的所有標籤中undefined,使用上面的print_undfined功能。

案例2:newordered任何名單xs,如果xs只有一個元素,這意味着沒有等價類存在。如果xs至少有兩個元素,等價類應印:

let print_defined_equivalence xs = 
    match xs with 
    | [] ->() 
    | [x] -> Printf.printf "\nInductive %s := %s." x (defn_of x) 
    | _ -> 
     let ys = String.concat "\nwith" 
        (List.map (fun x -> 
        Printf.sprintf "%s := %s" x (defn_of x)) 
         xs) in 
     Printf.printf "\nInductive %s." ys 

作爲一個方面說明,我選擇來處理空單爲newordered元素雖然它沒有在您的測試情況下發生。另一件事是entries被遍歷多次查找元素,應該更改爲Map數據類型,特別是當entries大時。

鑑於我已經明確說明每種情況的條件,您應該能夠將這些功能插入到您的程序中。

+0

感謝您的幫助!老實說,我正在努力表明它是一個等價類。 – Quyen 2012-01-13 10:00:16

+0

你用'newordered'還是創建'newordered'掙扎?因爲'newordered'中同一列表中的兩個標籤是等價類。 – pad 2012-01-13 10:05:50

+0

都!上面的函數'new_sort'是我爲'newordered'編寫的內容,但我不希望它在這個新列表中添加未定義列表的類型。我只知道它是在等價類中調用的,但是當它有1個元素時怎麼樣?我的意思是當它有1個元素時,檢查它可以調用的條件,以及它是等價類時的條件。這是我調用的函數,讓print = List.iter(fun eqvclass - > print_defined_equivalence eqvclass)new_sort – Quyen 2012-01-13 10:33:34