1

L1 =[1,2,3,4,5]およびL2[4,5,6,7,8]の場合、発生する要素である[1,2,3,5,7,8]を返します。 1つのリストのみ。両方のリストにあるアイテムのリストを返す関数をすでに作成しました。

fun exists x nil = false | exists x (h::t) = (x = h) orelse (exists x t);

fun listAnd _ [] = []
  | listAnd [] _ = []
  | listAnd (x::xs) ys = if exists x ys  then x::(listAnd xs ys) 
else listAnd xs ys

私が探しているリストは、L1 @ L2-(ListAnd L1 L2)で指定する必要があります。また、要素を削除して重複を削除する関数も見つかりました。remDup関数を少し変更して、複数回発生したアイテムの痕跡が残らないようにすることを何度か試みました。動作させることができませんでした。これらすべての機能を使用して組み合わせて機能させる方法がわかりません。

fun delete A nil = nil
| delete A (B::R) = if (A=B) then (delete A R) else (B::(delete A R));

fun remDups nil = nil
| remDups (A::R) = (A::(remDups (delete A R)));
4

1 に答える 1

0

内のすべての要素を返すが、内には返さないdiff関数がある場合、関数を簡単に実装できます。diff xs ysxsyslistOr

fun listOr xs ys = diff (xs@ys) (listAnd xs ys)

diff関数は次のように記述できlistAndます。

fun diff xs [] = xs
  | diff [] _ = []
  | diff (x::xs) ys = if exists x ys  
                      then diff xs ys 
                      else x::(diff xs ys)
于 2012-10-17T21:59:52.490 に答える