Определение отношения подтипа в Coq

Есть ли способ определить отношения подтипа в Coq?

Я читал о типизации подмножества, в которой предикат используется для определения того, что входит в подтип, но это не то, к чему я стремлюсь. Я просто хочу определить теорию, в которой есть тип (U) и другой тип (I), являющийся подтипом (U).


person Yasmine Shaorda    schedule 18.07.2018    source источник


Ответы (1)


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

Definition nat_of_bool (b : bool) : nat :=
  if b then 1 else 0.

Coercion nat_of_bool : bool >-> nat.

После запуска этого фрагмента Coq использует nat_of_bool для преобразования bool в nat, как показано здесь:

Check true + 3.
(* true + 3 : nat *)

Таким образом, bool начинает вести себя почти так, как если бы он был подтипом nat.

Хотя nat_of_bool здесь не появляется, он просто скрыт принтером Coq. Этот терм на самом деле то же самое, что и nat_of_bool true + 3, в чем мы можем убедиться, попросив Coq вывести все приведения:

Set Printing Coercions.
Check true + 3.
(* nat_of_bool true + 3 : nat *)

Символ :> о котором вы спрашивали ранее при использовании в объявлении записи делает то же самое. Например, код

Record foo := Foo {
  sort :> Type
}.

эквивалентно

Record foo := Foo {
  sort : Type
}.

Coercion sort : foo >-> Sortclass.

где Sortclass — это специальная цель принуждения для Type, Prop и Set.

руководство пользователя Coq более подробно описывает приведение.

person Arthur Azevedo De Amorim    schedule 18.07.2018
comment
Спасибо за ответ на оба вопроса. Я хочу определить алгебраическую теорию с двумя носителями, один из которых является подтипом другого. Я определяю теорию как тип записи (пожалуйста, дайте мне знать, если у вас есть лучший вариант). так например у меня есть: Record Foo : Type := {U : type, I : type}. Мне нужно добавить отношение подтипа между I и U, но с Coercion супертип может быть только Foo. Единственный способ, который я могу сейчас придумать, это добавить отношение подтипа в качестве аксиомы. Есть ли лучший вариант? - person Yasmine Shaorda; 18.07.2018
comment
Вы можете сказать, например, Record Foo : Type := { U : Type ; I : Type ; subtype_witness : I -> U }. Вы также можете потребовать, чтобы subtype_witness было инъективным. - person Jason Gross; 19.07.2018
comment
Это самое близкое к тому, что я хочу сделать. Спасибо - person Yasmine Shaorda; 19.07.2018