逻辑编程的最佳用途是什么?
-
03-07-2019 - |
题
我所说的逻辑编程是指声明性编程语言的子范式。不要将此问题与“你可以用 if-then-else 解决什么问题?”混淆。
像Prolog这样的语言非常令人着迷,为了学习而值得学习,但我不得不想知道这样的语言最能表达和解决哪一类现实世界的问题。有更好的语言吗?在更流行的编程语言中,逻辑编程是否以另一个名称存在?答案的愤世嫉俗版本是答案的变体吗? Python悖论?
解决方案
原型。
Prolog充满活力,已有50年历史。编译器是自由的,语法极简主义,和“做东西”。简单,有趣,高效。 SWI-Prolog有一个内置的 tracer(调试器!),甚至图形追踪器。您可以使用 make / 0
动态更改代码,您可以动态加载模块,添加几行代码而无需离开解释器,或者编辑您当前正在运行的文件使用 edit(1)
。您是否认为 foobar / 2
谓词存在问题?
?- edit(foobar).
一旦你离开编辑器,那东西就会被重新编译。当然,Eclipse对Java也是如此,但Java并不是一种原型语言。
除了纯粹的原型设计之外,Prolog非常适合将一段逻辑转换为代码。因此,自动证明器和那种类型的东西可以很容易地用Prolog编写。
第一个Erlang解释器是用Prolog编写的 - 出于某种原因,因为 Prolog非常适合解析和编码你在解析树中找到的逻辑。事实上,Prolog带有一个内置的解析器!不,不是图书馆,它在语法中,即 DCG
Prolog在NLP中使用了很多,尤其是语法和计算语义。
但是,Prolog未得到充分利用和低估。不幸的是,它似乎带有一个学术或“无法用于任何真正的目的”。柱头。但它可以很好地用于许多涉及事实和事实之间关系计算的现实应用中。它不太适合数字运算,但CS不仅仅是数字运算。
其他提示
约束逻辑编程(CLP)
已经提到了许多非常好的和非常适合的逻辑编程用例。我想用来自逻辑编程极其重要的应用领域的几个任务来补充现有的列表:
逻辑编程无缝地融合在一起,比其他范式更无缝地融合 限制条件, ,产生一个名为 约束逻辑编程.
这导致针对不同的情况有专用的约束求解器 域, , 例如:
- 中电(FD) 为了 整数
- 中电(B) 为了 布尔值
- 中电(Q) 为了 合理的 数字
- 中电(R) 为了 浮点 数字。
这些专用的约束求解器导致了逻辑编程的几个尚未提及的重要用例,我在下面展示了其中一些用例。
在选择 Prolog 系统时,其约束求解器的功能和性能通常是决定因素,特别是对于商业用户而言。
CLP(FD) — 整数推理
在实践中,CLP(FD) 是逻辑编程最重要的应用之一,用于解决以下领域的任务:
- 调度
- 资源分配
- 规划
- 组合优化
看 clpfd 了解更多信息和几个示例。
CLP(B) — 布尔约束
CLP(B) 通常与以下方面结合使用:
- SAT 解答
- 电路验证
- 组合计数
看 CLPB.
CLP(Q) — 有理数
CLP(Q) 用于解决以下领域中出现的重要问题: 行动调查:
- 线性规划
- 整数线性规划
- 混合整数线性规划
看 克罗普克.
Prolog是非数字问题的理想选择。这篇文章给出了Prolog的一些应用程序的一些示例,它可能有助于您了解问题的类型它可能会解决。
Prolog为您提供免费的一个东西是回溯搜索算法 - 您可以自己实现它,但如果您的问题最好通过使用该算法来解决,那么使用它会很好。
我看到它擅长的两件事是数学证明和自然语言理解。
Prolog很擅长解决难题等问题。也就是说,在解谜领域,它使得简单/中等难题解决更容易,更复杂的难题解决。尽管如此,为Hexiom,Sudoku或Nurikabe等网格拼图等编写解算器并不是特别困难。
一个简单的答案是“构建系统”。用于构建Makefile的语言(至少是描述依赖关系的部分)本质上是一种逻辑编程语言,尽管不是真正的“纯粹”。逻辑编程语言。