专家系统设计:逻辑编程 (Prolog) 与通用编程 (Java)

Expert Systems Design: logic programming (Prolog) versus general purpose programming (Java)

我正在构建一个名为 Tijari 的纸牌游戏(使用 40 张西班牙纸牌,与 Bridge 非常相似)作为专家系统。这都是我博士论文的一部分。

我很难在 Prolog 代码和 Java 代码之间找到一个很好的平衡,什么会去哪里以及为什么。游戏必须让人类玩家与 AI 以及彼此对抗,所以你可以有一个团队(人类 + AI)对(AI + AI)或(人类 + 人类)对(人类 + 人类)或任何东西之间。

虽然 Prolog 被定义为关于事实和规则,但我看到的大多数用途并不是您所谓的逻辑编程,而是实际上笨拙的编程,试图在语言的约束和错综复杂的情况下实现有时复杂的算法:洗牌、搜索和复杂的列表操作。为什么?

Prolog 的一些用途是像 Java 这样的语言无法轻易提供的,比如当涉及到基于现有规则和事实的推论以及查询信息的能力时,我通常似乎无法能够证明其使用的合理性。

是不是在逻辑上对领域知识进行了编码?好吧,由于回溯、剪切和递归,任何现实世界的 Prolog 程序似乎都比纯 Java 代码更难阅读。

是不是不需要软件开发人员编码领域知识,只需要领域专家?不是真的,您仍然需要精通 Prolog 的领域专家。

是不是不需要重新编译就可以轻松修改规则和事实?好吧,任何脚本语言都可以做到这一点。

它是否可以随着领域知识的发展而轻松发展?好吧,我相信领域知识不会发展到成为问题的程度,当它出现时,软件就会随之而来,这就是它一直如此的原因。

老实说,我很难证明使用 Prolog 作为必须构建专家系统(这里是游戏)的唯一语言,如果不是,当你最终使用 Java 和 Prolog,该行应该在哪里?

谢谢

我认为你的问题是一个非常好的和合理的问题,我也很确定它很快就会被关闭,因为许多其他有趣和有价值的 Prolog 问题已经结束了。

因此,我尽量在可能的情况下尽快给出答案。

首先,我想指出,许多 Prolog 程序目前确实比它们可能的更笨拙。造成这种情况的原因之一是现有的教学 material 有时比语言的当前状态落后几十年。因此,在过去的几年和几十年中,许多非常重要的声明性功能已在许多系统中广泛使用,但大部分 Prolog 程序员并不了解这些功能。 有了这些特性,许多 Prolog 程序变得不那么笨拙了

这两种语言之间的一个重要区别是我的经验:与在 Prolog 中编程相比,编写 Java 代码非常不方便。原因在你最初的几个严肃的 Prolog 程序之后立即变得显而易见:在 Java 中,你总是觉得至少有一步离实际任务太远了。你不能简单地写下术语、状态、知识等。不,你必须首先写下知识本身的元描述(以 类、类型、接口的形式),并且只有 你能不能说说你到底想要什么。但这还不是全部:实际知识 其属性的描述都非常低级。例如,您不能方便地通过模式匹配对事物进行符号推理。

Java 这种相当间接的编程风格的好处在我看来是非常值得怀疑的。至少我还没有看到 Java 程序,我可以板着脸说:“是的,Java 是这个项目的绝佳选择。”相比之下,我见过很多 Prolog 程序,其中 Prolog 绝对 项目的绝佳选择。

Prolog 中的编程 比 Java 中的编程更方便 有更多差异。例如:

  • Prolog 代码很容易被其他 Prolog 程序解析、更改和分析,允许一些非常酷的快捷方式
  • Prolog 代码很容易使用顶层进行交互式测试
  • 序言代码通常可以在多个方向使用,导致程序更短
  • 非常重要的是,使用相对简单的 Prolog 查询可以非常容易地制定广泛的测试用例,这些查询会生成大量回溯测试。

这些只是我想提及的几个例子。总的来说,我认为如果你把Java看作是一种"general purpose"编程语言,那么Prolog肯定属于这一类。至少我还没有看到有人说 "It would be so great if only we could use Java for this task!" 我已经多次听到关于 Prolog 的这句话。