Prolog中有哪些数据类型?

时间:2012-08-20 12:50:51

标签: types prolog

根据维基百科,Prolog is the term中的单一数据类型。 This文本还提到“Prolog的单数据taype是术语”,但后来继续解释“Prolog中数据类型的分类”(但我认为只有一种类型......) 现在,these slides提到了不同的数据类型:“数字,字符和字符串”。

那么,Prolog中的数据类型实际上是什么?

6 个答案:

答案 0 :(得分: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)表示,与常规表达式匹配[a-z][A-Za-z0-9_]*。或者,原子可以由撇号(例如,'atom')界定,这可以方便地允许使用否则不允许的字符。 atom的语法稍微复杂一些:基本上不属于另一个类别的任何东西都会形成一个原子(例如,表示空列表的特殊原子[]和逗号(,)表示连词都是原子。

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

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

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

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

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

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

答案 1 :(得分:5)

在我不那么谦虚的意见中,说“The data objects of the language are called terms. A term is either a constant, a variable, or a compound term”(和一个条款是一个复合词)听起来不错,但EBNF syntax实际上有大约 6整页,所以在该陈述中没有表达(很多)隐藏结构。因此,程序文本可以分解为这几个句法类,但是其中一个也对Lists,Dicts,Strings等感兴趣,它们必须以特定方式从这些低级部分组合。无论如何,图形如下。

请注意,我包含了SWI Prolog'字典'。在调用外部代码时也会使用称为“外来术语”的东西,并且'字符串'最终在SWI中被赋予了单独的数据类型Prolog。我想。图片是使用yEd创建的,可以找到原始的graphml文件here

So, I heard you like terms...

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

First writeup of Prolog term

答案 2 :(得分:4)

  

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

这句话既正确又有点无用。可以说,类型在Prolog中不起作用:一切都是术语,变量是无类型的,它们将根据需要与其他术语统一。

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

答案 3 :(得分: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将适用于给定的参数。因此,例如我们知道浮点数(X)或整数(X)或者两个都没有,但不是两者都可以保持特定的X.

2)儿童包含在父母中:
如果c是一个孩子而p是父,那么c意味着p。因此,例如我们知道如果数字(X)成立,那么原子(X)也适用于特定的X.

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

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

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

答案 4 :(得分:1)

序言中有四个术语

  • 原子-由大写字母,小写字母,数字和下划线字符组成的字符串,以小写字母开头

  • 变量-变量是一串以大写字母或下划线开头的大写字母,小写字母,数字和下划线字符

  • 数字-Prolog实现确实支持浮点数或浮点数和整数 (即:... -2,-1、0、1、2、3,...)对于诸如计算列表元素之类的任务很有用

  • 结构-具有多个组件的对象。 例如。动物(猫,家养(是))。

答案 5 :(得分:0)

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

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