2012-03-13 9 views
0

を示しています。Prologは、私はこのような何かを行いますプロローグでプログラムを作成しようとしている違い

diffSet([a,b,c,d], [a,b,e,f], X). 
X = [c,d,e,f] 

私はこれを書いた:

diffSet([], _, []). 
diffSet([H|T1],Set,Z):- member(Set, H), !, diffSet(T1,Set,Z). 
diffSet([H|T], Set, [H|Set2]):- diffSet(T,Set,Set2). 

をしかし、そのように私は唯一の要素を取得することができます最初のリストどのようにして2番目の要素から要素を抽出できますか?

@edit:Hがセット内にある場合 メンバーはリストから要素を削除builtinあり

member([H|_], H). 
member([_|T], H):- member(T, H). 

答えて

2

チェックされています

diffSet([], X, X). 

diffSet([H|T1],Set,Z):- 
member(H, Set),  % NOTE: arguments swapped! 
!, delete(T1, H, T2), % avoid duplicates in first list 
delete(Set, H, Set2), % remove duplicates in second list 
diffSet(T2, Set2, Z). 

diffSet([H|T], Set, [H|Set2]) :- 
diffSet(T,Set,Set2). 
+0

なぜ2番目のリストから重複を削除しますか?最初のものから重複を削除していませんか? – false

+0

@false:delete(T1、H、T2)はうまくいくはずです – CapelliC

0

が意図的にこのことのために構築されたインを避け@チャックが言いますが、これは仕事をする控えめなやり方です。

notcommon([], _, []). 

notcommon([H1|T1], L2, [H1|Diffs]) :- 
    not(member(H1, L2)), 
    notcommon(T1, L2, Diffs). 

notcommon([_|T1], L2, Diffs) :- 
    notcommon(T1, L2, Diffs). 

alldiffs(L1, L2, AllDiffs) :- 
    notcommon(L1, L2, SetOne), 
    notcommon(L2, L1, SetTwo), 
    append(SetOne, SetTwo, AllDiffs). 


    ? alldiffs([a,b,c,d], [a,b,e,f], X). 
    X = [c, d, e, f] . 
0

それとものみビルトインを使用しました。

notcommon(L1, L2, Result) :- 

    intersection(L1, L2, Intersec), 
    append(L1, L2, AllItems), 
    subtract(AllItems, Intersec, Result). 

    ?- notcommon([a,b,c,d], [a,b,e,f], X). 
    X = [c, d, e, f]. 
関連する問題