2013-10-15 4 views
0

Кто-нибудь знает, как я могу определить/убедиться, что в списке проломов есть ровно один повторяющийся элемент?Ровно одна пара в списке Пролога

Я изучаю для теста.

+0

Я написал метод под названием count (X, Y, Z), который связывает Z с числом раз, когда X встречается в списке Y. Я пытаюсь отработать это, но я не уверен, в каком направлении идти – 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 Я думал об этом. Я написал код после того, как написал свободный текст, поэтому отсюда и порядок. Это также потребовало бы использовать 'is' или' succ' для длины _SortedLen_, и это немного странно. –

+1

Самым большим недостатком размещения сортировки/2 в прошлом было бы то, что для частичного списка больше нет чистой ошибки создания. Подумайте о 'one_duplicate (L)' или 'one_duplicate ([a | L])'. – false

Смежные вопросы