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

时间:2008-10-18 23:50:46

标签: functional-programming prolog logic logic-programming

逻辑编程我指的是声明性编程语言的子范例。不要混淆这个问题和“你能用if-then-else解决什么问题?”

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

8 个答案:

答案 0 :(得分:17)

原型

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

foobar/2

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

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

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

Prolog在NLP中使用了很多,尤其是语法和计算语义。

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

答案 1 :(得分:11)

由于Prolog = Syntactic Unification + Backward chaining + REPL

大多数使用句法统一的地方也很适合Prolog。

  

句法统一使用

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

答案 2 :(得分:7)

约束逻辑编程(CLP)

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

使用约束,逻辑编程与其他范例无缝地,无缝地融合,从而形成一个名为约束逻辑编程的框架。

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

  • 整数
  • 的CLP(FD)
  • CLP(B) 布尔
  • 理性数字
  • 的CLP(Q)
  • 浮点数的CLP(R)

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

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

CLP(FD) - 推理整数

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

  
      
  • 计划
  •   
  • 资源分配
  •   
  • 计划
  •   
  • 组合优化
  •   

有关详细信息和几​​个示例,请参阅

CLP(B) - 布尔约束

CLP(B)通常用于:

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

请参阅

CLP(Q) - 有理数

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

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

请参阅

答案 3 :(得分:5)

Prolog是非数字问题的理想选择。这个article给出了Prolog的一些应用程序的一些示例,它可能有助于您理解它可能解决的问题类型。

答案 4 :(得分:4)

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

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

答案 5 :(得分:4)

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

答案 6 :(得分:2)

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

答案 7 :(得分:-1)

是的,Prolog has been around since 1972。它是由Alain Colmerauer与Philippe Roussel发明的,基于Robert Kowalski对Horn子句的程序解释。阿兰(Alain)是1970年至1995年的法国计算机科学家和艾克斯·马赛大学教授。

阿兰(Alain)发明了它来分析自然语言。他和他的“追随者”创造了几个成功的原型。

  • 他自己的系统Orbis可以用英语和法语理解有关太阳系的问题。见他的personal site
  • 沃伦和佩雷拉(Warren and Pereira)对世界地理进行的质量检查制度Chat80
  • 今天,IBM Watson是一个基于逻辑的当代质量检查,具有大量有关现实世界短语的统计信息。

所以您可以想象这就是优势所在。

他于2006年退休,一直活跃,直到2017年去世。他于1986年被法国政府任命为“骑士荣誉勋章”。