2016-07-27 2 views
2
나는이 목록의 보수를 찾을하려고 해요

을 제거하는 것 같다, 다음과 같은 코드를 가진 보편적 목록 L2하지 않습니다 SETOF :은/3은리스트 L1 제공, 중복

complement(L1, L2, Res):- 
    setof(X, (nth0(N, L2, X), not(member(X,L1))),Res). 

하지만, 내 결과는 중복을 포함하고 내가 선호하는 것으로 목록 형태로 제공되지 않습니다 : 내가 인해 프롤로그에 내장 된 역 추적에 아마 생각

23 ?- complement([1,3], [-1,1,3,5,2,4,2,55,1,0], Res). 
Res = [-1] ; 
Res = [5] ; 
Res = [2] ; 
Res = [4] ; 
Res = [2] ; 
Res = [55] ; 
Res = [0]. 

을하지만 난 포맷에 대해 이동이 문제를 해결하는 방법을 잘 모르겠어요 결과가 올바르게 표시되고 결과에서 중복 항목을 제거하도록 가져옵니다.

답변

3

코드에서 약 N이 싱글 톤이며 setof/3 이 필요합니다. 각 변수는 '포괄적으로 계량화 됨'이 선언되어야합니다.

symdiff(L1,L2,Diff) :- 
    setof(X,(eldiff(L1,L2,X);eldiff(L2,L1,X)),Diff). 
eldiff(L1,L2,X) :- 
    member(X,L1), \+member(X,L2). 

L1 및 L2 경우가 될 수

complement(L1, L2, Res):- 
    setof(X, (member(X, L2), not(member(X, L1))), Res). 

편집

대칭 차이 : 대체 멤버/2에 의해 nth0/3 : 그래서, 당신은 두 개의 서로 멀리 갈 문제가 많이 사용하는 주문한 세트입니다 ord_symdiff

+0

그걸 고쳤습니다. 고맙습니다. :) –

+0

두 가지 방법, 즉 보완이 아닌 두 가지 모두에서 요소, 즉 대칭 차이뿐만 아니라 setof/findall/bagof를 사용하는 방법이 있습니까? 나는 그것을 긴 방법으로 해왔지만 위의 해결책은 이것을 달성하는데 사용될 수 있을까? – ildsarria

+0

@ildsarria : 죄송합니다. 확실하지 않습니다. 대칭 차이를 계산할 수 있습니다 - IIRC - 도서관에서 (섭정) – CapelliC