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

时间:2014-06-03 14:11:13

标签: iso-prolog

在Prolog的ISO标准的第一部分,ISO / IEC 13211-1:1995中,“类型”的概念用于指代不同的事物。这通常会导致混淆。 例如,名为IsoErrata(archived versionsource)的页面声明(请注意,此页面与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是任何其他非原子。

那么使用“类型”的含义,以及如何解决上述困惑?

1 个答案:

答案 0 :(得分: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

  4. 以上引用仅提及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

    这更复杂。一方面,原子列表是预期的,但原子也很好。我们将listatom作为相关类型:

      

    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中删除。