逻辑编程的最佳用途是什么?

mba*_*768 25 logic functional-programming prolog logic-programming

逻辑编程我指的是声明性编程语言的子范例.不要混淆这个问题和"如果 - 那么其他什么问题可以解决?"

像Prolog这样的语言非常吸引人,为了学习而值得学习,但我不得不想知道哪种类型的现实问题最能用这种语言表达和解决.还有更好的语言吗?在更流行的编程语言中,逻辑编程是否存在另一个名称?这个答案的愤世嫉俗版本是Python Paradox的一个变种吗?

Ale*_*rov 18

原型设计.

Prolog很有活力,已有50年历史.编译器很自由,语法简约,"做东西"简单,有趣,高效.SWI-Prolog有一个内置的跟踪器(调试器!),甚至还有一个图形跟踪器.您可以动态更改代码,使用make/0,您可以动态加载模块,添加几行代码而无需离开解释器,或者编辑您当前正在运行的文件edit(1).你认为你发现foobar/2谓词有问题吗?

?- edit(foobar).
Run Code Online (Sandbox Code Playgroud)

一旦你离开编辑器,那东西就会被重新编译.当然,Eclipse对Java也是如此,但Java并不是一种原型语言.

除了纯粹的原型设计之外,Prolog非常适合将一段逻辑转换为代码.因此,自动校对器和那种类型的东西可以很容易地用Prolog编写.

第一个Erlang解释器是用Prolog编写的 - 出于某种原因,因为Prolog非常适合解析和编码你在解析树中找到的逻辑.事实上,Prolog带有一个内置的解析器!不,不是库,它在语法中,即DCG.

Prolog 在NLP中使用很多,特别是在语法和计算语义方面.

但是,Prolog未被充分利用,并且被低估了.不幸的是,它似乎承担了学术或"无法用于任何真正目的"的耻辱.但它可以很好地用于许多涉及事实和事实之间关系计算的现实应用中.它不太适合数字运算,但CS不仅仅是数字运算.


Guy*_*der 12

由于Prolog = Syntactic Unification + Backward chaining + REPL,

大多数使用句法统一的地方也是Prolog的一个很好的用途.

句法统一使用

  • AST转换
  • 类型推断
  • 术语重写
  • 定理证明
  • 自然语言处理
  • 模式匹配
  • 组合测试用例生成
  • 从结构化数据(如XML文档)中提取子结构
  • 符号计算即微积分
  • 演绎数据库
  • 专家系统
  • 人工智能
  • 解析
  • 查询语言


mat*_*mat 8

约束逻辑编程(CLP)

已经提到了许多非常好且非常适合的逻辑编程用例.我想用一个极其重要的逻辑编程应用领域的几个任务补充现有列表:

逻辑编程与其他范例无缝地,无缝地混合,具有约束,从而形成称为约束逻辑编程的框架.

这导致针对不同域的专用约束求解器,例如:

  • CLP(FD)用于整数
  • CLP(B)布尔人
  • CLP(Q)进行合理的数字
  • CLP(R)用于浮点数.

这些专用约束求解器导致了几个未提及的逻辑编程的重要用例,其中一些我在下面展示.

在选择Prolog系统时,其约束求解器的功能和性能通常是决定因素,特别是对于商业用户.

CLP(FD) - 推理整数

在实践中,CLP(FD)是逻辑编程最重要的应用之一,用于解决以下领域的任务:

  • 调度
  • 资源分配
  • 规划
  • 组合优化

有关更多信息和几个示例,请参阅.

CLP(B) - 布尔约束

CLP(B)通常用于:

  • SAT解决
  • 电路验证
  • 组合计数

.

CLP(Q) - 有理数

CLP(Q)用于解决运筹学中出现的重要问题:

  • 线性规划
  • 整数线性规划
  • 混合整数线性规划

.


Lou*_*nco 5

Prolog 免费为您提供的其中一项功能是回溯搜索算法——您可以自己实现它,但是如果您的问题最好通过提供该算法来解决,那么使用它是很好的。

我认为它擅长的两件事是数学证明和自然语言理解。


Vin*_*nie 5

Prolog非常适合非数字问题.该文章给出了序言的一些应用的几个例子,它可以帮助你了解它可能解决问题的类型.


Bri*_*ian 5

Prolog 擅长解决谜题等。也就是说,在解谜领域,它使简单/中等解谜变得更容易,而复杂解谜变得更难。尽管如此,为诸如 Hexiom、Sudoku 或 Nurikabe 之类的网格谜题编写求解器并不是特别困难。