OCaml 断言失败

问题描述 投票:0回答:1

这是我的代码,它应该是什么

前缀:'列表 -> '列表列表 prefixes l 返回输入列表 l 的所有非空前缀的列表,按从最短到最长的顺序排列。空列表不存在非空前缀。

powerset: '列表 -> '列表列表 powerset l 返回输入列表 l 中的值集的幂集(集合 A 的幂集定义为集合 A 的所有子集的集合,包括集合本身)。返回的嵌套列表(以及其中的每个列表元素)中的顺序并不重要。

但是,它一直让我断言失败

断言(前缀 [1;2;3;4] = [[1]; [1;2]; [1;2;3]; [1;2;3;4]]); 断言(List.sort cmp(powerset[1;2;3])=List.sort cmp[[1];[1;2];[1;2;3];[1;3];[2]; [2; 3]; [3]]);

我的代码有什么问题?

let prefixes l =
  let add_prefix acc x = match acc with
    | [] -> [[x]]
    | hd :: _ as lst -> (x :: hd) :: lst
  in
  List.rev (List.fold_left add_prefix [] l);;

let powerset l =
  let add_element_to_sets x sets =
    let with_x = List.map (fun subset -> x :: subset) sets in
    with_x @ sets
  in
  List.fold_right add_element_to_sets l [[]];;

  let cmp x y = if x < y then (-1) else if x = y then 0 else 1 in 

      assert (prefixes [1;2;3;4] = [[1]; [1;2]; [1;2;3]; [1;2;3;4]]);
      assert (prefixes [] = []);


      assert (List.sort cmp (powerset [1;2;3]) = List.sort cmp [[1]; [1; 2]; [1; 2; 3]; [1; 3]; [2]; [2; 3]; [3]]);
      assert ([] = powerset []);

ocaml
1个回答
0
投票

您的代码没有任何问题。你的测试有问题。

[]
是每个列表的前缀,也是每个集合的子集,因此它应该包含在
prefixes
powerset
输出中(可能作为这两种情况下的第一个元素)。

© www.soinside.com 2019 - 2024. All rights reserved.