Ответ 1
В ИСО/МЭК 13211-1 существуют по существу три разных типа использования "тип":
-
Типы, определенные в 7.1 типах. Это: переменная (7.1.1), целое число (7.1.2), с плавающей точкой (7.1.3), атом (7.1.4), составной термин (7.1.5) и некоторые типы, основанные на них. Следующие два использования будут часто ссылаться на 7.1 или на терминологию (3 Определения) для ее определения. Важно то, что здесь переменные включены. Эта классификация мотивирована синтаксисом Prolog:
7.1 Типы
Тип любого термина определяется его абстрактным синтаксисом (6.1.2).
-
Типы, определенные в 7.12.2 b. Это типы, которые используются в ошибках типа, которые имеют вид
type_error(ValidType, Culprit)
. Обратите внимание, что переменные теперь больше не включаются, поскольку они либо сигнализируются как ошибки создания экземпляра (7.12.2 a), либо ошибки uninstation (7.12.2 k, Cor.2).ValidType
∈ {atom, atomic, byte, callable, character, compound, evaluable, float, in_byte, in_character, integer, list, number, pair, predicate_indicator
} -
Типы, используемые в подзаголовке Шаблон и режимы:
8.1.2.1 Тип аргумента
Тип каждого аргумента определяется одним из следующих атомов:
atom, atom_or_atom_list, atomic, byte, callable_term, character, character_code, character_code_list, character_list, clause, close_options_list, compound_term, evaluable, flag, head, in_byte, in_character, in_character_code, integer, io_mode, list, nonvar, number, operator_specifier, predicate_indicator, read_options_list, source_sink, stream, stream_options_list, stream_or_alias, stream_position, stream_property, term, write_options_list
Выше цитаты упоминаются только 7.12.2 и 8.1.2.1 и как они соотносятся друг с другом. Так что это требует дополнительной разработки:
Сообщается о типах 7.12.2 с ошибками типа. Но типы в 8.1.2.1 служат только в подклассе Template и modes определения встроенного. Они сами по себе не подходят для ошибок. В конкретном определении встроенного предиката существует подпункт xyz2 Шаблон и режимы и xyz3 Ошибки. Вот несколько примеров типов 8.1.2.1 (выделены жирным шрифтом в списке выше).
write_options_list
Не существует прямого взаимно однозначного соответствия между write_options_list
и конкретными типами, используемыми в ошибках. Вместо этого используется тип list
и домен write_option
. Поэтому сложный тип write_option_list
никогда не сигнализируется:
8.14.2.2 Шаблон и режимы
write_term(@stream_or_alias, @term, @write_options_list)
8.14.2.3 Ошибки
...
c)
Options
не является ни неполным списком, ни списком
—type_error(list, Options).
...
e) Элемент
E
спискаOptions
не является ни переменная или действительная опция записи - —domain_error(write_option, E).
atom_or_atom_list
Это еще сложнее. С одной стороны, ожидается список атомов, но также и атом. Таким образом, мы имеем list
и atom
как соответствующие типы:
8.14.3.2 Шаблон и режимы
op(+integer, +operator_specifier, @atom_or_atom_list)
8.14.3.3 Ошибки
...
f)
Operator
не является ни неполным списком, ни списком, ни
атом
—type_error(list, Operator).
g) Элемент
E
спискаOperator
не является ни переменной, ни атом —type_error(atom, E).
В равной степени правдоподобно производить atom
для ошибки f. С другой стороны, обе ошибки одинаково применимы, а list
, безусловно, лучший для неверно сформированных списков, таких как [a|nonlist]
, тогда как atom
не всегда лучше для 111
, который может быть ошибкой OCR [l]
.
callable_term
Соответствующая ошибка типа содержит callable
. Как в
8.10.1.2 Шаблон и режимы
findall(?term, +callable_term, ?list)
8.10.1.3 Ошибки
...
b) Цель не является ни переменной, ни вызываемым термином
—type_error(callable, Goal)
.
in_character_code
В 7.12.2 b не существует соответствующего типа, а также домена в 7.12.2 c. Но в 7.12.2 f он определяется для ошибок представления:
8.12.1.2 Шаблон и режимы
...
get_code(?in_character_code)
get_code(@stream_or_alias, ?in_character_code)
8.12.1.3 Ошибки
...
j)
Code
является целым числом, но не символьным кодом
(7.1.2.2)
—representation_error(in_character_code).
io_mode
Этот есть, указанный в 8.1.2.1, вопреки цитируемому тексту. Он также появляется в 7.12.2 c и используется:
8.11.5.3 Ошибки
...
h)
Mode
- это атом, но не режим ввода/вывода
—domain_error(io_mode, Mode).
character_code_list
Аналогично write_options_list
. Однако это ошибочно упоминается в 7.12.2 в. Это ошибка в стандарте, которая была удалена в Cor.3: 2017.