Согласованные формулировки множеств в Coq?

Я совершенно новый в Coq и пытаюсь разработать структуру, основанную на моих исследованиях. Моя работа довольно тяжелая, и у меня проблемы с ее кодированием из-за того, как Coq, кажется, обрабатывает множества.

Есть Type и Set, которые они называют "sorts", и я могу использовать их для определения нового набора:

Variable X: Type.

И тогда там кодировка (sub) библиотеки устанавливает как Ensembles ', которые являются функциями от некоторого Type до Prop. Другими словами, они являются предикатами на Type:

Variable Y: Ensemble X.

Ensemble больше напоминают правильные математические множества. Кроме того, они основаны на многих других библиотеках. Я попытался сосредоточиться на них: определяя один универсальный набор U: Set, а затем ограничивая себя (sub) Ensemble на U. Но нет. Ensemble нельзя использовать как типы для других переменных или определить новые подмножества:

Variable y: Y.           (* Error *)
Variable Z: Ensemble Y.  (* Error *)

Теперь я знаю, что есть несколько способов обойти это. Вопрос "Параметр подмножества" предлагает два. Оба используют принуждения. Первая привязка к Set s. Второй по существу использует Ensemble (хотя и не по имени). Но оба требуют довольно некоторого механизма для достижения чего-то такого простого.

Вопрос: Каков рекомендуемый способ последовательного (и элегантного) управления наборами?

Пример: Вот пример того, что я хочу сделать: Предположим, что установлен DD. Определим пару dm = (D, <), где D - конечное подмножество DD и < является строгим частичным порядком на D.

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

Record OrderedSet {DD: Set} : Type := {
  D     : (Ensemble DD);
  order : (relation {d | In _ D d});

  is_finite         : (Finite _ D);
  is_strict_partial : (is_strict_partial_order order)
}.

Но я не настолько уверен в этом, чего хочу; и это, конечно, выглядит не очень красиво. Обратите внимание, что я иду назад и вперед между Set и Ensemble кажущимся произвольным способом.

Существует множество библиотек, которые используют Ensemble s, поэтому должен быть хороший способ их лечения, но эти библиотеки, похоже, не очень хорошо документированы (или... вообще).

Обновление:. Чтобы усложнить ситуацию, также существует ряд других реализаций набора, например MSets. Кажется, что это совершенно отдельный и несовместимый с Ensemble. По какой-то причине он также использует bool, а не Prop. Существует также FSets, но, похоже, это устаревшая версия MSets.

Ответ 1

Это было (буквально) лет с тех пор, как я использовал Coq, но позвольте мне попытаться помочь.

Я думаю, что математически говоря U: Set похоже на высказывание U - это вселенная элементов, а Ensemble U означала бы набор элементов из этого юниверса. Поэтому для общих понятий и определений вы почти наверняка используете Set, а Ensemble - один из возможных способов рассуждения о подмножествах элементов.

Я бы посоветовал вам взглянуть на замечательную работу Matthieu Sozeau, которая внедрила классы классов в Coq, очень полезную функцию, основанную на Типы классов Haskell. В частности, в стандартной библиотеке вы найдете определение класса PartialOrder, которое вы упомянули в своем вопросе.

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