macos-programmer
macOS-specific development patterns, platform APIs, and decision frameworks. Use when developing Mac apps, macOS applications,…
SWI-Prolog-specific tooling, standards, and idioms. Use when working with SWI-Prolog code. Emphasizes relational thinking, steadfastness, DCGs, constraints, and mandatory testing with PlUnit.
Claude Code
$ npx -y skills add Pyroxin/opinionated-claude-skills --skill swi-prolog-programmer --agent claude-code
Codex
$ npx skills add Pyroxin/opinionated-claude-skills --skill swi-prolog-programmer -a codex -y
Cursor
$ npx skills add Pyroxin/opinionated-claude-skills --skill swi-prolog-programmer -a cursor -y
Gemini CLI
$ npx skills add Pyroxin/opinionated-claude-skills --skill swi-prolog-programmer -a gemini-cli -y
GitHub Copilot
$ npx skills add Pyroxin/opinionated-claude-skills --skill swi-prolog-programmer -a github-copilot -y
OpenCode
$ npx skills add Pyroxin/opinionated-claude-skills --skill swi-prolog-programmer -a opencode -y
Windsurf
$ npx skills add Pyroxin/opinionated-claude-skills --skill swi-prolog-programmer -a windsurf -y
name: swi-prolog-programmer description: SWI-Prolog-specific tooling, standards, and idioms. Use when working with SWI-Prolog code. Emphasizes relational thinking, steadfastness, DCGs, constraints, and mandatory testing with PlUnit.
Expert-level SWI-Prolog development centers on **thinking in relations not procedures**, writing steadfast predicates that work in multiple directions, and embracing the declarative paradigm. The most critical mental shift: abandon "how" (procedural thinking) for "what" (declarative specifications).
**Related skills:**
<logic_programming_fundamentals> **Core logic programming principles:**
</logic_programming_fundamentals>
This skill focuses on SWI-Prolog-specific tools, idioms, and practices that distinguish veteran developers from beginners.
**Target version**: Latest development release (9.3.x series as of November 2025) **Current stable**: 9.2.9.1 (April 2025) **Current development**: 9.3.34 (November 2025)
**Aggressive adoption philosophy**: Most developers should use development releases even for production. The development track is released every 2-4 weeks, typically robust, provides latest features, and issues are resolved quickly. The stable track (even minor versions) only receives critical patches and is intended for conservative deployments requiring predictable installations.
SWI-Prolog tries to minimize breaking changes and stay close to the ISO standard. From the SWI-Prolog documentation:[^1] "We try to make as few as possible changes that break backward compatibility..."
[^1]: Jan Wielemaker. SWI-Prolog: Directions. https://www.swi-prolog.org/Directions.html
**Version history reference**: https://www.swi-prolog.org/ChangeLog
When contributing to existing Prolog projects or open-source:
The aggressive adoption philosophy applies ONLY to codebases you own.
<core_philosophy> SWI-Prolog's design philosophy prioritizes **knowledge-intensive interactive systems** where logical correctness and development experience trump raw performance. As Jan Wielemaker (creator, 35+ years experience) explains: "My primary motivation has always been to build stuff that works rather than stuff that allows writing an academic paper."
The critical insight: **Backtracking provides a time machine** for exploring computation paths. Any use of the dynamic database (assert/retract) breaks this superpower. The database is explicitly documented as **"a non-logical extension to Prolog"** that "destroys all these nice goodies" of logical search.
Veteran developers avoid assert/retract except when information must genuinely survive backtracking, which is rare. Instead: thread state through arguments. </core_philosophy>
Use SWI-Prolog when the problem involves:
**Don't choose Prolog for**:
The 2010 "Prolog Story" by Kyle Cordes documents a 90% cost reduction on a complex scheduling system—not from coding faster, but from **thinking more clearly**. The declarative approach forced better problem understanding.
The fundamental shift from imperative programming: **think in terms of two variables instead of one**. You cannot write `i = i + 1` in Prolog because no value equals itself plus one. Instead: `I #= I0 + 1` describes the **relation** between two different variables I0 and I.
As Markus Triska emphasizes: "The same variable cannot reflect two different states, old and new, at the same time."
**Procedural reading** (wrong): "To find X such that Y holds, do the following steps..."
**Declarative reading** (correct): "X is related to Y when the following conditions hold..."
For `insert(Key, Tree, NewTree)`, read it as: "insert/3 shows how a key is related to a tree with and a tree without that key." The predicate describes a relationship, not a procedure.
Everything is a relation, so programs work in multiple directions. `append/3` with one definition provides four methods:
?- append([1,2], [3,4], ZS). % List construction ZS = [1,2,3,4]. ?- append([1,2], YS, [1,2,3,4]). % List subtraction YS = [3,4]. ?- append(XS, YS, [1,2,3,4]). % Generate all partitions XS = [], YS = [1,2,3,4] ; XS = [1], YS = [2,3,4] ; XS = [1,
This project descends from the personal prompts I'd been keeping for Claude Code prior to the release of skills and plugins. Over time it's also evolved into a sandbox where I figure out what makes Claude reliably good at a task, and find prompts that work.
macOS-specific development patterns, platform APIs, and decision frameworks. Use when developing Mac apps, macOS applications,…
Swift-specific idioms, tooling, and philosophy for both application development and command-line scripting. Use when working with…
Fish shell scripting judgment frameworks and critical idioms. Use when writing Fish scripts or shell automation. Focuses on when…
Java-specific tooling, documentation standards, testing practices, and modern idioms. Use when working with Java code or…
Clojure-specific philosophy, idioms, and judgment frameworks. Use when working with Clojure code. Emphasizes data-oriented…
Racket-specific tooling, libraries, idioms, and language-oriented programming philosophy. Use when working with Racket code.…
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.