根据维基百科,Prolog is the term中的单一数据类型。 This文本还提到“Prolog的单数据taype是术语”,但后来继续解释“Prolog中数据类型的分类”(但我认为只有一种类型......) 现在,these slides提到了不同的数据类型:“数字,字符和字符串”。
那么,Prolog中的数据类型实际上是什么?
答案 0 :(得分:22)
我会咬人:Prolog有一种数据类型term
。答案不是很有用,嗯?
条款细分为
变量。占位符,不统一到任何特定术语。变量由与正则表达式[A-Z_][A-Za-z_0-9]*
匹配的符号标识。变量_
很特殊:它是匿名变量。每次出现_
表示不同变量。例如,鉴于事实,
foo(1,2,3).
像foo(_,_,_).
这样的测试会成功,而像foo(A,A,A).
这样的测试会失败。
一旦变量与某个值统一(绑定),它就不再是变量:除非通过回溯取消它,它永远是永远的,并且始终与它统一起来。
数字可以是float
或integer
。适用通常的规则(例如-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。)
对于那些喜欢历史的人来说,这里是Philippe Roussel于1975年9月撰写的第一本Prolog手册中对“术语”的描述,可以在Prolog Héritage找到。
答案 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是一个容器,可以包含几种不同类型的数据(想想面向对象语言中的继承)