Какие значения "тип" используются в стандарте?
В первой части стандарта ISO для Пролога, ISO/IEC 13211-1:1995, понятие "тип" используется для обозначения разных вещей. Это часто приводит к путанице. Например, на странице с именем IsoErrata ( архивная версия, источник) говорится (обратите внимание, что эта страница не связана с ISO):
7.12.2 и 8.1.2.1
Существует путаница в том, что такое "тип". Кажется, есть 3 разных группы:
- Те, которые перечислены в 8.1.2.1, а также встречаются как ValidTypes в терминах type_error в 7.12.2.b
- Те, которые перечислены в 8.1.2.1 и встречаются как ValidDomain в терминах domain_error в 7.12.2.c
- Те, которые перечислены только в 8.1.2.1
Кроме того, в 7.12.2.c есть ValidDomains, которые не перечислены в 8.1.2.1, предположительно по ошибке (например, io_mode).
8.14.3.3.f
Шаблон требует тип
atom_or_atom_list
для третьего аргумента, но, как ни странно, требуемый термин ошибки здесьtype_error(list,Operator)
, Это приводит к (см. Примеры)
op(30,xfy,0) =====> error(type_error(list,0))
где
type_error(atom,0)
или жеtype_error(atom_or_atom_list,0)
было бы более уместно (но учтите, чтоatom_or_atom_list
не входит в число ValidTypes, перечисленных в 7.12.2!). Поэтому для ECLiPSe мы выбралиtype_error(list,Op)
только еслиOp
неправильный список, иtype_error(atom,Op)
еслиOp
любой другой неатом.
Итак, в каких значениях используется "тип" и что делать с вышеупомянутой путаницей?
1 ответ
Существуют три различных варианта использования "типа" в ИСО / МЭК 13211-1:
Типы, как определено в 7.1 Типы. Это: переменная (7.1.1), целое число (7.1.2), с плавающей запятой (7.1.3), атом (7.1.4), составной член (7.1.5) и некоторые типы на их основе. Следующие два использования часто будут ссылаться на 7.1 или на терминологию (3 определения) для ее определения. Важно то, что сюда включены переменные. Эта классификация мотивируется синтаксисом Пролога:
7.1 Типы
Тип любого термина определяется его абстрактным синтаксисом (6.1.2).
Типы, определенные в 7.12.2 б. Это типы, которые используются в ошибках типов, которые имеют вид
type_error(ValidType, Culprit)
, Обратите внимание, что переменные больше не включаются, так как они либо сигнализируются как ошибки создания экземпляра (7.12.2 а), либо как ошибки создания экземпляра ( 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 служат только в подпункте "Шаблон и режимы" определения встроенного. Они сами по себе не подходят для ошибок. В конкретном определении встроенного предиката есть подпункт 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 Ошибки
...
с)
Options
не является ни частичным списком, ни списком
-type_error(list, Options).
...
д) элемент
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 Ошибки
...
е)
Operator
не является ни частичным списком, ни списком, ни
атом
-type_error(list, Operator).
г) элемент
E
изOperator
список не является
переменная, ни атом
-type_error(atom, E).
В равной степени правдоподобно производить atom
за ошибку ф. С другой стороны, обе ошибки в равной степени применимы, и list
безусловно, лучше всего подходит для искаженных списков, таких как [a|nonlist]
, в то время как atom
не обязательно лучше для 111
которая может быть ошибкой распознавания [l]
,
callable_term
Соответствующая ошибка типа содержит callable
, Как в
8.10.1.2 Шаблон и режимы
findall(?term, +callable_term, ?list)
8.10.1.3 Ошибки
...
б) цель не является ни переменным, ни вызываемым термином
-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 Ошибки
...
к)
Code
целое число, но не символьный код
(7.1.2.2)
-representation_error(in_character_code).
io_mode
Это перечислено в 8.1.2.1, вопреки цитируемому тексту. Это также появляется в 7.12.2 c и используется:
8.11.5.3 Ошибки
...
час)
Mode
атом, но не режим ввода / вывода
-domain_error(io_mode, Mode).
character_code_list
Похожий на write_options_list
, Однако, это ошибочно упомянуто в 7.12.2 c. Это ошибка в стандарте, которая была удалена в Cor.3: 2017.