2012-03-13 2 views
0

내가 같은 것을 할 것 프롤로그에서 프로그램을 만들려고 나열 첫 번째 목록. 어떻게 두 번째 요소에서 요소를 추출 할 수 있습니까?프롤로그는 차이

@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

왜 제거 중복 : 당신은 작업을 완수하기를 원한다면? – false

+0

@false : delete (T1, H, T2)가 작동해야한다고 생각합니다. – CapelliC

0

일부러이 그것을위한 기본 기능을 회피 @ chac 언급, 이것은 일을 부끄럽지 않은 방법입니다.

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].