Что такое подтип Изабель /HOL? Какие команды Isar создают подтипы?
Я хотел бы знать о подтипах Изабель /HOL. Я объясняю немного, почему это важно для меня в моем частичном ответе на мой последний вопрос SO:
Попытка рассматривать классы и подтипы типов как наборы и подмножества
По сути, у меня есть только один тип, поэтому для меня было бы полезно использовать силу типов HOL через подтипы.
Я провел поиск в документации Изабель, в Интернете и в списках рассылки Изабель. Слово "подтип" используется, хотя и немного, и кажется, что это не супер важная часть словаря Изабель.
Отчасти, я просто хотел бы знать, как правильно использовать слово "подтип". Я не хочу называть что-то подтипом в Изабель, это не подтип.
Согласно Wiki, подтип зависит от языка:
https://en.wikipedia.org/wiki/Subtyping
Важная последняя часть; команды пожалуйста
Может кто-нибудь дать мне список команд Isar, которые создают подтипы Isar? Я расследую typedef
, как объясняется в вопросе, связанном с выше. Я склонен называть этот подтип, но isar-ref.pdf не использует "подтип" при объяснении команды.
Если есть другие способы создания подтипов Изабель /HOL, я хотел бы знать.
1 ответ
Изабель /HOL не имеет подтипов в смысле замещаемости. Это означает, что если вам нужно значение типа a
, тогда вы должны предоставить значение типа a
- вы не можете ужиться с другим типом b
, В частности, у Изабель нет понятия подтипа, где значения подтипа удовлетворяют некоторому дополнительному свойству.
Есть несколько способов эмулировать определенные аспекты подтипов, и здесь используется понятие подтипа:
Подстановка параметров типа позволяет иногда создавать иллюзию подтипирования.
record
Пакет использует это для расширения записей, так что можно использовать расширенную записьq
вместо нерасширенной записиr
, Внутренне, дополнительные поляq
вставлены в дополнительный параметр типа обобщенияr
Тип записи. Технически, здесь не происходит полиморфизма подтипов; следовательно, порядок расширения записей имеет значение.typedef
вводит новый типt
тип юниверса которого является непустым подмножеством значений некоторого существующего типа HOLa
, Иногда это называетсяt
будучи подтипомa
, но вы не получите заменяемость. Вы всегда должны явно упомянуть морфизм вложенияRep_t
когда вы хотите использовать значениеt
как один изa
, Неважно, определяете ли вы свой тип сtypedef
или каким-либо другим способом любая инъективная функция может служить таким принуждением.Принудительное подтипирование, как описано в Справочном руководстве Изабель (раздел 12.4), позволяет Изабель автоматически определять и вводить такие принуждения. Это работает только как тип, так и подтип являются конструкторами типов без аргументов. использование
declare [[coercion_enabled]]
включить принудительный подтип и зарегистрировать вашу функцию приведенияdeclare [[coercion Rep_t]]
, Таким образом, вам не нужно вставлять функции встраивания самостоятельно.