Nic*_*rey 23
我会咬人:Prolog有一种数据类型term
.答案不是很有用,嗯?
条款细分为
变量.占位符,不统一到任何特定术语.变量由与正则表达式匹配的符号标识[A-Z_][A-Za-z_0-9]*
.变量_
是特殊的:它是匿名变量.每次出现都_
表示一个不同的变量.例如,鉴于事实,
foo(1,2,3).
Run Code Online (Sandbox Code Playgroud)
类似的测试foo(_,_,_).
会成功,而类似的测试foo(A,A,A).
会失败.
然而,一旦变量与一个值统一(绑定),它就不再是变量的:除非通过回溯来解除它,它永远是永远的,并且总是与它统一起来.
数字是float
或者integer
.通常的规则适用(例如,-321
是一个整数,-321.0
或类似-3.21e+02
浮点数.
原子是名称,通常用以小写字母(例如atom
)开头的单词表示,与常规表达式匹配[a-z][A-Za-z0-9_]*
.或者,原子可以由撇号(例如'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"
更容易阅读,是吗?
在我不那么谦虚的意见中,说" 语言的数据对象被称为术语.术语是常量,变量或复合词 "(并且一个子句是复合词)听起来不错,但是EBNF语法实际上有大约6个整页,因此在该语句中没有表达(很多)隐藏结构.因此,程序文本可以分解为这几个句法类,但是其中一个也对Lists,Dicts,Strings等感兴趣,它们必须以特定方式从这些低级部分组合.无论如何,图形如下.
(请注意,我包含了SWI Prolog'dict'.在调用外部代码时也会使用称为"外语术语"的东西,并且在SWI Prolog中最终为'string'提供了一个单独的数据类型.我想. image已经使用yEd创建,原始graphml文件可以在这里找到.)
对于那些喜欢历史的人来说,这里是Philippe Roussel于1975年9月撰写的第一本Prolog手册中对"术语"的描述,该手册可以在PrologHéritage找到.
Ofi*_*fir -1
请参阅http://ktiml.mff.cuni.cz/~bartak/prolog/data_struct.html
Term 是一个容器,可以包含几种不同类型的数据(想想面向对象语言中的继承)
归档时间: |
|
查看次数: |
8788 次 |
最近记录: |