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

В первой части стандарта ISO для Prolog, 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

Кроме того, существуют ValidDomains в 7.12.2.c, которые не указаны в 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 Определения) для ее определения. Важно то, что здесь переменные включены. Эта классификация мотивирована синтаксисом 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.