请问您能解释一下逻辑编程基础与类型系统和传统逻辑之间语法相似现象之间的基本联系是什么?
答案 0 :(得分:13)
Curry-Howard的对应关系不是逻辑编程,而是功能编程。 Prolog的基本机制在John Robinson的resolution technique证明理论中是合理的,它显示了如何检查表达为Horn子句的逻辑公式是satisfiable,也就是说,您是否可以找到条件替换它们的逻辑变量,使它们成立。
因此逻辑编程是关于将程序指定为逻辑公式,并且正如我所说,在Prolog重新解决方案中,程序的计算是某种形式的证明推理。相比之下,Curry-Howard的对应显示了一个特殊的逻辑公式中的证明,如natural deduction,对应于lambda演算中的程序,程序的类型对应于证明证明的公式; lambda演算中的计算对应于称为归一化的证明理论中的一个重要现象,它将证明转化为新的更直接的证明。所以逻辑编程和函数编程对应于这些逻辑中的不同层次:逻辑程序匹配逻辑的公式,而功能程序则匹配公式的证明。
还有另一个不同之处:使用的逻辑通常是不同的。逻辑编程通常使用更简单的逻辑 - 正如我所说,Prolog建立在Horn子句上,这是一个高度限制的公式,其中的含义可能不是嵌套的,并且没有析取,尽管Prolog使用了它来恢复经典逻辑的全部优势。削减规则。相比之下,像Haskell这样的函数式编程语言大量使用类型具有嵌套含义的程序,并且由各种形式的多态性进行修饰。它们也是基于直觉逻辑,这是一类逻辑,禁止使用罗宾逊的计算机制所基于的被排除中间原理。
其他一些观点:
答案 1 :(得分:3)
逻辑编程基本上是针对目标导向搜索证明。类型语言和逻辑之间的结构关系通常涉及函数式语言,尽管有时是命令式和其他语言 - 但不是直接的逻辑编程语言。这种关系将证据与程序联系起来。
因此,逻辑编程证明搜索可用于查找证明,然后将其解释为功能程序。这似乎是两者之间最直接的关系(如你所要求的那样)。
以这种方式构建整个程序是不切实际的,但它可以用于填充程序中的繁琐细节,并且在实践中有一些重要的例子。一个基本的例子是结构子类型 - 它对应于通过简单的蕴涵证明填写几个证明步骤。一个更复杂的例子是Haskell的类型类系统,它涉及一种特定类型的目标导向搜索 - 在极端情况下,它涉及编译时图灵完整形式的逻辑编程。