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

时间:2016-06-03 18:10:32

标签: java architecture prolog expert-system

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

我很难在Prolog代码和Java代码之间找到一个很好的平衡,那将会是什么以及为什么。游戏必须让人类玩家对抗AI以及相互对抗,所以你可以拥有一个(人类+ AI)与(AI + AI)或(人类+人类)vs(人类+人类)或任何其他人的团队之间。

虽然Prolog被定义为关于事实和规则,但我看到的大部分用法并不是你所谓的逻辑编程,而是实际上很难编程,试图在语言的约束和复杂性下实现有时复杂的算法:shuffles,搜索和复杂列表操作。为什么呢?

Prolog有一些用法,像Java这样的语言无法轻易提供,就像基于现有规则和事实的演绎以及查询信息的能力一样,我通常似乎无法证明其使用的合理性

它是否在逻辑中编码领域知识?好吧,任何真实的Prolog程序都比普通的Java代码更难阅读,因为回溯,剪切和递归。

事实上,它不需要软件开发人员对域知识进行编码,只需要域专家吗?不是真的,你仍然需要一个精通Prolog的领域专家。

您是否可以轻松修改规则和事实而无需重新编译?好吧,任何脚本语言都可以提供。

随着领域知识的发展,它是否可以轻松发展?好吧,我相信领域知识并没有因为它成为一个问题而发展得那么多,当它出现问题时,软件就会随之而来,这就是它一直以来的原因。

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

由于

1 个答案:

答案 0 :(得分:2)

我认为你的问题是一个非常好的合法问题,而且我也很确定它会很快被关闭,因为许多其他有趣且有价值的Prolog问题已经存在。

因此,尽管仍有可能,我会尽力回答。

首先,我想指出的是,许多Prolog程序目前确实比它们更加尴尬。其中一个原因是现有的教材有时几十年落后于当前的语言状态。因此,许多非常重要的声明性特征在过去几年和几十年中已在许多系统中广泛使用,很少有Prolog程序员所知。 使用这些功能,许多Prolog程序变得不那么尴尬了。

两种语言之间的一个重要区别在于我的经验:与Prolog中的编程相比,编写Java代码非常不方便。在您的前几个严肃的Prolog程序之后,原因立即变得明显:在Java中,您始终感觉至少离实际任务太远了一步。你不能简单地写下条款,状态,知识等等。不,你必须首先写下知识本身的元描述(以类,类型,接口的形式),然后只有然后的属性描述极低。例如,您无法通过模式匹配方便地以符号方式推理事物。

在我看来,Java本身就需要的这种非常间接的编程风格的好处非常值得怀疑。至少我还没有看到一个Java程序,我可以直截了当地说:“是的,Java是这个项目的一个很好的选择。”相比之下,我看过许多Prolog程序,其中Prolog肯定 是该项目的绝佳选择。

还有许多差异使得Prolog 中的编程远比使用Java编程更方便。例如:

  • Prolog代码很容易被其他Prolog程序解析,更改和分析,允许一些非常酷的快捷方式
  • Prolog代码很容易使用toplevel交互式测试
  • Prolog代码通常可用于多个方向,从而缩短程序
  • 非常重要的是,使用相对简单的Prolog查询来制定广泛的测试用例非常容易,这些查询会产生大量的回溯测试。

这些只是我想提到的几个例子。总的来说,我认为如果你认为Java是一种“通用”编程语言,那么Prolog肯定属于那个类别。至少我还没有看到一个项目,有人说“只要我们可以使用Java来完成这项任务,那就太棒了!”我已经多次听过关于Prolog的这句话了。