2012-01-13 13 views
2

私はこの質問ではっきりと質問をします。条件で印刷

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

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

は関係が異なり、私はリストdefinedundefined、このような結果を抽出entries

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

リストで説明します 私はこのようなグラフが持っています計算した後、注文した新しいリストを受け取った:

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

私はこのような条件でorderedの出力を印刷機能を書きたい:私はリストorderedで新しいリストを生成する関数を持ちたい

1)であればundefinedの要素それを削除するように見える。私は彼らを印刷したい

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

2)この条件に依存します:

それだけで一つのタイプが依存する場合、それが印刷されます:

Definition name := type depend. 
私はこのような neworderedが期待してい

はequivalance(< - > 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) 

を、私は別のものを持っていますundefinedリスト

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

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

orderedリスト内の重複を除去するが、このリストはstring listであり、それは追加機能フォントをundefinedに登録してください。最後の機能を印刷すると、undefinedのすべての要素を最初に印刷すると、undefinedが複製されます。私はそれを望んでいません。

そして私は最終的に私が最後に望む出力を私のためにプリントする最後の機能をどのように書くことができるのか分かりません。

答えて

1

まず、私はentriesを調べることにより、ラベルの関係の文字列表現を返すためにdefn_of機能を修正:

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にoccuring一つの要素ですべてのリストをフィルタリングされています。いつものように

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

、印刷機能はPrintfモジュールとString.concat内の関数に基づいています。

ケース1:undefined内のすべてのラベルの、上記のあなたのprint_undfined機能を使用 あなたの印刷タスクでの2つのケースがあります。

ケース2:neworderedで任意のリストxsためxsが一つだけの要素を持っている場合、それは何の等価クラスが存在しないことを意味します。 xsは、少なくとも2つの要素を持っている場合は、等価クラスは、印刷する必要があります。

側の注意点として
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

+0

'newordered'を使ったり、' newordered'を作成するのに苦労していますか? 'newordered'の同じリストの2つのラベルは等価クラスです。 – pad

+0

!上記のnew_sort関数は 'newordered'のために書いたものですが、この新しいリストに未定義リストの型を追加したくありません。私はそれが等価クラスにあるときに呼び出すことを知っていますが、要素が1つのときはどうですか?つまり、要素が1つのときに呼び出すことができるかどうか、等価クラスであるかどうかをチェックするということです。これは私が呼び出す関数です。print = List.iter(fun eqvclass - > print_defined_equivalence eqvclass)new_sort – Quyen

関連する問題