Prolog中有哪些数据类型?

jos*_*osh 13 types prolog

根据维基百科,Prolog中的单一数据类型是术语.文还提到,"序言的单个数据taype是术语",但随后继续解释"序言中的数据类型的分类"(但我认为,只有一个类型......)现在,这些幻灯片何况不同的数据类型:"数字,字符和字符串".

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

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"更容易阅读,是吗?


Dav*_*fer 5

在我不那么谦虚的意见中,说" 语言的数据对象被称为术语.术语是常量,变量或复合词 "(并且一个子句是复合词)听起来不错,但是EBNF语法实际上有大约6个整页,因此在该语句中没有表达(很多)隐藏结构.因此,程序文本可以分解为这几个句法类,但是其中一个也对Lists,Dicts,Strings等感兴趣,它们必须以特定方式从这些低级部分组合.无论如何,图形如下.

(请注意,我包含了SWI Prolog'dict'.在调用外部代码时也会使用称为"外语术语"的东西,并且在SWI Prolog中最终为'string'提供了一个单独的数据类型.我想. image已经使用yEd创建,原始graphml文件可以在这里找到.)

所以,我听说你喜欢这些条款......

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

Prolog术语的第一篇文章


Ofi*_*fir -1

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

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