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

Functional programming 逻辑编程的最佳用途是什么?,functional-programming,prolog,logic,logic-programming,minikanren,clpfd,clpb,clpq,Functional Programming,Prolog,Logic,Logic Programming,Minikanren,Clpfd,Clpb,Clpq,逻辑编程指的是声明式编程语言的子范式。不要把这个问题和“如果有,你能解决什么问题?” 像Prolog这样的语言非常吸引人,为了学习而学习是值得的,但我想知道哪一类真实世界的问题用这种语言表达和解决得最好。有更好的语言吗?在更流行的编程语言中,逻辑编程是否以另一个名称存在?这个答案的愤世嫉俗的版本是Prolog的一个变种吗?Prolog免费提供给您的一个东西是回溯搜索算法——您可以自己实现它,但如果您的问题最好通过使用该算法来解决,那么使用它就很好了 我看到它擅长的两件事是数学证明和自然语言理解。

逻辑编程指的是声明式编程语言的子范式。不要把这个问题和“如果有,你能解决什么问题?”


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

Prolog免费提供给您的一个东西是回溯搜索算法——您可以自己实现它,但如果您的问题最好通过使用该算法来解决,那么使用它就很好了

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

原型设计

Prolog是动态的,已经有50年的历史了。编译器是自由的,语法是最低限度的,而且“做事”简单、有趣、高效。SWI Prolog有一个内置的,甚至是一个。您可以使用
make/0
动态更改代码,可以动态加载模块,在不离开解释器的情况下添加几行代码,或者使用
edit(1)
编辑当前正在运行的文件。您认为您发现了
foobar/2
谓词的问题吗

?- edit(foobar).
一旦你离开编辑器,它就会被重新编译。当然,Eclipse对Java也做同样的事情,但Java并不完全是一种原型语言

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

第一个Erlang解释器是用Prolog编写的,这是有原因的,因为Prolog非常适合解析和编码解析树中的逻辑。事实上,Prolog附带了一个内置的解析器!不,不是一个库,它是在语法中,即s

Prolog在NLP中被大量使用,特别是在语法和计算语义方面


但是,Prolog没有得到充分利用和重视。不幸的是,它似乎带有学术或“无法用于任何实际目的”的污名。但是,它可以很好地应用于涉及事实和计算事实之间关系的许多实际应用中。它不太适合数字运算,但CS不仅仅是数字运算。

Prolog非常适合非数字问题。下面给出了一些Prolog应用程序的示例,它可能会帮助您了解它可能解决的问题类型。

Prolog非常擅长解决难题等。这就是说,在解谜领域,它使简单/中等解谜更容易,复杂解谜更难。尽管如此,为网格谜题等编写解算器并不特别困难。

一个简单的答案是“构建系统”。用于构建makefile的语言(至少是描述依赖关系的部分)本质上是一种逻辑编程语言,尽管它不是真正的“纯”逻辑编程语言。

因为Prolog=++

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

句法统一使用

  • AST变换
  • 类型推断
  • 术语重写
  • 定理证明
  • 自然语言处理
  • 模式匹配
  • 组合测试用例生成
  • 从结构化数据(如XML文档)提取子结构
  • 符号计算,即微积分
  • 演绎数据库
  • 专家系统
  • 人工智能
  • 解析
  • 查询语言
约束逻辑编程(CLP) 已经提到了许多非常好的和非常适合的逻辑编程用例。我想用逻辑编程的一个极其重要的应用领域中的几个任务来补充现有列表:

逻辑编程与约束无缝融合,比其他范式更无缝,从而形成一个称为约束逻辑编程的框架

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

  • CLP(FD)对于整数
  • CLP(B)适用于布尔人
  • CLP(Q)对于rational数字
  • CLP(R)用于浮点数
这些专用的约束求解器导致了逻辑编程的几个重要用例,这些用例没有被提及,我将在下面展示其中的一些

在选择Prolog系统时,其约束求解器的能力和性能往往是决定因素之一,特别是对于商业用户

CLP(FD)-整数推理 实际上,CLP(FD)是逻辑编程最重要的应用之一,用于解决以下领域的任务:

  • 日程安排
  • 资源分配
  • 规划
  • 组合优化
有关更多信息和几个示例,请参见

CLP(B)-布尔约束 中电(B)通常用于以下方面:

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

CLP(Q)-有理数 CLP(Q)用于解决运营研究中出现的重要问题类别

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