Как я понимаю вопрос, вы хотите удалить элементы в L2, которые также находятся в L1, но только один раз за вхождение.
Простое решение может включать вспомогательную функцию, сообщающую, был ли найден элемент в L1, вместе с остальной частью L1 с удаленным этим элементом.
fun remFirst _ [] rest = (false, rev rest)
| remFirst x (y::ys) rest =
if x = y then
(true, rev rest @ ys)
else
remFirst x ys (y :: rest)
Теперь вы можете перебирать L2, отбрасывая элементы каждый раз, когда remFirst возвращает true, а затем продолжая работу с остальным списком.
Если вместо этого вы хотите удалить префикс, который L2 имеет общее с L1, все становится немного проще.
fun remPref [] _ = []
| remPref xs [] = xs
| remPref (x::xs) (y::ys) = if x = y then remPref xs ys else (x::xs)
ОБНОВЛЕНИЕ: вопрос теперь изменен.
Если теперь требуется удалить элементы из L2, которые находятся в L1, фильтр будет полезен.
List.filter (fn x => List.all (fn y => x <> y) L1) L2