由于 Erlang 是基于 Prolog 的,这是否意味着 Erlang 是一种约束逻辑语言?
Erlang 是否有 Prolog 的构建块:事实、规则和查询
4 回答
不。
Erlang 的语法与 Prolog 非常相似,但语义却大不相同。早期版本的 Erlang 是使用 Prolog 编写的,但今天的 Erlang 已经不能再有意义地说是“基于 Prolog”了。
Erlang 不包括回溯或 Prolog 经常用于逻辑编程的其他功能。你当然可以在其他语言之上实现 Prolog,而 Erlang 是一个比其他语言更容易的选择。这可以在 Robert Virding 的“Erlog”项目中看到:
是的。
Erlang 的第一个版本不是用 Prolog 编写的,它是用一种承诺选择逻辑编程语言编写的。这些语言放弃了 Prolog 的回溯,因此命名为“承诺选择”,意思是一旦做出选择,就不可能回溯并尝试另一个。这样做是为了简化使某种形式的逻辑编程并发。另一种看待它的方式是并发进程会将约束应用于变量,但作为逻辑变量并且因此不可重新分配,这些将是连续的约束而不是值的变化。约束可能会将部分值分配给变量,其中包含稍后将分配的另一个变量。这是 Erlang 的底层模型。
Erlang 的语法显示了它的逻辑编程遗产,但重要的是要理解它是通过承诺选择的逻辑编程语言从 Prolog 中提取的,而不是直接从 Prolog 中提取的。尽管在 1980 年代设计了几种承诺选择逻辑编程语言,但它们无法摆脱 Prolog 的阴影,并因与失败的日本第五代计划的关联以及因争吵的开发团队竞争而被淘汰细微的差异,因此没有建立标准。
Erlang 的开发人员引入了一种语法糖,使代码看起来更具功能性,并做出营销决定将其推广为一种功能性而非逻辑编程语言,这使其不会因后第五代逻辑编程的淘汰而拖累.
简而言之,不,它不是:) 它没有那些构建块。它的重点是并发、并行编程、分布式应用程序和容错(同时是一种功能性、严格、声明性语言)。
您可以使用 Erlang 中的列表理解功能作为约束编程风格的一种实现方式。
% Produce the tuple {1, 0}
%
constraint_test() -> [ {A, B} ||
A <- lists:seq(0, 1),
B <- lists:seq(0, 1),
A > B].
您也可以放置从列表 (A <- lists:seq(0, 1)) 和约束 (A > B) 中获取的元素的生成器。
我最近解决了下面链接的问题。如果您正确放置约束,您将在一秒钟内得到答案。
http://www.geocaching.com/seek/cache_details.aspx?guid=a8605431-53b5-4c2c-97fb-d42ee299b167