Что такое подтип Изабель /HOL? Какие команды Isar создают подтипы?

Я хотел бы знать о подтипах Изабель /HOL. Я объясняю немного, почему это важно для меня в моем частичном ответе на мой последний вопрос SO:

Попытка рассматривать классы и подтипы типов как наборы и подмножества

По сути, у меня есть только один тип, поэтому для меня было бы полезно использовать силу типов HOL через подтипы.

Я провел поиск в документации Изабель, в Интернете и в списках рассылки Изабель. Слово "подтип" используется, хотя и немного, и кажется, что это не супер важная часть словаря Изабель.

Отчасти, я просто хотел бы знать, как правильно использовать слово "подтип". Я не хочу называть что-то подтипом в Изабель, это не подтип.

Согласно Wiki, подтип зависит от языка:

https://en.wikipedia.org/wiki/Subtyping

Важная последняя часть; команды пожалуйста

Может кто-нибудь дать мне список команд Isar, которые создают подтипы Isar? Я расследую typedef, как объясняется в вопросе, связанном с выше. Я склонен называть этот подтип, но isar-ref.pdf не использует "подтип" при объяснении команды.

Если есть другие способы создания подтипов Изабель /HOL, я хотел бы знать.

1 ответ

Решение

Изабель /HOL не имеет подтипов в смысле замещаемости. Это означает, что если вам нужно значение типа a, тогда вы должны предоставить значение типа a - вы не можете ужиться с другим типом b, В частности, у Изабель нет понятия подтипа, где значения подтипа удовлетворяют некоторому дополнительному свойству.

Есть несколько способов эмулировать определенные аспекты подтипов, и здесь используется понятие подтипа:

  1. Подстановка параметров типа позволяет иногда создавать иллюзию подтипирования. record Пакет использует это для расширения записей, так что можно использовать расширенную запись q вместо нерасширенной записи r, Внутренне, дополнительные поля q вставлены в дополнительный параметр типа обобщения rТип записи. Технически, здесь не происходит полиморфизма подтипов; следовательно, порядок расширения записей имеет значение.

  2. typedef вводит новый тип t тип юниверса которого является непустым подмножеством значений некоторого существующего типа HOL a, Иногда это называется t будучи подтипом a, но вы не получите заменяемость. Вы всегда должны явно упомянуть морфизм вложения Rep_t когда вы хотите использовать значение t как один из a, Неважно, определяете ли вы свой тип с typedef или каким-либо другим способом любая инъективная функция может служить таким принуждением.

  3. Принудительное подтипирование, как описано в Справочном руководстве Изабель (раздел 12.4), позволяет Изабель автоматически определять и вводить такие принуждения. Это работает только как тип, так и подтип являются конструкторами типов без аргументов. использование declare [[coercion_enabled]] включить принудительный подтип и зарегистрировать вашу функцию приведения declare [[coercion Rep_t]], Таким образом, вам не нужно вставлять функции встраивания самостоятельно.

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