标准中使用了"类型"的含义?

fal*_*lse 8 iso-prolog

在Prolog的ISO标准的第一部分,ISO/IEC 13211-1:1995中,"类型"的概念用于指代不同的事物.这通常会导致混淆.例如,名为IsoErrata(存档版本,)的页面声明(请注意,此页面与ISO无关):

7.12.2和8.1.2.1

关于什么是"类型"存在混淆.似乎有3个不同的组:

  • 8.1.2.1中列出的那些,也在7.12.2.b中的type_error术语中作为ValidTypes出现
  • 8.1.2.1中列出的那些,在7.12.2.c中的domain_error术语中作为ValidDomain出现
  • 仅在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不是7.12.2中列出的ValidTypes!).因此,对于ECLiPSe,我们type_error(list,Op)只选择 if Op是不正确的列表,以及 type_error(atom,Op)是否Op是任何其他非原子.

那么在哪种意义上使用"类型",以及如何处理上述混乱?

fal*_*lse 6

ISO/IEC 13211-1中"类型"基本上有三种不同的用途:

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

  2. 7.12.2中定义的类型b.这些是在类型错误中使用的类型type_error(ValidType, Culprit).请注意,现在不再包含变量,因为这些变量要么作为实例化错误(7.12.2 a)发出信号,要么表示为非实例化错误(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错误

...

c)Options既不是部分清单也不是清单
-type_error(list, Options).

...

E)的元素E的的Options列表既不是
可变也不是有效的写选项
-domain_error(write_option, E).

atom_or_atom_list

这更复杂.一方面,原子列表是预期的,但原子也很好.因此,我们必须listatom为相关类型:

8.14.3.2模板和模式

op(+integer, +operator_specifier, @atom_or_atom_list)

8.14.3.3错误

...

f)Operator既不是部分清单也不是清单也不是
原子
-type_error(list, Operator).

克)的元素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中,它被定义为表示错误:

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 c中错误地提到了它.这是标准中的错误,已在Cor.3:2017中删除.