Какие значения "тип" используются в стандарте?

В первой части стандарта 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:

  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).

  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 }

  3. Типы, используемые в подразделе Шаблон и режимы:

    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.

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