13

根据 Wikipedia,Prolog 中的单一数据类型是 term本文还提到“Prolog 的单一数据类型是术语”,但随后继续解释“Prolog 中数据类型的分类”(但我认为只有一种类型......)现在,这些幻灯片提到了不同的数据类型:“数字、字符和字符串”。

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

4

5 回答 5

22

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

条款细分为

  • 变量。占位符,不统一到任何特定术语。变量由匹配正则表达式的符号标识[A-Z_][A-Za-z_0-9]*。这个变量_很特别:它是匿名变量。每次出现_表示一个不同的变量。例如,鉴于事实,

    foo(1,2,3).
    

    类似的测试foo(_,_,_).会成功,而类似的测试foo(A,A,A).会失败。

    然而,一旦一个变量与一个值统一(绑定到),它就不再是可变的:除非通过回溯取消它,否则它永远是它所统一的。

  • 数字floatinteger。应用通常种类的规则(例如-321是整数,-321.0或者类似的东西-3.21e+02是浮点数。

  • 原子名称,通常由以小写字母开头的单词(例如atom)表示,与正则 rexpression 匹配[a-z][A-Za-z0-9_]*。或者,原子可以由撇号(例如,'atom')分隔,这方便地允许使用其他不允许的字符。atom 的语法比这要复杂一些:基本上任何不属于另一个类别的东西都将形成一个 atom(例如,[]表示空列表的特殊 atom 和,表示连接的逗号 ( ) 都是原子。

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

在 prolog 的其他“数据类型”之上添加了语法糖:

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

    • 该列表[a]在内部表示为.(a,[]),
    • 列表和[a,b]_.(a,.(b,[]))
    • 列表[a,b|[c]].(a,.(b,.(c,[]))).

    应该注意,可以使用任何一种表示法来编写列表:它们将适当地统一。但是,您可以看到使用方括号列表表示法的吸引力。

  • 类似的语法糖应用于字符串。字符串可以写成由双引号分隔的文本字符串:"The cat and the hat". 然而,在内部,字符串表示为整数列表,表示实现内部编码中每个字符的代码点。例如,字符串"cat"在内部(以 ASCII/UTF-8 格式)表示为 list [99,97,116]"cat"更容易阅读,是吗?

于 2012-08-20T18:55:58.517 回答
4

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

这是一个 SVG 图(来源在这里):

SWI-Prolog 的类型

上面的内容有些特定于 SWI-Prolog,因为:

  • 有一个dict(关联数组)数据类型。
  • string是 SWI Prolog 中的一个单独的数据类型。传统上,“字符串”只是一个“字符列表”。
  • 空列表是一个特定的 atom []。传统上,空列表类似于空指针。
  • listbox/consbox 仿函数[|]代替了传统的..
  • 有 arity 0 的复合项,例如a(). 传统上,这些都不存在。
  • 有理数NrD是存在的。

对于那些喜欢历史的人,这里是第一本 Prolog 手册中的“术语”描述,该手册由 Philippe Roussel 于 1975 年 9 月编写,可在Prolog Héritage中找到。

Prolog 术语的第一篇文章

于 2014-12-25T16:50:32.500 回答
3

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

这种说法既正确又有些无用。据说类型在 Prolog 中的作用不大:一切都是术语,变量是无类型的,它们会根据需要与其他术语统一。

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

于 2012-08-20T12:57:54.293 回答
2

ISO 标准及其勘误表 2 具有几个测试谓词,用于测试 Prolog 中的数据类型。Richard O'Keefe 曾经安排这些测试谓词 http://www.complang.tuwien.ac.at/ulrich/iso-prolog/okeefe.txt 如下:

                    true
                      |
            +---------+---------+
            |                   |
         nonvar                var
            |
  +---------+--------------------------+
  |                                    |
compound                           atomic=constant
                                       |
            +----------------+---------+---------+
            |                |                   |
          number          string             atom=symbol
            |
    +-------+-------+ 
    |               |
 integer            float

我省略了不属于 ISO Prolog 的理性和复杂,但我保留了字符串,尽管它也不是 ISO Prolog 的一部分,但例如真正的字符串,即不是字符代码列表的双引号简写,而是真正的数据类型, 目前在 SWI-Prolog 版本 7 中找到。通常 ISO Prolog 允许向 Prolog 实现添加新的数据类型。

这棵树有一些不错的属性:

1) 兄弟姐妹是互斥的:
如果 s1, .., sn 是兄弟姐妹,那么对于给定参数,最大一个测试谓词 si 将成立。因此,例如,我们知道 float(X) 或 integer(X) 或两者都不成立,但对于特定的 X,并非两者一起成立。

2) 子项包含在其父项中:
如果 c 是子项且 p 是父项,则 c 隐含 p。因此,例如,我们知道如果 number(X) 成立,那么 atomic(X) 也适用于特定的 X。

ISO 核心标准中已经定义了更多的数据类型,这些数据类型不能轻易地放入树中。例如,长度为 1 的原子称为字符。0..max_code 之间的整数称为字符代码。0..255 之间的整数称为一个字节。有时是字符代码或字节。字符可能还包括 -1 和。end_of_file。这些数据类型没有自己的测试谓词,测试必须从其他谓词派生。

严格来说,ISO 核心标准还简单地将列表单元定义为带有函子“.”的 arity 2 的化合物,并将空列表定义为原子“[]”。一些 Prolog 系统,例如 SWI-Prolog 版本 7 违反了此规则,并为列表单元使用另一个函子。较新的 ISO 测试谓词 callable/1 连接原子和化合物。

然后是更全面的测试谓词,它们不仅仅查看给定术语的根元素的清单类型。例如谓词 ground/1 必须查看整个术语,测试谓词 acyclic_term/1 也是如此,两者都是 ISO 标准的一部分。

于 2015-03-30T17:20:52.617 回答
-1

http://ktiml.mff.cuni.cz/~bartak/prolog/data_struct.html

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

于 2012-08-20T12:56:34.897 回答