다음 코드를 사용하여 목록 L1과 범용 목록 L2가 주어지면 목록의 보완을 찾으려고합니다.
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].
아마도 Prolog의 내장 역 추적 때문일 것이라고 생각했지만 결과의 형식을 올바르게 지정하고 결과에서 중복 항목을 제거하도록이 문제를 해결하는 방법을 모르겠습니다.
코드에서 N
싱글 톤 이라는 경고를 받고 setof / 3 에서는 각 변수가 '보편적으로 수량화'되어 선언되어야합니다. 따라서 함께 사라지는 두 가지 문제가 있습니다. nth0 / 3을 member / 2로 바꿉니다.
complement(L1, L2, Res):-
setof(X, (member(X, L2), not(member(X, L1))), Res).
편집하다
대칭 차이는
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가 정렬 된 세트 인 경우 ord_symdiff 를 사용하는 것이 훨씬 좋습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다