惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

人人都是产品经理
人人都是产品经理
Google DeepMind News
Google DeepMind News
博客园 - 【当耐特】
量子位
博客园 - 司徒正美
爱范儿
爱范儿
Hugging Face - Blog
Hugging Face - Blog
博客园 - 聂微东
Jina AI
Jina AI
J
Java Code Geeks
腾讯CDC
大猫的无限游戏
大猫的无限游戏
V
Visual Studio Blog
I
InfoQ
D
Docker
Recent Announcements
Recent Announcements
MongoDB | Blog
MongoDB | Blog
博客园 - Franky
宝玉的分享
宝玉的分享
G
Google Developers Blog
GbyAI
GbyAI
Y
Y Combinator Blog
有赞技术团队
有赞技术团队
H
Help Net Security

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
Prolog Basics Through Pokémon: A Pragmatic Guide to Logic...
pickuma · 2026-05-18 · via DEV Community

pickuma

Most developers learn programming through imperative steps: do this, then this, then return. Prolog flips that model. You describe what's true about your world, and the runtime figures out the rest by searching for proofs. That's a hard sell when the examples are dry — family trees, ancestor relations, Socrates as a man. A post from unplannedobsolescence.com swaps the dry stuff out for Pokémon, and the paradigm suddenly clicks. We worked through it ourselves to see whether the metaphor holds up.

Why Pokémon makes Prolog click

The post starts with facts. In Prolog, a fact is a statement you assert to be true:

type(charmander, fire).
type(squirtle, water).
type(bulbasaur, grass).

Enter fullscreen mode Exit fullscreen mode

That's it. No variables to declare, no functions to define. You've populated a tiny knowledge base, and you can already query it. Ask ?- type(charmander, X). and Prolog binds X = fire and reports it back.

This is where the Pokémon framing earns its keep. A list of family-tree facts feels like rote memorization. A list of type assignments feels like a thing you actually want to reason about — because every player has, at some point, asked the same questions Prolog answers naturally: what beats water, which fire types evolve into something with two types, whether an evolution chain is valid.

Rules extend facts with logic:

strong_against(fire, grass).
strong_against(water, fire).
strong_against(grass, water).

effective(Attacker, Defender) :-
  type(Attacker, AType),
  type(Defender, DType),
  strong_against(AType, DType).

Enter fullscreen mode Exit fullscreen mode

Read it backwards: effective(Attacker, Defender) is true if you can find an AType and a DType such that the attacker has that type, the defender has that type, and the first beats the second. Prolog doesn't execute this top-down like a function call. It searches.

Unification and backtracking, demystified

Two mechanics carry the entire paradigm. The Pokémon example surfaces both without needing to name them academically.

Unification is pattern matching with variables that can flow in either direction. Query ?- effective(charmander, X). and Prolog looks at the rule, sees that Attacker = charmander, then tries to find a DType such that strong_against(fire, DType) holds. It binds DType = grass, then searches for any Pokémon with type(X, grass). It finds bulbasaur. Answer returned.

Now press semicolon — Prolog's "give me another answer." This is where backtracking shows up. Prolog reverses out of X = bulbasaur, checks if there are other grass types, finds none, and reports false. Add type(oddish, grass). and re-query. Prolog finds bulbasaur, then on semicolon finds oddish. You didn't write a loop. There is no for keyword in your code. The search is the program.

The mental model shift is the hard part. In Python you'd write a function that takes an attacker, looks up its type, iterates over defenders, and returns matches. In Prolog you describe what makes a defender vulnerable and let the engine generate matches. Same answer, but the code is half as long and reads like a spec.

Evolution chains push the example further. A fact like evolves(charmander, charmeleon). plus evolves(charmeleon, charizard). lets you write:

evolves_to(X, Y) :- evolves(X, Y).
evolves_to(X, Y) :- evolves(X, Z), evolves_to(Z, Y).

Enter fullscreen mode Exit fullscreen mode

That's a recursive rule. Two clauses, six tokens of logic, and you've defined transitive closure. Query ?- evolves_to(charmander, charizard). and Prolog proves it by finding charmeleon in the middle. Ask ?- evolves_to(charmander, X). and it lists every descendant in the chain. Write the imperative equivalent in JavaScript and you're looking at twenty lines of graph traversal with a visited set.

Where this paradigm shows up today

Prolog itself is rarely the language you reach for in production. SWI-Prolog has a real community, IBM Watson used it for parts of Jeopardy, and constraint logic programming variants ship in real schedulers — but most developers won't write Prolog at work. The reason to learn it is paradigm fluency.

Datalog, which is essentially restricted Prolog, runs inside several modern systems. Datomic uses it for queries. The Rust compiler uses Datalog (via the chalk crate) for trait resolution. Authorization engines like Oso and SpiceDB use logic-language cousins. When you see ?- syntax in a Rust borrow-check internals doc, you'll know what's happening.

The other place it surfaces is AI reasoning systems. Modern LLM agents are doing something Prolog programmers recognized fifty years ago: searching a space of possible proofs. Tools that wrap LLMs in structured reasoning loops are reinventing forward chaining and resolution under different names. Reading the Pokémon walkthrough won't make you an expert in any of that, but it gives you a working intuition for the kind of computation involved.

If you want to try Prolog in five minutes, install SWI-Prolog (brew install swi-prolog on Mac), save the Pokémon facts above to pokemon.pl, and run swipl pokemon.pl. Type queries at the ?- prompt. Press semicolon for the next answer, period to commit. That's the whole REPL.

Reading the post critically and what to do next

The post's strength is pedagogy. It picks a domain where readers already have semantic intuition and uses that to carry the abstract concepts. The weakness — common to introductory Prolog material — is that it stops before the parts where Prolog gets weird. Cut (!), negation-as-failure, the difference between = and is, and the moment your innocent-looking rule causes an infinite loop are all left for later. That's the right call for a beginner post. Just don't mistake the clean parts for the whole language.

If you're using an AI-assisted editor to learn the paradigm, the experience has improved noticeably. Autocomplete for Prolog now catches obvious unification mistakes and surfaces predicate signatures inline. Two years ago, Prolog support in mainstream editors was hit-or-miss.

Read the source post first. It's short, and the examples carry their own weight. Then write your own knowledge base — not Pokémon. Pick a domain you know better than the author did: your music library, your team's on-call rotation, the dependency graph of a project you maintain. The point isn't to ship a Prolog program. The point is to feel what it's like to describe a problem instead of solving it step by step. That feeling is what you take back to your day job.


Originally published at pickuma.com. Subscribe to the RSS or follow @pickuma.bsky.social for new reviews.