2013-06-18 4 views
1

Когда я сортирую [(101, a), (42, b), (85, b)], это Prolog с sort([(101,a),(42,b),(85,b)],X). is get X = [ (42, b), (85, b), (101, a)]. Но как получилось? Пролог распознает кортежи и сортирует их по первому элементу, а затем по второму элементу?Сортировка кортежей в Prolog

ответ

3

Вы должны просто просто посмотреть точную документацию по использованию Пролога. Например, в SWI-Prolog сортировка выполняется в «стандартном порядке». Для составных терминов (как вы используете), это первая arity, затем имя, а затем рекурсивные аргументы. Итак, в вашем случае, да, сначала он сортируется сначала, а затем по второму аргументу.

Кстати, ISO sort должен удалять дубликаты, а не то, что вы его удивляете.

И, строго говоря, в Prolog нет «кортежей». У вас есть функтор , с arity 2 (или, ,/2). Посмотрите на это:

2 ?- write_canonical((42, b)). 
','(42,b) 
true. 
+0

Функторы повсюду ... Черт бы тебя побрал, Хаскелл, я не могу перестать видеть это все вокруг меня сейчас ... Всегда ли это было, и я был слепым? Ahh Я получаю головную боль, думая об этом, я не могу не заметить ... –

+0

@JimmyHoffa :) но в чем ваша суть, точно, Джимми? –

+0

Что я был постоянно изменен против моей воли, Haskell должен прийти с более серьезными предупреждениями ... –

-1

Ваше предположение кажется разумным. Мы можем проверить некоторые документы, лично мне нравится documentation for ciao.

См. Стр. 235, затем стр. 115. Обратите внимание, что вы также можете сортировать по клавишам.

Вы должны знать, что некоторые люди считают использование таких предикатов (не декларативных) плохими. В принципе, в этом предикате есть два члена, один должен быть заземлен, а другой не должен, так что на самом деле это функция, а не логический предикат. Те, кто обеспокоен «чистотой» логического программирования, вероятно, найдут способ обхода, чтобы не использовать это.

+0

Спасибо! Как не логично говорить, что Y - отсортированный список X в сортировке (X, Y)? Я имею в виду, что для каждого предиката для сортировки потребуется список и вывод? Или я ошибаюсь в этом? – Confituur

+0

Логический член (X, Y), так что ни один из обоих терминов не должен быть заземлен. Логический предикат устанавливает связь между группой переменных, нет ничего похожего на «ввод» или «вывод», и он не используется для «сортировки», он только устанавливает, что X и Y имеют точно такие же элементы и что элементы в Y сортируются (что является их отношением). По крайней мере, это от «чистого подхода к логическому программированию», по сути, это просто «программирование с обратным отслеживанием и переменными унификациями». – Trylks

+0

Вы не можете избежать «возврата и унификации» даже во что-то столь же тривиальном, как и член: он объединит X с элементами Y в порядке, определенном конкретной реализацией члена. В этом смысле Prolog никогда не является чисто логичным, поэтому логическое программирование и Prolog обычно обсуждаются отдельно. –

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