专家系统设计:逻辑编程 (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 的这句话。
我正在构建一个名为 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 的这句话。