Types Prolog中的数据类型是什么?

Types Prolog中的数据类型是什么?,types,prolog,Types,Prolog,根据维基百科,Prolog中的单一数据类型。本文还提到“Prolog的单一数据类型是术语”,但随后继续解释“Prolog中数据类型的分类”(但我认为只有一种类型…) 现在,提到不同的数据类型:“数字、字符和字符串” 那么,Prolog中的数据类型究竟是什么呢?请参见 术语是一个容器,可以包含几种不同类型的数据(想想面向对象语言中的继承) Prolog中的单一数据类型是术语 这句话既正确又有些无用。可以说,类型在Prolog中并没有起到多大作用:一切都是一个术语,变量是非类型化的,它们将根据需要与

根据维基百科,Prolog中的单一数据类型。本文还提到“Prolog的单一数据类型是术语”,但随后继续解释“Prolog中数据类型的分类”(但我认为只有一种类型…) 现在,提到不同的数据类型:“数字、字符和字符串”

那么,Prolog中的数据类型究竟是什么呢?

请参见

术语是一个容器,可以包含几种不同类型的数据(想想面向对象语言中的继承)

Prolog中的单一数据类型是术语

这句话既正确又有些无用。可以说,类型在Prolog中并没有起到多大作用:一切都是一个术语,变量是非类型化的,它们将根据需要与其他术语统一


另一方面,数字、原子和复合项不是数据类型——它们是不同类型的项,略有不同。复合术语进一步细分为列表、字符串和“其他”类仿函数术语。

我要咬一口:Prolog有一个单一的数据类型
term
。不是很有用的答案,嗯

术语细分为

  • 变量。占位符,不统一于任何特定术语。变量由与正则表达式匹配的符号标识。变量
    \uu
    是特殊的:它是匿名变量。每次出现
    \uu
    都表示一个不同的变量。比如说,

    foo(1,2,3).
    
    foo(u,u,u,u)这样的测试将成功,而像
    foo(A,A,A)这样的测试将失败

    然而,一旦一个变量与(绑定到)一个值相统一,它就不再是变量:除非通过回溯将其撤消,否则它永远是它与之统一的对象

  • 数字是
    浮点数
    整数
    。通常适用的规则种类(例如,
    -321
    是一个整数,
    -321.0
    或类似的
    -3.21e+02
    是一个浮点

  • 原子是名称,通常由以小写字母开头的单词(例如
    原子
    )表示,与常规表达式
    [a-z][a-Za-z0-9_775;]*
    匹配。或者,原子可以用撇号分隔(例如
    'atom'
    )atom的语法稍微复杂一些:本质上,任何不属于另一个类别的东西都会形成一个atom(例如,表示空列表的特殊atom
    []
    和表示连词的逗号(
    )都是原子

  • 其他一切本质上都是一个结构,即术语元组,由一个函子(一个与原子规则匹配的名称)和一个arity(参数数量)标记。人们甚至可以将原子视为arity 0的结构

在prolog的其他“数据类型”之上,还有语法上的甜头:

  • 列表由结构
    /2
    表示,左侧参数是列表的头部,右侧参数是列表的尾部。空列表由原子
    []
    表示。例如

    • 列表
      [a]
      在内部表示为
      (a,[])
    • 列表
      [a,b]
      (a,.(b,[])
    • 列表
      [a,b |[c]]
      (a,b,c,[])
    需要注意的是,可以使用任何一种符号来编写列表:它们将适当地统一起来。但是,您可以看到使用括号中的列表符号的吸引力

  • 类似的语法糖也适用于字符串。字符串可以写成由双引号分隔的文本字符串:
    “猫和帽子”
    。但是,字符串在内部表示为列出了表示内部编码实现中每个字符的代码点的整数。例如,字符串
    “cat”
    在内部表示为(ASCII/UTF-8)列表
    [99,97116]
    “cat”
    更容易阅读,是吗

    • 在我看来(不是那么谦虚),说“”(一个从句是一个复合词)听起来不错,但实际上有大约6整页,所以有(很多)该语句中未表达的隐藏结构。因此,程序文本可以分解为这几个语法类,但人们也对列表、dict、字符串等感兴趣,这些列表、dict、字符串等必须以特定方式由这些低级片段组合而成。无论如何,下面有一个图形,它特别适用于SWI Prolog,但“其他Prolog”它们大多是相似的——除非它们是“真正的其他序言”(例如,答案集编程序言可能更简单,我真的不知道)

      下面是一个SVG图():

      上述内容在某种程度上特定于SWI Prolog,因为:

      • 存在一个
        dict
        (关联数组)数据类型
      • string
        在SWI Prolog中是一种单独的数据类型。传统上,“string”只是一个“字符列表”
      • 空列表是一个特定的原子
        []
        。传统上,空列表类似于空指针
      • listbox/consbox functor是
        [|]
        而不是传统的
      • 有算术0的复合项,如
        a()
        。传统上,这些项不存在
      • 有理数
        NrD
        存在
      对于那些喜欢历史的人来说,这里是菲利普·鲁塞尔(Philippe Roussel)于1975年9月编写的第一本序言手册中对“术语”的描述,可在以下网址找到


      ISO标准及其勘误表2的特点是: 在Prolog中测试数据类型的测试谓词的集合。 Richard O'Keefe曾经安排这些测试谓词 详情如下:

                          true
                            |
                  +---------+---------+
                  |                   |
               nonvar                var
                  |
        +---------+--------------------------+
        |                                    |
      compound                           atomic=constant
                                             |
                  +----------------+---------+---------+
                  |                |                   |
                number          string             atom=symbol
                  |
          +-------+-------+ 
          |               |
       integer            float
      
      我省略了理性和复杂的概念