Парное отношение над списком

Следующий предикат высшего порядка успешно выполняется, если все пары элементов списка верны для данного отношения. Есть общее или лучшее, более намеренное раскрытие имени для этого отношения?

Моя первоначальная мотивация для этого имени заключалась в том, что в clpfd часто существует ограничениеall_different/1который описывается как истинный, если элементы попарно различны. На самом деле, довольно предпочтительно говорить, что все элементы разные, но я часто исправлялся (другими программистами Пролога), чтобы использовать попарно разные. Фактически, это ограничение наиболее естественно теперь может быть выражено какpairwise(#\=, Zs),

pairwise(Rel_2, Xs) :-
   i_pairwise(Xs, Rel_2).

i_pairwise([], _).
i_pairwise([X|Xs], Rel_2) :-
   maplist(call(Rel_2,X),Xs),
   i_pairwise(Xs, Rel_2).

Как заметил @aBathologist, попарно не правильное слово, потому что оно может иметь смысл для нерефлексивныхRelтоже.

Кроме того, отношение Rel не тотальное отношение, потому чтоcall(Rel, X, X)может потерпеть неудачу, ноpairwise(Rel, Xs)все еще может быть успешным.

Я даже гулял за(a->a->Bool)->[a]->Bool, Но Hayoo нашел это: name pairwise в отличие от точечно.

Посмотрел МО и математику:

2 ответа

Мне очень нравится ваш вопрос. Я начал копаться в Википедии, чтобы найти подходящий термин. Я думаю о списке как о множестве, в том смысле, что каждый член является отдельным и дифференцируемым элементом, так что даже если бы было два экземпляра одного и того же атома, были бы разные элементы, каковы их позиции или что-то еще. Я думаю, что предикат, который вы описали, будет двоичным отношением [connex] ( https://en.wikipedia.org/wiki/Total_relation):

Бинарное отношение R над X называется connectx, если для всех a и b в X такое, что a ≠ b, a связано с b или b связано с a (или обоими)

С другой стороны, если отношение также должно быть рефлексивным, то оно описывает полное двоичное отношение (обсуждается на той же странице, что и connectx).

Тем не менее, я думаю, что ваш предикат pairwise/2 не соответствует описанию, которое вы даете, или (что более вероятно), я не совсем понимаю.

Вы говорите, что предикат должен быть успешным, "если все пары элементов списка верны для данного отношения". Но pairwise(>, [1,2,3]) ложно, тогда как pairwise(<, [1,2,3]) верно, пока pairwise(>, [3,2,1]) это правда, но pairwise(<, [3,2,1]) ложно Но из каждой пары элементов из этих списков один больше другого.


Редактирование:

Следующее является результатом моего недопонимания и оказалось не относящимся к вопросу.

Я предложил следующее определение, полагая, что это может быть более точным определением того, что описывает @false, но он указал, что оно не определяет отношение, которое, как я думал, было. Я сохранил это ради ясности нашего последующего обмена комментариями.

Добавление еще одного предложения, которое проверяет список в обратном порядке, решило бы эту проблему, но могут ли быть другие отношения, которые не могут быть перехвачены? Кроме того, есть ли более эффективный способ реализации подлинной проверки подключения?

connex_over(Rel, Xs) :-
   i_connex_over(Xs, Rel), !.
connex_over(Rel, Xs) :-
   reverse(Xs, Sx),
   i_connex_over(Sx, Rel).

i_connex_over([], _).
i_connex_over([X|Xs], Rel) :-
   maplist(call(Rel,X),Xs),
   i_connex_over(Xs, Rel).

После того, как @false указал на мою ошибку в предыдущем, я написал следующее определение. Я полагаю, что он описывает связь между элементами S:

actual_connex_over(Rel, S) :-
   foreach( ( select(X, S, T), member(Y, T) ),
            ( call(Rel, X, Y) ; call(Rel, Y, X) )
          ).

Такой предикат высшего порядка явно был бы очень полезен ( пример: breaks/1).

Как для foldl/n Семейство предикатов, мнемоническое название для этого должно, на мой взгляд, фокусироваться не столько на возникающей алгебраической структуре, сколько на шаблоне, который мы здесь находим. Например, эта модель чем-то напоминает аккордеон, но это явно еще не хорошее имя. Там, кажется, обобщение foldl/4 или же scanl/4 (или некоторая смесь), в пределах досягаемости которой этот шаблон является частным случаем.

Другие вопросы по тегам