用宝可梦教 Prolog 入门

查看原文 HN 讨论

文章摘要

作者 Alex Petros 写了一篇用宝可梦战斗机制教 Prolog 入门的长文。选这个题材的理由很简单——宝可梦战斗本身就是一个极其复杂的规则引擎——属性相克、状态变化、招式优先级、特性、双打规则……这种结构化的、需要在大量事实和规则上做查询的场景,正是逻辑编程的甜区

文章从事实(facts)开始建库——pokemon(bulbasaur).type(squirtle, water).。然后展示查询的双向性——这是 Prolog 区别于 SQL 的核心魅力之一:

同一条规则两个方向都能跑。接着引入复合查询——逗号是 AND、分号是 OR;以及规则定义——比如”造成伤害的招式 = 招式且伤害值 > 0”。

文章真正精彩的部分是逐步精化(progressive refinement)——用”找所有具有优先招式的宝可梦”做范例:先写一个最简单的版本;发现命中了双打专用招式,加排除;发现保护类招式不算”攻击”,加排除;发现 Prankster 特性会让所有变化招式变成优先招式,再加一层条件。这种自然的、增量的、知识表达式的迭代过程,是过程式语言写起来痛苦但 Prolog 写起来非常优雅的

作者最后用一个直白的对比收尾——同一个查询”找特攻 > 120、会冻干、ice 属性的宝可梦”,Prolog 版本的简洁程度和灵活度远高于 SQL JOIN 版本——你不需要预先定义 JOIN 关系,引擎自己会合一。”这是初学者用 spreadsheet 解决但严肃用户应该懂的工具。

HN 评论精华