Удаление элементов и списков в списке списков в SML

#sml #smlnj

#sml #smlnj

Вопрос:

Итак, у меня реализован этот тип данных

 datatype 'a expression = Not of 'a expression
                | Or of 'a expression list
                | And of 'a expression list
                | Equality of 'a expression list
                | Impication of 'a expression * 'a expression
                | Variable of 'a
                | True | False;
 

То, что я пытаюсь сделать, это удалить целые элементы, которые одинаковы в списке list. Потому что я хочу следовать этому математическому правилу и упростить свое уравнение

 A||(Aamp;amp;B)∼A
A amp;amp; (A||B)∼A
 

Итак, что я хочу сделать, это удалить все совпадения. Это означает, что моя функция удалит элементы, которые соответствуют этому, если операторы and или верны

 [[x,y,a], a, [b,c,f],[a,[c,g]]] => [[x,y], a , [b,c,f] [c, g]]
 

И это также будет обнаруживать и удалять целые совпадающие списки, подобные этому

 [[x,y,a], [c, b, d, [x,y,a]] ] => [[x,y,a], [c,b,d]]
 

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

    fun remove[] = []
  | remove(x::xs) = x::remove(List.filter (fn y => y <> x) xs)
 

Вот что у меня есть, и я знаю, что это даже близко не к решению

Комментарии:

1. Вы не можете создавать эти списки в SML для начала (в списке все элементы имеют один и тот же тип). Это похоже на проблему XY . Как вы в конечном итоге захотели это сделать?

2. Конечно, вы можете определить свой собственный тип произвольно вложенных списков. (Любая проблема может быть решена путем добавления уровня косвенности.) Если это упражнение, это, вероятно, то, что вы должны делать.

3. @molbdnilo Я знаю об этом факте. Я обобщил свою проблему, у меня есть пользовательский тип данных, созданный там, где это действительно возможно. Но для простоты я привел эти примеры

4. Вопрос о вашей реальной проблеме вместо невозможной сэкономил бы много времени для всех.

5. @molbdnilo спасибо за предупреждение, это моя вина. Обновлено, чтобы соответствовать ему