我所说的逻辑编程是指声明性编程语言的一个子范式。不要将此问题与“您可以使用 if-then-else 解决什么问题?”混淆。
像 Prolog 这样的语言非常吸引人,值得为了学习而学习,但我不得不想知道什么样的现实世界问题最好用这种语言来表达和解决。有更好的语言吗?逻辑编程是否存在于更流行的编程语言中?答案的愤世嫉俗的版本是Python Paradox的变体吗?
我所说的逻辑编程是指声明性编程语言的一个子范式。不要将此问题与“您可以使用 if-then-else 解决什么问题?”混淆。
像 Prolog 这样的语言非常吸引人,值得为了学习而学习,但我不得不想知道什么样的现实世界问题最好用这种语言来表达和解决。有更好的语言吗?逻辑编程是否存在于更流行的编程语言中?答案的愤世嫉俗的版本是Python Paradox的变体吗?
原型设计。
Prolog 是动态的,并且已经有 50 年的历史了。编译器很自由,语法极简,“做事”简单、有趣、高效。SWI-Prolog 有一个内置的跟踪器(调试器!),甚至还有一个图形跟踪器。您可以使用 动态更改代码make/0
,您可以动态加载模块,添加几行代码而无需离开解释器,或者使用 动态编辑您当前正在运行的文件edit(1)
。你认为你发现foobar/2
谓词有问题吗?
?- edit(foobar).
一旦你离开编辑器,那个东西就会被重新编译。当然,Eclipse 对 Java 也做了同样的事情,但 Java 并不完全是一种原型语言。
除了纯粹的原型制作之外,Prolog 非常适合将一段逻辑转换为代码。所以,自动证明器和那种类型的东西可以很容易地用 Prolog 编写。
第一个 Erlang 解释器是用 Prolog 编写的——这是有原因的,因为Prolog 非常适合解析和编码您在解析树中找到的逻辑。事实上,Prolog 带有一个内置的解析器!不,不是库,它在语法中,即DCG s。
Prolog在 NLP 中被大量使用,特别是在语法和计算语义方面。
但是,Prolog 未被充分利用和被低估。不幸的是,它似乎带有学术或“无法用于任何实际目的”的耻辱。但它可以很好地用于许多涉及事实和计算事实之间关系的实际应用程序中。它不太适合数字运算,但 CS 不仅仅是数字运算。
已经提到了许多非常好的和非常适合的逻辑编程用例。我想用来自逻辑编程的一个极其重要的应用领域的几项任务来补充现有的列表:
逻辑编程与约束无缝融合,比其他范式更无缝,从而产生了一个称为约束逻辑编程的框架。
这导致针对不同领域的专用约束求解器,例如:
这些专用的约束求解器导致了几个尚未提及的重要逻辑编程用例,其中一些我将在下面展示。
在选择 Prolog 系统时,其约束求解器的功能和性能通常是决定因素之一,尤其是对于商业用户而言。
在实践中,CLP(FD) 是逻辑编程最重要的应用之一,用于解决以下领域的任务:
- 调度
- 资源分配
- 规划
- 组合优化
有关更多信息和几个示例,请参见clpfd。
CLP(B) 常用于:
- SAT解题
- 电路验证
- 组合计数
请参阅clpb。
CLP(Q) 用于解决运筹学中出现的重要问题类别:
- 线性规划
- 整数线性规划
- 混合整数线性规划
请参阅clpq。
Prolog 为您免费提供的一件事是回溯搜索算法——您可以自己实现它,但如果您的问题最好通过提供该算法来解决,那么使用它会很好。
我见过它擅长的两件事是数学证明和自然语言理解。
Prolog 是非数字问题的理想选择。本文给出了一些 Prolog 应用程序的示例,它可能会帮助您了解它可能解决的问题类型。
Prolog 擅长解决难题等。也就是说,在解谜领域,它使简单/中等的解谜更容易,而复杂的解谜更难。尽管如此,为诸如 Hexiom、Sudoku 或 Nurikabe 之类的网格谜题编写求解器并不是特别困难。
一个简单的答案是“构建系统”。用于构建 Makefile 的语言(至少是描述依赖关系的部分)本质上是一种逻辑编程语言,尽管不是真正的“纯”逻辑编程语言。
是的,Prolog 自 1972 年以来一直存在。它是由 Alain Colmerauer 和 Philippe Roussel 根据 Robert Kowalski 对 Horn 子句的程序解释发明的。Alain 是法国计算机科学家,1970 年至 1995 年在艾克斯-马赛大学任教授。
Alain 发明了它来分析自然语言。他和他的“追随者”创造了几个成功的原型。
所以你可以想象这就是它的力量所在。
他于 2006 年退休,一直活跃到 2017 年去世。1986 年,他被法国政府授予荣誉军团骑士勋章。