在Prolog的ISO标准的第一部分,ISO / IEC 13211-1:1995中,“类型”的概念用于指代不同的事物。这通常会导致混淆。 例如,名为IsoErrata(archived version,source)的页面声明(请注意,此页面与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)
是不合适的列表时才Op
type_error(atom,Op)
如果Op
是任何其他非原子。
那么使用“类型”的含义,以及如何解决上述困惑?
答案 0 :(得分:6)
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中的类型仅用于definition of a built-in的模板和模式子条款。它们本身不适合用于错误。在具体的definition of a built-in predicate中,有一个子条款 x.y.z.2模板和模式和 x.y.z.3错误。以下是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).
为错误f生成atom
同样合理。另一方面,这两个错误同样适用,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中删除。