Как изменить список списков, если он содержит x или -x? - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь изменить список списков с определенными условиями, если вложенный список содержит x, я хотел бы удалить этот список из списка, если вложенный список содержит -x, я хотел бы удалить-x из этого списка, сохраняя при этом указанный список. Наконец, если вложенный список не содержит x или -x, я бы сохранил его.

Пока это то, что я пробовал, я не понимаю, почему он не работает какнамерение ...

let rec simplify i clauses =
  match clauses with
  | [] -> []
  | x::y -> if (List.mem i x) then [] @ simplify i y else if (List.mem (-i) x) then List.filter (fun x -> x != -i) x @ simplify i y else [x];;

Ожидаемые результаты будут следующими:

simplify (-1) [[-1;2];[-1;7];[-2;1];[-2;3];[-3;2];[-3;4];[-4;5];[-4;15];[-5;2];[-5;4];[-6;5];[-7;1];[-7;8];[-7;6];[-8;7];[-8;9];[-8;10];[-9;8];[-10;8];[-10;11];[-10;12];[-11;9];[-11;10];[-12;6];[-12;10];[-12;13];[-12;15];[-13;11];[-14;13];[-14;15];[-15;12];[1];[-14]]
;;
- : int list list =
[[-14]; []; [-15; 12]; [-14; 15]; [-14; 13]; [-13; 11]; [-12; 15]; [-12; 13];
 [-12; 10]; [-12; 6]; [-11; 10]; [-11; 9]; [-10; 12]; [-10; 11]; [-10; 8];
 [-9; 8]; [-8; 10]; [-8; 9]; [-8; 7]; [-7; 6]; [-7; 8]; [-7]; [-6; 5]; 
 [-5; 4]; [-5; 2]; [-4; 15]; [-4; 5]; [-3; 4]; [-3; 2]; [-2; 3]; [-2]]

В то время как фактические результаты:

simplifie_aux (-1) [[-1;2];[-1;7];[-2;1];[-2;3];[-3;2];[-3;4];[-4;5];[-4;15];[-5;2];[-5;4];[-6;5];[-7;1];[-7;8];[-7;6];[-8;7];[-8;9];[-8;10];[-9;8];[-10;8];[-10;11];[-10;12];[-11;9];[-11;10];[-12;6];[-12;10];[-12;13];[-12;15];[-13;11];[-14;13];[-14;15];[-15;12];[1];[-14]]
;;
- : int list list = [[-2]; [-2; 3]]

Спасибо.

1 Ответ

0 голосов
/ 23 октября 2019

Похоже, что в вашем коде вы должны повторяться и в последнем случае else [x]. Однако я бы переписал его как fold, поскольку вы удаляете (некоторые) пустые списки из ожидаемого результата, например.

let simplify i clauses = 
  let f acc lst =
    if List.mem i lst then acc
    else [List.filter (fun x -> x != -i) lst] @ acc
  in List.fold_left f [] clauses

(* - : int list list =
   [[-14]; []; [-15; 12]; [-14; 15]; ... ] *)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...