我在这个问题上明确提出问题。 我有这样一个图:有条件打印
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"]);
]
我提取的列表defined
和undefined
,结果是这样的:
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
中的所有元素。我不想那样。
而我不是我怎么能写出最后的功能与打印我输出我想在最后。
感谢您的帮助!老实说,我正在努力表明它是一个等价类。 – Quyen 2012-01-13 10:00:16
你用'newordered'还是创建'newordered'挣扎?因为'newordered'中同一列表中的两个标签是等价类。 – pad 2012-01-13 10:05:50
都!上面的函数'new_sort'是我为'newordered'编写的内容,但我不希望它在这个新列表中添加未定义列表的类型。我只知道它是在等价类中调用的,但是当它有1个元素时怎么样?我的意思是当它有1个元素时,检查它可以调用的条件,以及它是等价类时的条件。这是我调用的函数,让print = List.iter(fun eqvclass - > print_defined_equivalence eqvclass)new_sort – Quyen 2012-01-13 10:33:34