Prolog有什么问题吗?
Prolog在列表和模式匹配方面表现相当不错,并提供了回溯作为额外的奖励。然而几十年来,它仍然是一种与众不同的语言,而函数式语言却蓬勃发展、层出不穷。
以Erlang为例。它的语法借鉴了Prolog,最初是用Prolog实现的,这真的很有趣。也就是说,从Erlang人的角度来看,Prolog存在根本性的问题,否则他们会根据自己的需要改进Prolog。
Prolog有什么问题吗?
Prolog在列表和模式匹配方面表现相当不错,并提供了回溯作为额外的奖励。然而几十年来,它仍然是一种与众不同的语言,而函数式语言却蓬勃发展、层出不穷。
以Erlang为例。它的语法借鉴了Prolog,最初是用Prolog实现的,这真的很有趣。也就是说,从Erlang人的角度来看,Prolog存在根本性的问题,否则他们会根据自己的需要改进Prolog。
在我看来,Prolog现在开始变得有趣了,但这个问题还没有定论。
是的,Prolog比Erlang有着更为悠久的传统,也是从实现角度来看更加复杂的语言!教授它也更加困难,例如,即使在其他所有语言中对于初学者来说已经无法解决的任务,都会被传统地给予Prolog初学者作为前几个示例。
正确且高效地处理回溯、垃圾回收、别名、属性变量、约束、异常处理以及许多其他Prolog功能之间微妙的相互依赖关系是很难做到的,即使一些最有才华和受过良好教育的程序员参与其中,数十年内也难以完成。目前可用的许多Prolog系统仅仅达到了现在可以在生产环境中认真使用的程度。
相比之下,制作一个简化版的Prolog让其高效且正确是相对容易的,但对于真正的Prolog却不是那么容易。
拿任何一个重要的程序进行比较,看看它的实现需要多长时间。大多数有趣的程序甚至在首次发布后几十年后仍在积极开发中。Prolog也是如此,一个完整的Prolog系统比许多其他语言实现提供了更多。
而我们确实需要真正的Prolog!所以,是的,Prolog存在问题:它难以正确地实现。但在很多功能上却非常出色,由于其中众多功能的优点:一旦完全实现,Prolog就是一个令人惊叹且无与伦比的开发环境,适用于各种任务,从定理证明到Web托管、解决组合优化问题、测试用例生成等许多现有应用程序。
例如,Erlang-style进程现在正在为Prolog开发。请参见Torbjörn Lager的Pengines。
为什么只有现在(即最近的两年左右)才能在Prolog中使用这个功能?原因很简单:许多Prolog系统(在这种情况下指SWI-Prolog)直到最近都无法稳定地运行24x7的Web服务器。 那是为什么呢?再次强调,由于其许多高级特性之间微妙的相互依赖关系,要正确实现这一点对于Prolog来说非常困难。慢慢地,我们终于到达了这里。