답변
sort/2
을 사용하여 목록을 정렬하십시오. 중복을 제거하므로 정렬 된 목록이 정확히 하나 짧으면 정확히 한 쌍을 갖게됩니다.
one_duplicate(L) :-
sort(L, Sorted),
length(L, Len),
length(Sorted, SortedLen),
Len =:= SortedLen + 1.
중복 쌍을 찾는 것이 다른 질문입니다.
니스! 나는 이것이 프로그램을 향상시키지 못한다면, sort/2를 마지막으로 놓을 충동을 느낀다. – false
@false 나는 그것에 대해 생각했다. 저는 자유 텍스트를 작성한 후 코드를 작성했습니다. 따라서 주문을 작성했습니다. 또한 _SortedLen_의 길이에'is' 또는'succ'를 사용할 필요가 있으며 약간 이상하다고 느낍니다. –
sort/2를 넣을 때 가장 큰 단점은 부분 목록에 대해 더 이상 깨끗한 인스턴스화 오류가 없다는 것입니다. 'one_duplicate (L)'또는'one_duplicate ([a | L])'을 생각해보십시오. – false
나는 목록 Y에서 X가 발생하는 횟수에 Z를 바인드하는 count (X, Y, Z)라는 메소드를 작성했다. 나는 그걸 처리하려고 노력하고 있지만 어떤 방향으로 갈지 확신하지는 않는다. – user1895814