두 개의 목록을 입력으로 사용하고 적절한 하위 집합을 검사하는 프로그램을 작성하려고합니다. 나는 다음과 같이 시작했다 :적절한 하위 집합 - 프롤로그
proper([A],[]).
proper([],[A]).
proper([A|T1],[A|T2]) :- proper(T1,T2).
정확하게 똑같은 순서로 입력에 대해 완벽하게 작동한다. 예를 들면 :
나를 인도 :
?- proper([a,b,c],[b,d,a,c]).
No
사이트를 통해보고 후 나는이 이전에 질문 질문을 발견 :
?- proper([a,b,c],[a,b,c,d]).
Yes
하지만 같은 입력에 대해 수행 내 코드를 다음과 같이 수정하십시오 :
proper([A],[]).
proper([],[A]).
proper([A|T1],[A|T2) :- member(A,T2), proper(T1,T2).
proper([H1|T1], [H2|T2]) :- \+ member(H1, T2).
하위 집합에는 적합하지만 하위 집합에는 적합하지 않습니다. 내 문제는 적절한/4의 두 번째 조항이 어떻게 작동하는지 이해함에 따라 발생한다고 생각합니다. 모든 도움이 크게 감사드립니다.
편집 :
내가 첫 번째 목록이 두 번째 및 두 번째의 부분 집합은 최초의 부분 집합이었다 여부를 결정하려고했다 깨달았다. 더 정확한 코드를 정리했습니다.
proper([],_).
proper([A|T1],[A|T2) :- member(A,T2), proper(T1,T2).
proper([H1|T1], [H2|T2]) :- \+ member(H1, T2).
목록을 정렬하면됩니다. 이것은 가장 현명한 일이며, 표준 라이브러리가 어떻게 그것을 다루는 지에 대한 것입니다. –
@Boris 적절한 하위 집합에 대한 표준 라이브러리 술어를 가르쳐 주시겠습니까? –
@aBathologist 라이브러리 (ordsets) (예 : SWI-Prolog 구현에서)와 소스를 살펴보십시오. "적절한"하위 집합에 대한 술어가 없지만, 당신이 이미 대답을 지적한 것처럼 길이를 보는 것만으로도 충분합니다. –