在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)只选择 ifOp是不正确的列表,以及type_error(atom,Op)是否Op是任何其他非原子.
那么在哪种意义上使用"类型",以及如何处理上述混乱?
ISO/IEC 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)发出信号,要么表示为非实例化错误(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_listwrite_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).克)的元素
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_code7.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中删除.