Erlang 是一种约束逻辑编程语言吗?

Posted

技术标签:

【中文标题】Erlang 是一种约束逻辑编程语言吗?【英文标题】:Is Erlang a Constraint-Logic programming language? 【发布时间】:2011-07-20 03:59:14 【问题描述】:

既然 Erlang 是基于 Prolog 的,这是否意味着 Erlang 是一种约束逻辑语言? Erlang 是否有 Prolog 的构建块:事实、规则和查询

【问题讨论】:

【参考方案1】:

没有。

Erlang 的语法与 Prolog 非常相似,但语义却大不相同。早期版本的 Erlang 是使用 Prolog 编写的,但今天的 Erlang 已经不能再有意义地说“基于 Prolog”了。

Erlang 不包括回溯或 Prolog 经常用于逻辑编程的其他功能。你当然可以在其他语言之上实现 Prolog,而 Erlang 是一个比其他语言更容易的选择。这可以在 Robert Virding 的“Erlog​​”项目中看到:

https://github.com/rvirding/erlog

【讨论】:

【参考方案2】:

是的。

Erlang 的第一个版本不是用 Prolog 编写的,它是用一种承诺选择逻辑编程语言编写的。这些语言放弃了 Prolog 的回溯,因此命名为“承诺选择”,意思是一旦做出选择,就不可能回溯并尝试另一个。这样做是为了简化使某种形式的逻辑编程并发。另一种看待它的方式是并发进程会将约束应用于变量,但作为逻辑变量并且因此不可重新分配,这些将是连续的约束而不是值的变化。约束可能会将部分值分配给变量,其中包含稍后将分配的另一个变量。这是 Erlang 的底层模型。约束逻辑编程倾向于用于约束还可以包括关于具有预期数值的变量的可能范围的数学陈述的版本。

Erlang 的语法显示了它的逻辑编程遗产,但重要的是要理解它是通过承诺选择的逻辑编程语言从 Prolog 中提取的,而不是直接从 Prolog 中提取的。尽管在 1980 年代设计了几种承诺的选择逻辑编程语言,但它们无法摆脱 Prolog 的阴影,并且由于与失败的日本第五代计划的关联以及因争吵而相互竞争的开发团队而被淘汰细微差别,因此没有建立标准。

Erlang 的开发人员引入了一种语法糖,使代码看起来更具功能性,并做出营销决定将其推广为一种功能性而非逻辑编程语言,使其不会被第五代后的解雇所拖累逻辑编程。

【讨论】:

谢谢,现在我更好地理解了 Erlang 中变量的绑定和不变性!很高兴知道它来自哪里。【参考方案3】:

简而言之,不,它不是 :) 它没有那些构建块。它的重点是并发、并行编程、分布式应用程序和容错(同时是一种函数式、严格的声明式语言)。

【讨论】:

【参考方案4】:

您可以很好地使用 Erlang 中的列表理解功能作为以约束编程风格实现的一种方式。

% Produce the tuple 1, 0
%
constraint_test() -> [ A, B ||
  A <- lists:seq(0, 1),
  B <- lists:seq(0, 1),
  A > B].

您也可以放置从列表 (A B) 中获取的元素的生成器。

我最近解决了下面链接的问题。如果您正确放置约束条件,您将在一秒钟内得到答案。

http://www.geocaching.com/seek/cache_details.aspx?guid=a8605431-53b5-4c2c-97fb-d42ee299b167

【讨论】:

以上是关于Erlang 是一种约束逻辑编程语言吗?的主要内容,如果未能解决你的问题,请参考以下文章

go语言接口(详解)

外键及其四种约束讲解

数据库中的五种约束及其添加方法

Oracle的五种约束

常见的五种约束

SQLarchemy 实现外键及其四种约束讲解