Предположим, что val и непрозрачные конструкции типа в F*
Я новичок в F*, и хотя учебник хорошо написан, мне не хватает хорошей страницы API для справки.
Поэтому мне нужно точное значение для следующих конструкций:
assume val name: type
Я бы сказал, что эта строка записывается в решатель имя используется?
opaque type name (...) ...
Каков эффект вызова непрозрачного типа? Как насчет списков параметров, которые он может принимать?
Пожалуйста, включите ссылки, которые вы, возможно, использовали, чтобы дать этот ответ.
1 ответ
Значение assume val name : Type
это принять аксиому, населяющую Type
к которому можно получить доступ name
, Поскольку это аксиома, она не будет иметь реализации и может привести к логическим несоответствиям при неправильном использовании (например, принимая натуральное число, строго меньшее 0).
Учебное пособие F* не совсем в курсе многочисленных изменений, произошедших за последний год, и opaque
является примером этой проблемы. Из источника компилятора (на момент написания, в src/tosyntax/FStar.ToSyntax.fs
):
"Непрозрачный" классификатор устарел, поскольку его использование было странно шизофреническим. Было два перегруженных использования: (1) Учитывая 'непрозрачный val f: t', поведение должно было исключить определение 'f' для решателя SMT. Это примерно соответствует новому "неприводимому" квалификатору. (2) Учитывая "непрозрачный тип t = t", поведение должно было дать определение "t" для решателя SMT, но не включать его, если это абсолютно не требуется для объединения. Это примерно соответствует поведению "unoldable" (которое в настоящее время используется по умолчанию).