【Hacker News搬运】Prolog中的游戏编程
-
Title: Game Programming in Prolog
Prolog中的游戏编程
Text:
Url: https://thingspool.net/morsels/page-10.html
根据您提供的链接,以下是文章《Prolog 游戏编程 - 第1部分》的中文总结: 标题:Prolog 游戏编程 - 第1部分 日期:2024年8月25日 摘要: 作者是一位热衷于非传统编程范式的爱好者,他喜欢学习与常见的面向对象编程语言(如C#、Java等)截然不同的新编程语言。其中最具代表性的语言是LISP(它是一种强大的语言,适用于函数式编程以及在软件开发中的元语言模式)和Prolog(它是逻辑编程中最受欢迎的语言之一)。与熟悉C风格的命令式语言(如Ruby和Python)相比,学习这些语言难度很大,但最终证明这是锻炼大脑最有效的方法之一。 作者从2018年开始学习LISP,通过MIT的1986年讲座系列“SICP(计算机程序的构造与解释)”了解到一些核心概念(如lambda表达式、高阶函数等),因为它们已经成为C#语言的主要特性之一。他在Unity游戏开发中一直在使用C#。他的电子工程背景(特别是信号处理)帮助他轻松理解讲座后半部分的“流处理”概念。因此,学习LISP及其函数式设计模式并没有想象中那么困难。 然而,当作者开始学习著名的逻辑编程语言Prolog时,遇到了一个主要的智力挑战。尽管语法本身并不复杂,但Prolog编程方式对大脑的挑战很大。它处理数据结构(如列表)和基于数学关系算法的方法对我来说是如此新颖,以至于它极大地拓展了我的计算推理能力。 尽管Prolog在软件开发中的方法对作者来说很陌生,但他注意到Prolog与工程中许多有用的主题之间存在许多熟悉的联系。例如,他发现所谓的“关系数据库”(如MySQL)之所以被称为“关系数据库”,并不是因为它们包含通过引用相互关联的数据表,而是在Prolog语法中,数据表中的每一行都可以被视为一个n元谓词(其中n是表中的列数)。此外,他还发现每个数字电路组件(如逻辑门)的输入/输出行为可以作为n元关系(其中n是输入/输出端口的总数)实现,这意味着无论是硬件还是内存中的纯数据“对象”,都可以定义为逻辑编程中的关系(就像在函数式编程中可以将对象定义为函数一样)。此外,Prolog的声明性特性使他坚信它必须非常适合数据驱动设计。 这些认识很快使他开始思考逻辑编程在设计和实现高度复杂系统(如视频游戏的核心理念)方面有很大的潜力。他开始问自己,“是否有可能只用逻辑编程的语法来开发一个完整的游戏?”确实,除了实验目的之外,大多数游戏开发者仍然坚持使用通用编程语言(如C#)来制作游戏,原因有很多。例如,完全基于Prolog实现一个游戏可能对非硬核数学家来说是一个巨大的挑战。此外,Prolog可能也不是用于项目中不一定是复杂关系网的部分(如简单的I/O模块、图形模块、音频模块、物理模块等)的最佳语言。 然而,作者相信至少游戏的核心理念肯定可以用Prolog语言实现,并且我们可以通过这样做来解决大量的复杂设计问题。这是因为用声明性语句结构化的游戏系统将比命令式系统更加稳健、模块化,并且没有令人困惑的边缘情况(例如竞争条件)。 为了使这种替代方法成功,必须首先仅用逻辑关系/谓词来设计系统,而不使用其他任何东西(也就是说,没有函数、结构、类、接口、状态变量等)。这将使我们能够构建一个纯粹由Prolog的灵魂驱动的游戏系统。 世界和角色: Prolog游戏编程的核心思想是利用关系作为系统的最基本构建块,就像基本的电路组件(如电阻器、晶体管、电容器、电感器等)是电路的最基本构建块一样。因此,首先考虑最基本的关系(例如一元和二元)是合理的,看看这些元素是否可以成为游戏最基本的功能部件。 文章接着讨论了使用Prolog进行游戏编程时的“标签”和“关系”,以及如何使用这些概念来定义游戏中的角色和行为。 请注意,以上总结是基于您提供的文章内容,并尽可能保持原文的意图和风格。
Post by: febin
Comments:
dang: Normally we downweight posts that just have a Part 1 and then stop, but this one actually delivers the goods:<p><a href="https://thingspool.net/morsels/page-11.html" rel="nofollow">https://thingspool.net/morsels/page-11.html</a> (part 2)<p><a href="https://thingspool.net/morsels/page-12.html" rel="nofollow">https://thingspool.net/morsels/page-12.html</a> (part 3)<p><a href="https://thingspool.net/morsels/page-13.html" rel="nofollow">https://thingspool.net/morsels/page-13.html</a> (part 4)<p><a href="https://thingspool.net/morsels/page-14.html" rel="nofollow">https://thingspool.net/morsels/page-14.html</a> (part 5)<p>(and keeps going!)
dang: 通常情况下,我们会先删除只有第1部分的帖子,然后再停止,但这篇帖子实际上提供了好处:<p><a href=“https:”thingspool.net“morsels”page-11.html“rel=”nofollow“>https:”/;thingspool.net;柴油;page-11.html</a>(第2部分)<p><a href=“https:”thingspool.net“morsels”page-12.html“rel=”nofollow“>https:”/;thingspool.net;柴油;page-12.html</a>(第3部分)<p><a href=“https:”thingspool.net“morsels”page-13.html“rel=”nofollow“>https:”/;thingspool.net;柴油;page-13.html</a>(第4部分)<p><a href=“https:”thingspool.net“morsels”page-14.html“rel=”nofollow“>https:”/;thingspool.net;柴油;page-14.html</a>(第5部分)<p>(并继续!)
JoeDaDude: When I took an AI class, the first thing they taught was Prolog and for exercises we all had to write adventure/colossal cave style games in it. Prolog turned out be well suited to the task. The variety of simple games made in the class was astounding and I wish I could have collected the all the games made by the other students. We only spent a couple of weeks before moving on to other topics, like CLIPS and Lisp. In my own assignment, I made a Bureaucratic Maze [1], again, fairly straightforward in Prolog.<p>[1]. <a href="http://logicmazes.com/bureau/index.htm" rel="nofollow">http://logicmazes.com/bureau/index.htm</a>
JoeDaDude: 当我上人工智能课时,他们教的第一件事是Prolog,对于练习,我们都必须写冒险;Prolog非常适合这项任务。课堂上制作的各种简单游戏令人震惊,我希望我能收集到其他学生制作的所有游戏。我们只花了几周时间就转向了其他主题,比如CLIPS和Lisp。在我自己的任务中,我用Prolog制作了一个官僚迷宫[1],同样相当简单<p> [1]<a href=“http:#x2F;#x2F logicmazes.com#x2F bureau/ index.htm”rel=“nofollow”>http:/;logicmazes.com;主席团;index.htm</a>
kelseyfrog: There's an interesting (to me at least) overlap between gamestate as a set of facts and relations(Prolog), and the point of ECS("This is a database"[1]).<p>I personally experiment in Datascript as a gamestate db, but it's still quite an early attempt to conclude if it's a success. It's great seeing how ideas in this tutorial map 1-to-1 to that idea.<p>1. <a href="https://www.gamedevs.org/uploads/data-driven-game-object-system.pdf" rel="nofollow">https://www.gamedevs.org/uploads/data-driven-game-object-sys...</a>
kelseyfrog: 那里;游戏状态作为一组事实和关系(Prolog)与ECS(“这是一个数据库”[1])之间存在有趣的重叠(至少对我来说是这样)<p> 我个人将Datascript作为游戏状态数据库进行实验,但它;现在下结论还为时过早;这是一个成功。它;很高兴看到本教程中的想法是如何一对一地映射到这个想法的<p> 1<a href=“https://www.gamedevs.org上传数据驱动的游戏对象系统.pdf”rel=“nofollow”>https:/;www.gamedevs.org;上传;数据驱动的游戏对象系统</一
haolez: In the same vein, I had a lot of fun reading a game programming book with logic programming, but instead of Prolog it used CLIPS:<p>Adventures in Rule-Based Programming: A CLIPS Tutorial <a href="https://a.co/d/7wVOcZp" rel="nofollow">https://a.co/d/7wVOcZp</a>
haolez: 同样,我在阅读一本关于逻辑编程的游戏编程书时也很开心,但它没有使用Prolog,而是使用了CLIPS:<p>基于规则的编程冒险:CLIPS教程<a href=“https:#x2F;a.co.#x2F&#d=7wVOcZp”rel=“nofollow”>https:/;a.co;d;7wVOcZp</a>
klaussilveira: This is such a breath of fresh air on tackling the state machine issue in games with heavy logic (city simulation, for instance). I never thought about using Prolog for this.<p>Bravo!
klaussilveira: 这为在逻辑性很强的游戏(例如城市模拟)中解决状态机问题提供了新鲜空气。我从未想过使用Prolog来实现这一点<p> 好样的!