2013-10-15 4 views
0

누구나 프롤로그 목록에 정확히 하나의 중복 요소가 있는지 확인하고 확인할 수있는 방법을 알고 있습니까?프롤로그 목록에서 정확히 한 쌍의

나는 시험을 위해 공부하고있다.

+0

나는 목록 Y에서 X가 발생하는 횟수에 Z를 바인드하는 count (X, Y, Z)라는 메소드를 작성했다. 나는 그걸 처리하려고 노력하고 있지만 어떤 방향으로 갈지 확신하지는 않는다. – user1895814

답변

5

sort/2을 사용하여 목록을 정렬하십시오. 중복을 제거하므로 정렬 된 목록이 정확히 하나 짧으면 정확히 한 쌍을 갖게됩니다.

one_duplicate(L) :- 
    sort(L, Sorted), 
    length(L, Len), 
    length(Sorted, SortedLen), 
    Len =:= SortedLen + 1. 

중복 쌍을 찾는 것이 다른 질문입니다.

+0

니스! 나는 이것이 프로그램을 향상시키지 못한다면, sort/2를 마지막으로 놓을 충동을 느낀다. – false

+0

@false 나는 그것에 대해 생각했다. 저는 자유 텍스트를 작성한 후 코드를 작성했습니다. 따라서 주문을 작성했습니다. 또한 _SortedLen_의 길이에'is' 또는'succ'를 사용할 필요가 있으며 약간 이상하다고 느낍니다. –

+1

sort/2를 넣을 때 가장 큰 단점은 부분 목록에 대해 더 이상 깨끗한 인스턴스화 오류가 없다는 것입니다. 'one_duplicate (L)'또는'one_duplicate ([a | L])'을 생각해보십시오. – false