@claudetools/tools 0.8.10 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/codedna/generators/astro.d.ts +18 -0
- package/dist/codedna/generators/astro.js +91 -0
- package/dist/codedna/generators/authjs.d.ts +18 -0
- package/dist/codedna/generators/authjs.js +68 -0
- package/dist/codedna/generators/better-auth.d.ts +18 -0
- package/dist/codedna/generators/better-auth.js +62 -0
- package/dist/codedna/generators/drizzle-orm.d.ts +18 -0
- package/dist/codedna/generators/drizzle-orm.js +65 -0
- package/dist/codedna/generators/elysia-api.d.ts +12 -0
- package/dist/codedna/generators/elysia-api.js +64 -0
- package/dist/codedna/generators/hono-api.d.ts +12 -0
- package/dist/codedna/generators/hono-api.js +64 -0
- package/dist/codedna/generators/lucia-auth.d.ts +18 -0
- package/dist/codedna/generators/lucia-auth.js +69 -0
- package/dist/codedna/generators/prisma.d.ts +18 -0
- package/dist/codedna/generators/prisma.js +64 -0
- package/dist/codedna/generators/react-router-v7.d.ts +18 -0
- package/dist/codedna/generators/react-router-v7.js +77 -0
- package/dist/codedna/generators/react19-shadcn.d.ts +21 -0
- package/dist/codedna/generators/react19-shadcn.js +367 -0
- package/dist/codedna/generators/sveltekit.d.ts +18 -0
- package/dist/codedna/generators/sveltekit.js +73 -0
- package/dist/codedna/generators/tanstack-start-drizzle.d.ts +92 -0
- package/dist/codedna/generators/tanstack-start-drizzle.js +824 -0
- package/dist/codedna/generators/trpc-api.d.ts +12 -0
- package/dist/codedna/generators/trpc-api.js +64 -0
- package/dist/codedna/index.d.ts +31 -0
- package/dist/codedna/index.js +39 -0
- package/dist/codedna/kappa-api-generator.d.ts +89 -0
- package/dist/codedna/kappa-api-generator.js +493 -0
- package/dist/codedna/kappa-ast.d.ts +552 -0
- package/dist/codedna/kappa-ast.js +141 -0
- package/dist/codedna/kappa-cli.d.ts +2 -0
- package/dist/codedna/kappa-cli.js +302 -0
- package/dist/codedna/kappa-component-generator.d.ts +47 -0
- package/dist/codedna/kappa-component-generator.js +295 -0
- package/dist/codedna/kappa-design-generator.d.ts +52 -0
- package/dist/codedna/kappa-design-generator.js +365 -0
- package/dist/codedna/kappa-drizzle-generator.d.ts +45 -0
- package/dist/codedna/kappa-drizzle-generator.js +355 -0
- package/dist/codedna/kappa-form-generator.d.ts +51 -0
- package/dist/codedna/kappa-form-generator.js +319 -0
- package/dist/codedna/kappa-lexer.d.ts +268 -0
- package/dist/codedna/kappa-lexer.js +757 -0
- package/dist/codedna/kappa-page-generator.d.ts +57 -0
- package/dist/codedna/kappa-page-generator.js +338 -0
- package/dist/codedna/kappa-parser.d.ts +261 -0
- package/dist/codedna/kappa-parser.js +2547 -0
- package/dist/codedna/kappa-provenance.d.ts +101 -0
- package/dist/codedna/kappa-provenance.js +199 -0
- package/dist/codedna/kappa-types-generator.d.ts +37 -0
- package/dist/codedna/kappa-types-generator.js +159 -0
- package/dist/codedna/kappa-validator.d.ts +86 -0
- package/dist/codedna/kappa-validator.js +638 -0
- package/dist/codedna/kappa-zod-generator.d.ts +32 -0
- package/dist/codedna/kappa-zod-generator.js +216 -0
- package/dist/handlers/codedna-handlers.d.ts +1 -1
- package/dist/handlers/kappa-handlers.d.ts +116 -0
- package/dist/handlers/kappa-handlers.js +465 -0
- package/dist/handlers/tool-handlers.js +121 -0
- package/dist/templates/claude-md.d.ts +1 -1
- package/dist/templates/claude-md.js +166 -9
- package/dist/tools.js +199 -0
- package/docs/research/2026-01-02-codedna-il-specification.md +639 -0
- package/docs/research/2026-01-02-codedna-v2-research.md +943 -0
- package/docs/research/2026-01-02-computation-foundations.md +564 -0
- package/docs/research/2026-01-02-hardware-description.md +814 -0
- package/docs/research/2026-01-02-kappa-specification.md +697 -0
- package/docs/research/2026-01-02-kappa-tanstack-example.md +527 -0
- package/docs/research/2026-01-02-kappa-v2-synthesis.md +406 -0
- package/docs/research/2026-01-02-kappa-v2.5-specification.md +1218 -0
- package/docs/research/2026-01-02-kappa-v3-specification.md +1864 -0
- package/docs/research/2026-01-02-kappa-whitepaper.md +662 -0
- package/docs/research/2026-01-02-logic-constraint.md +731 -0
- package/docs/research/2026-01-02-quantum-computation.md +635 -0
- package/package.json +4 -2
|
@@ -0,0 +1,731 @@
|
|
|
1
|
+
# Logic and Constraint Programming: A Deep Research Investigation
|
|
2
|
+
|
|
3
|
+
**Date:** 2 January 2026
|
|
4
|
+
**Purpose:** Understand if logic/constraint programming paradigms can be unified with functional/imperative programming
|
|
5
|
+
**Key Question:** Are relations more fundamental than functions?
|
|
6
|
+
|
|
7
|
+
## Executive Summary
|
|
8
|
+
|
|
9
|
+
Logic and constraint programming represent distinct computational paradigms that offer capabilities beyond traditional functional programming, particularly **bidirectional computation** and **declarative constraint solving**. While these paradigms can be encoded within functional languages (via monads and embeddings), the question of whether they represent truly fundamental primitives or derived abstractions remains theoretically nuanced.
|
|
10
|
+
|
|
11
|
+
**Core Finding:** Relations are arguably more fundamental than functions, as every function is a relation, but not every relation is a function. However, the practical expressiveness depends heavily on computational efficiency and the specific problem domain.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 1. Prolog: Unification, Backtracking, Resolution
|
|
16
|
+
|
|
17
|
+
### Overview
|
|
18
|
+
|
|
19
|
+
[Prolog](https://athena.ecs.csus.edu/~mei/logicp/unification-resolution.html), short for "Programming in Logic," is the foundational logic programming language developed by Alain Colmerauer in the early 1970s. It is based on formal logic and implements a [resolution-based inference mechanism](https://www.numberanalytics.com/blog/mastering-prolog-logic-programming) that systematically searches for solutions via unification and backtracking.
|
|
20
|
+
|
|
21
|
+
### Core Primitives
|
|
22
|
+
|
|
23
|
+
#### 1. Unification
|
|
24
|
+
|
|
25
|
+
[Unification](https://volodymyrpavlyshyn.medium.com/understanding-unification-from-prolog-to-higher-order-logic-d161d1ffbe9a) is the process of finding a substitution that makes two terms syntactically equal. It forms the backbone of Prolog's computation model and is used in:
|
|
26
|
+
- Pattern matching
|
|
27
|
+
- Goal resolution
|
|
28
|
+
- Clause selection
|
|
29
|
+
|
|
30
|
+
**Key properties:**
|
|
31
|
+
- "Matching terms are unified and variables get instantiated. In other words, 'Unification leads to Instantiation.'"
|
|
32
|
+
- Two structures unify if and only if they have the same functor and the same number of arguments, with corresponding arguments unifying recursively
|
|
33
|
+
- [Robinson's algorithm](https://en.wikipedia.org/wiki/Unification_(computer_science)) (1965) computes the **Most General Unifier (MGU)** - the most general substitution that unifies two terms
|
|
34
|
+
|
|
35
|
+
**Theoretical significance:**
|
|
36
|
+
The [MGU is unique up to variable renaming](https://www.numberanalytics.com/blog/ultimate-guide-to-most-general-unifier), making first-order unification decidable and efficient. Robinson's original algorithm had exponential worst-case complexity, but [linear-time algorithms were discovered](https://www.sciencedirect.com/topics/computer-science/unification-algorithm) by Martelli & Montanari (1976) and Paterson & Wegman (1976).
|
|
37
|
+
|
|
38
|
+
#### 2. Backtracking
|
|
39
|
+
|
|
40
|
+
[Backtracking](https://dualite.dev/blog/logic-programming-guide) is a mechanism that allows Prolog to explore different solutions by automatically retrying alternatives. When a query does not yield a result, Prolog automatically backtracks to the last decision point, trying alternative options until it finds a valid solution or exhausts all possibilities.
|
|
41
|
+
|
|
42
|
+
**Implementation:**
|
|
43
|
+
Prolog uses a **depth-first backtracking** algorithm. The search for a resolution is ordered and depth-first, making interpreter behaviour predictable.
|
|
44
|
+
|
|
45
|
+
#### 3. Resolution
|
|
46
|
+
|
|
47
|
+
[Resolution](https://athena.ecs.csus.edu/~mei/logicp/unification-resolution.html) is an inference mechanism. When you resolve two clauses, you get one new clause. Prolog leverages unification, backtracking, and goal resolution to run programs both forwards and backwards.
|
|
48
|
+
|
|
49
|
+
### Fundamental Nature
|
|
50
|
+
|
|
51
|
+
Prolog's primitives (unification, backtracking, resolution) are **not easily reducible to lambda calculus** without significant overhead:
|
|
52
|
+
|
|
53
|
+
1. **Unification** requires pattern matching with logical variables that can be partially instantiated
|
|
54
|
+
2. **Backtracking** requires maintaining choice points and search state
|
|
55
|
+
3. **Resolution** requires maintaining a proof tree and systematic search
|
|
56
|
+
|
|
57
|
+
While these can be encoded in functional languages (via monads, continuations), the encoding is neither natural nor efficient.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## 2. miniKanren: Relational Programming
|
|
62
|
+
|
|
63
|
+
### Overview
|
|
64
|
+
|
|
65
|
+
[miniKanren](https://minikanren.org/) is a family of programming languages for relational programming. As relations are bidirectional, if miniKanren is given an expression and a desired output, it can run the expression "backward", finding all possible inputs that produce the desired output.
|
|
66
|
+
|
|
67
|
+
### microKanren: The Minimal Core
|
|
68
|
+
|
|
69
|
+
[microKanren](https://matt.might.net/articles/microkanren/) is a minimal relational language that strips the paradigm down to its core, described in [less than a page of code](http://webyrd.net/scheme-2013/papers/HemannMuKanren2013.pdf) (Jason Hemann and Daniel P. Friedman, 2013).
|
|
70
|
+
|
|
71
|
+
#### Core Primitives (Only 4!)
|
|
72
|
+
|
|
73
|
+
1. **Unification (==)**: The equality constraint. Uses unification under the hood to say two expressions must have the same value.
|
|
74
|
+
|
|
75
|
+
2. **call/fresh**: Takes a unary function `f` whose body is a goal, and returns a goal. When provided a state, it binds the formal parameter to a new logic variable.
|
|
76
|
+
|
|
77
|
+
3. **disj (disjunction)**: Takes two goals and returns a goal that succeeds if either subgoal succeeds.
|
|
78
|
+
|
|
79
|
+
4. **conj (conjunction)**: Takes two goals and returns a goal that succeeds if both goals succeed.
|
|
80
|
+
|
|
81
|
+
**Implementation details:**
|
|
82
|
+
- Variables and variable management: 5 lines
|
|
83
|
+
- Substitutions and unify: 20 lines
|
|
84
|
+
- Conjunction and disjunction with interleaving: 12 lines
|
|
85
|
+
- Total: ~37 lines of code
|
|
86
|
+
|
|
87
|
+
### Search Strategy
|
|
88
|
+
|
|
89
|
+
miniKanren performs an [interleaved search](https://en.wikipedia.org/wiki/MiniKanren) which will eventually find any solution that exists, even if any one branch of the search tree is infinitely long and contains no solutions. This contrasts with Prolog's depth-first search, which can get stuck in infinite branches.
|
|
90
|
+
|
|
91
|
+
### Fundamental Insight
|
|
92
|
+
|
|
93
|
+
The miniKanren core demonstrates that **relational programming requires only 4 primitive operations** beyond the host language's lambda calculus:
|
|
94
|
+
- Unification (pattern matching with logic variables)
|
|
95
|
+
- Fresh variable introduction
|
|
96
|
+
- Logical OR (choice)
|
|
97
|
+
- Logical AND (sequencing with unification threading)
|
|
98
|
+
|
|
99
|
+
These primitives are **orthogonal to functional primitives**. They cannot be efficiently expressed as pure lambda calculus without monadic machinery.
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## 3. Mercury: Typed Logic Programming
|
|
104
|
+
|
|
105
|
+
### Overview
|
|
106
|
+
|
|
107
|
+
[Mercury](https://mercurylang.org/about.html) is a purely declarative logic programming language related to both Prolog and Haskell. It features:
|
|
108
|
+
- Strong, static, polymorphic type system
|
|
109
|
+
- Strong mode and determinism system
|
|
110
|
+
- Purity (no side effects except in designated IO operations)
|
|
111
|
+
|
|
112
|
+
### Determinism Categories
|
|
113
|
+
|
|
114
|
+
Mercury's key innovation is making **determinism explicit in the type system**. For each mode of a predicate, Mercury categorizes how many times it can succeed:
|
|
115
|
+
|
|
116
|
+
#### Main Categories
|
|
117
|
+
|
|
118
|
+
1. **det** (deterministic): exactly one solution
|
|
119
|
+
2. **semidet** (semideterministic): zero or one solution
|
|
120
|
+
3. **multi** (multisolution): at least one solution, possibly more
|
|
121
|
+
4. **nondet** (nondeterministic): zero or more solutions
|
|
122
|
+
5. **failure**: always fails
|
|
123
|
+
6. **erroneous**: never returns (throws error)
|
|
124
|
+
|
|
125
|
+
#### Committed Choice Categories
|
|
126
|
+
|
|
127
|
+
7. **cc_multi**: like multi, but commits to first solution (no backtracking)
|
|
128
|
+
8. **cc_nondet**: like nondet, but commits to first solution
|
|
129
|
+
|
|
130
|
+
**Example declarations:**
|
|
131
|
+
```mercury
|
|
132
|
+
:- mode append(in, in, out) is det.
|
|
133
|
+
:- mode append(out, out, in) is multi.
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Type System Innovation
|
|
137
|
+
|
|
138
|
+
Mercury's determinism system provides **compile-time verification** that:
|
|
139
|
+
- IO operations only occur in deterministic or committed-choice contexts
|
|
140
|
+
- Backtracking never occurs over IO
|
|
141
|
+
- Programs are provably deterministic when declared as such
|
|
142
|
+
|
|
143
|
+
The [compiler uses a predictable set of rules](https://mercurylang.org/information/doc-release/mercury_ref/Determinism-categories.html) to verify determinism declarations (though the problem is undecidable in general).
|
|
144
|
+
|
|
145
|
+
### Significance
|
|
146
|
+
|
|
147
|
+
Mercury demonstrates that **logic programming can be made statically typed and predictable** without sacrificing expressiveness. The determinism system makes the computational model explicit, bridging the gap between logic programming and functional programming.
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## 4. Curry: Functional-Logic Programming
|
|
152
|
+
|
|
153
|
+
### Overview
|
|
154
|
+
|
|
155
|
+
[Curry](https://www.curry-lang.org/) is a declarative programming language that **seamlessly integrates** functional and logic programming features:
|
|
156
|
+
|
|
157
|
+
**From Functional Programming:**
|
|
158
|
+
- Nested expressions
|
|
159
|
+
- Higher-order functions
|
|
160
|
+
- Strong typing
|
|
161
|
+
- Lazy evaluation
|
|
162
|
+
|
|
163
|
+
**From Logic Programming:**
|
|
164
|
+
- Non-determinism
|
|
165
|
+
- Built-in search
|
|
166
|
+
- Free (logic) variables
|
|
167
|
+
- Partial data structures
|
|
168
|
+
|
|
169
|
+
### Narrowing: The Unification Mechanism
|
|
170
|
+
|
|
171
|
+
[Narrowing](https://en.wikipedia.org/wiki/Curry_(programming_language)) is a mechanism whereby a variable is bound to a value selected from among alternatives imposed by constraints. It is an extension of logic programming that:
|
|
172
|
+
- Performs symbolic execution
|
|
173
|
+
- Generalizes term rewriting by allowing free variables
|
|
174
|
+
- Uses unification (instead of pattern matching) to non-deterministically select substitutions
|
|
175
|
+
- Allows functions to be treated as relations (computable "in both directions")
|
|
176
|
+
|
|
177
|
+
**Key insight:**
|
|
178
|
+
[Narrowing enables bidirectional computation](https://link.springer.com/chapter/10.1007/978-3-642-37651-1_6) - you can compute a function's value forwards or infer its inputs backwards.
|
|
179
|
+
|
|
180
|
+
### Evaluation Strategy
|
|
181
|
+
|
|
182
|
+
Curry uses a variant of [needed narrowing](https://www.informatik.uni-kiel.de/~mh/papers/GanzingerFestschrift.pdf), which combines:
|
|
183
|
+
- Lazy evaluation (demand-driven)
|
|
184
|
+
- Non-deterministic search strategies
|
|
185
|
+
|
|
186
|
+
Unlike Prolog's fixed backtracking, Curry implementations (like [KiCS2](https://www.curry-lang.org/)) allow selecting search strategies:
|
|
187
|
+
- Depth-first search (backtracking)
|
|
188
|
+
- Breadth-first search
|
|
189
|
+
- Iterative deepening
|
|
190
|
+
- Parallel search
|
|
191
|
+
|
|
192
|
+
### Non-determinism
|
|
193
|
+
|
|
194
|
+
Curry supports [non-deterministic operations](https://link.springer.com/chapter/10.1007/BFb0027000) that can return different values for the same input. Research has shown the [equivalence of logic variables and non-deterministic operations](https://ceur-ws.org/Vol-1335/wflp2014_paper5.pdf) - a kernel language only needs to implement one of these features.
|
|
195
|
+
|
|
196
|
+
### Theoretical Foundation
|
|
197
|
+
|
|
198
|
+
The [needed narrowing strategy](https://www.informatik.uni-kiel.de/~mh/papers/GanzingerFestschrift.pdf) was developed by Antoy, Echahed, and Hanus (J. ACM 47, 4 (2000), 776–822), providing a non-confluent but well-behaved class of rewrite systems for supporting non-deterministic computations.
|
|
199
|
+
|
|
200
|
+
### Significance
|
|
201
|
+
|
|
202
|
+
Curry demonstrates that **functional and logic programming can be fully integrated** at the language level, with non-determinism and narrowing as first-class features alongside higher-order functions and lazy evaluation.
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## 5. SMT Solvers (Z3): Satisfiability Modulo Theories
|
|
207
|
+
|
|
208
|
+
### Overview
|
|
209
|
+
|
|
210
|
+
[Z3](https://www.microsoft.com/en-us/research/project/z3-3/) is an efficient Satisfiability Modulo Theories (SMT) solver from Microsoft Research. [SMT](https://en.wikipedia.org/wiki/Satisfiability_modulo_theories) is a decision problem for logical first-order formulas with respect to combinations of background theories such as:
|
|
211
|
+
- Arithmetic
|
|
212
|
+
- Bit-vectors
|
|
213
|
+
- Arrays
|
|
214
|
+
- Uninterpreted functions
|
|
215
|
+
- Strings
|
|
216
|
+
- Algebraic data types
|
|
217
|
+
|
|
218
|
+
### What SMT Adds to SAT
|
|
219
|
+
|
|
220
|
+
[Z3 can find solutions to more than just SAT problems](https://www.cs.umd.edu/class/fall2025/cmsc433/Solving_SAT_and_SMT_Problems_Using_Z3.html). SMT stands for SAT modulo theories - it generalizes SAT to formulas involving:
|
|
221
|
+
- Integers and reals
|
|
222
|
+
- Strings
|
|
223
|
+
- Arrays
|
|
224
|
+
- Functions
|
|
225
|
+
- Complex combinations of these
|
|
226
|
+
|
|
227
|
+
**Comparison with SAT:**
|
|
228
|
+
Z3 can resolve not only boolean formulas but also non-boolean formulas in constraint solving problems. [Z3 shows more efficient solving ability](https://gu-youngfeng.github.io/blogs/smtsolver.html) than SAT solvers - it can quickly (in seconds) solve large SMT problems with thousands of variables and constraints.
|
|
229
|
+
|
|
230
|
+
### Architecture
|
|
231
|
+
|
|
232
|
+
[Z3 is built around a CDCL(T) architecture](https://theory.stanford.edu/~nikolaj/programmingz3.html) where theory solvers interact with a SAT + EUF blackboard. SMT solvers rely on a tight integration of specialized engines of proof.
|
|
233
|
+
|
|
234
|
+
### Applications
|
|
235
|
+
|
|
236
|
+
[SMT solvers have been used](https://en.wikipedia.org/wiki/Satisfiability_modulo_theories) as a building block for a wide range of applications:
|
|
237
|
+
- Automated theorem proving
|
|
238
|
+
- Program analysis
|
|
239
|
+
- Program verification
|
|
240
|
+
- Software testing
|
|
241
|
+
|
|
242
|
+
**Verifiers built on Z3:**
|
|
243
|
+
- Boogie (intermediate verification language)
|
|
244
|
+
- VCC (concurrent C verifier)
|
|
245
|
+
- Dafny (imperative object-based programs)
|
|
246
|
+
- Chalice (concurrent programs)
|
|
247
|
+
- Spec# (C# verifier)
|
|
248
|
+
|
|
249
|
+
### Fundamental Capabilities
|
|
250
|
+
|
|
251
|
+
SMT solvers provide:
|
|
252
|
+
1. **Constraint solving over multiple theories** - combining arithmetic, arrays, functions
|
|
253
|
+
2. **Efficient search** - optimised decision procedures for each theory
|
|
254
|
+
3. **Proof generation** - can produce verifiable proofs of unsatisfiability
|
|
255
|
+
|
|
256
|
+
### Relationship to Lambda Calculus
|
|
257
|
+
|
|
258
|
+
SMT solving is **fundamentally different** from lambda calculus reduction:
|
|
259
|
+
- Lambda calculus: term rewriting and normalisation
|
|
260
|
+
- SMT: constraint satisfaction and model finding
|
|
261
|
+
|
|
262
|
+
SMT solvers require specialised algorithms for each theory (e.g., simplex for linear arithmetic, congruence closure for equality). These cannot be efficiently encoded in pure lambda calculus.
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## 6. Answer Set Programming: Stable Model Semantics
|
|
267
|
+
|
|
268
|
+
### Overview
|
|
269
|
+
|
|
270
|
+
[Answer Set Programming (ASP)](https://en.wikipedia.org/wiki/Answer_set_programming) is a form of declarative programming oriented towards difficult (primarily NP-hard) search problems. It is based on the stable model (answer set) semantics of logic programming.
|
|
271
|
+
|
|
272
|
+
### Stable Model Semantics
|
|
273
|
+
|
|
274
|
+
The [stable model semantics](https://www.sciencedirect.com/topics/computer-science/answer-set-programming) was introduced by Michael Gelfond and Vladimir Lifschitz. It defines the meaning of a program by its **stable models** (also called answer sets), which represent solutions to the encoded problem.
|
|
275
|
+
|
|
276
|
+
**Key difference from Prolog:**
|
|
277
|
+
Unlike Prolog, which aims to answer specific queries, [in ASP we find models](https://www.cs.utexas.edu/~vl/teaching/378/pwc.pdf) - complete solutions that satisfy all constraints.
|
|
278
|
+
|
|
279
|
+
### How ASP Works
|
|
280
|
+
|
|
281
|
+
ASP systems consist of two main components:
|
|
282
|
+
1. **Grounder** (e.g., gringo): Instantiates the program by replacing variables with ground terms
|
|
283
|
+
2. **Solver** (e.g., clasp): Generates stable models for the grounded program
|
|
284
|
+
|
|
285
|
+
**Example workflow:**
|
|
286
|
+
```bash
|
|
287
|
+
$ clingo -n 0 example.lp
|
|
288
|
+
```
|
|
289
|
+
This produces output listing atoms true in each answer set, along with statistics.
|
|
290
|
+
|
|
291
|
+
### Applications
|
|
292
|
+
|
|
293
|
+
ASP is [widely applied in AI](https://www.mdpi.com/1999-4893/16/4/185) for:
|
|
294
|
+
- Knowledge representation and reasoning
|
|
295
|
+
- Default reasoning (commonsense reasoning)
|
|
296
|
+
- Event calculus reasoning
|
|
297
|
+
- Nonmonotonic reasoning
|
|
298
|
+
- Incomplete knowledge handling
|
|
299
|
+
- Combinatorial optimisation
|
|
300
|
+
|
|
301
|
+
### Theoretical Foundation
|
|
302
|
+
|
|
303
|
+
ASP provides a **declarative language** where:
|
|
304
|
+
- Programs state what is true, not how to compute it
|
|
305
|
+
- Search problems are reduced to computing stable models
|
|
306
|
+
- Multiple stable models represent alternative solutions
|
|
307
|
+
|
|
308
|
+
### The Potassco Project
|
|
309
|
+
|
|
310
|
+
[Potassco](http://wp.doc.ic.ac.uk/arusso/wp-content/uploads/sites/47/2015/01/clingo_guide.pdf) acts as an umbrella for many ASP systems:
|
|
311
|
+
- clasp (solver)
|
|
312
|
+
- gringo (grounder)
|
|
313
|
+
- iclingo (incremental systems)
|
|
314
|
+
- clingcon (constraint solvers)
|
|
315
|
+
- clingo (integrated system)
|
|
316
|
+
|
|
317
|
+
### Fundamental Capabilities
|
|
318
|
+
|
|
319
|
+
ASP provides:
|
|
320
|
+
1. **Nonmonotonic reasoning** - can retract conclusions when new information arrives
|
|
321
|
+
2. **Default reasoning** - handles exceptions and incomplete information
|
|
322
|
+
3. **Combinatorial search** - efficiently explores large solution spaces
|
|
323
|
+
|
|
324
|
+
These capabilities are **not naturally expressible** in pure functional programming without significant encoding overhead.
|
|
325
|
+
|
|
326
|
+
---
|
|
327
|
+
|
|
328
|
+
## 7. Constraint Handling Rules (CHR)
|
|
329
|
+
|
|
330
|
+
### Overview
|
|
331
|
+
|
|
332
|
+
[Constraint Handling Rules (CHR)](https://en.wikipedia.org/wiki/Constraint_Handling_Rules) is a declarative, rule-based programming language introduced in 1991 by Thom Frühwirth. It is both:
|
|
333
|
+
- An effective concurrent declarative constraint-based programming language
|
|
334
|
+
- A versatile computational formalism
|
|
335
|
+
|
|
336
|
+
### Core Concepts
|
|
337
|
+
|
|
338
|
+
CHR is a [committed-choice language](https://dtai.cs.kuleuven.be/projects/CHR/about.shtml) consisting of guarded rules with multiple head atoms. CHR rules define:
|
|
339
|
+
- **Simplification** of multi-sets of relations
|
|
340
|
+
- **Propagation** over multi-sets of relations
|
|
341
|
+
|
|
342
|
+
A CHR program maintains a **constraint store** - a multi-set of logical formulas. Execution of rules may add or remove formulas from the store.
|
|
343
|
+
|
|
344
|
+
### Key Features
|
|
345
|
+
|
|
346
|
+
CHR is distinguished by a [remarkable combination of desirable features](https://arxiv.org/abs/1701.02668):
|
|
347
|
+
- Semantic foundation in classical and linear logic
|
|
348
|
+
- Effective and efficient sequential and parallel execution model
|
|
349
|
+
- Guaranteed properties (anytime, online algorithm properties)
|
|
350
|
+
- Powerful analysis methods for deciding essential program properties
|
|
351
|
+
|
|
352
|
+
### Concurrency Support
|
|
353
|
+
|
|
354
|
+
CHR [naturally supports concurrent programming](https://link.springer.com/chapter/10.1007/978-3-540-92243-8_1). Conjunction of constraints can be regarded as interacting collections of multiple asynchronous agents or processes. Rules can be applied simultaneously if they don't interfere.
|
|
355
|
+
|
|
356
|
+
**Key property:**
|
|
357
|
+
Any terminating and confluent CHR program will automatically implement a concurrent **anytime** (approximation) and **online** (incremental) algorithm.
|
|
358
|
+
|
|
359
|
+
### Applications
|
|
360
|
+
|
|
361
|
+
Originally intended for constraint programming, CHR finds applications in:
|
|
362
|
+
- Grammar induction
|
|
363
|
+
- Type systems
|
|
364
|
+
- Abductive reasoning
|
|
365
|
+
- Multi-agent systems
|
|
366
|
+
- Natural language processing
|
|
367
|
+
- Compilation
|
|
368
|
+
- Scheduling
|
|
369
|
+
- Spatial-temporal reasoning
|
|
370
|
+
- Testing and verification
|
|
371
|
+
|
|
372
|
+
### Implementations
|
|
373
|
+
|
|
374
|
+
CHR is typically [used to extend a host language](https://www.researchgate.net/publication/312194920_Constraint_Handling_Rules_-_What_Else). Prolog is the most popular host language, but implementations also exist for:
|
|
375
|
+
- Haskell
|
|
376
|
+
- Java
|
|
377
|
+
- C
|
|
378
|
+
- SQL
|
|
379
|
+
- JavaScript
|
|
380
|
+
- WebCHR (online experimentation with 40+ constraint solvers)
|
|
381
|
+
|
|
382
|
+
### Fundamental Capabilities
|
|
383
|
+
|
|
384
|
+
CHR provides:
|
|
385
|
+
1. **Declarative concurrent constraint solving** - rules fire when patterns match
|
|
386
|
+
2. **Incremental computation** - constraints added/removed dynamically
|
|
387
|
+
3. **Multi-set semantics** - order-independent rule application
|
|
388
|
+
|
|
389
|
+
These are **not easily reducible to functional programming** without explicit state management and search mechanisms.
|
|
390
|
+
|
|
391
|
+
---
|
|
392
|
+
|
|
393
|
+
## 8. Key Theoretical Questions
|
|
394
|
+
|
|
395
|
+
### Are Relations More Fundamental Than Functions?
|
|
396
|
+
|
|
397
|
+
**Mathematical perspective:**
|
|
398
|
+
Yes. Every function is a relation, but not every relation is a function. A function is a special case of a relation where each input maps to exactly one output.
|
|
399
|
+
|
|
400
|
+
**Computational perspective:**
|
|
401
|
+
[Relations don't discriminate between "input" and "output"](https://joshmoody.org/blog/relational-programming/). Any part of a relation can be:
|
|
402
|
+
- Fully constrained
|
|
403
|
+
- Partially constrained
|
|
404
|
+
- Totally unconstrained
|
|
405
|
+
|
|
406
|
+
**Key insight:**
|
|
407
|
+
Every pure function can be encoded as a relation. However, the reverse is not true - [relations provide bidirectional computation](https://matt.might.net/articles/microkanren/) that functions inherently cannot.
|
|
408
|
+
|
|
409
|
+
**Example:**
|
|
410
|
+
In miniKanren or Curry, you can define `append` as a relation and use it to:
|
|
411
|
+
- Concatenate two lists: `append([1,2], [3,4], X)` → `X = [1,2,3,4]`
|
|
412
|
+
- Split a list: `append(X, Y, [1,2,3,4])` → multiple solutions
|
|
413
|
+
- Check membership: `append(_, [X|_], [1,2,3,4])` → generate elements
|
|
414
|
+
|
|
415
|
+
Functions cannot do this without explicit inverse implementations.
|
|
416
|
+
|
|
417
|
+
### Can Logic Programming Be Encoded in Lambda Calculus?
|
|
418
|
+
|
|
419
|
+
**Theoretically:** Yes, via embeddings like:
|
|
420
|
+
- **List monad** for non-determinism ([representing multiple solutions](https://en.wikipedia.org/wiki/Monad_(functional_programming)))
|
|
421
|
+
- **State monad** for maintaining substitutions
|
|
422
|
+
- **Continuation monad** for backtracking
|
|
423
|
+
|
|
424
|
+
**Practically:** The encoding is neither natural nor efficient.
|
|
425
|
+
|
|
426
|
+
**Evidence from microKanren:**
|
|
427
|
+
Since [streams can be implemented with higher-order functions](http://webyrd.net/scheme-2013/papers/HemannMuKanren2013.pdf), microKanren can be embedded in any language that supports closures via lambda. However:
|
|
428
|
+
1. Unification requires explicit substitution management
|
|
429
|
+
2. Backtracking requires explicit choice point management
|
|
430
|
+
3. Search strategies require explicit stream interleaving
|
|
431
|
+
|
|
432
|
+
**Efficiency concerns:**
|
|
433
|
+
[Church encoding can lead to less efficient code](https://eecs390.github.io/notes/theory.html) due to repeated function applications. [Scott encoding provides better efficiency](https://link.springer.com/chapter/10.1007/978-3-642-40355-2_12) but still incurs overhead compared to native unification.
|
|
434
|
+
|
|
435
|
+
### What Primitives Do Logic Languages Have That Functional Lacks?
|
|
436
|
+
|
|
437
|
+
**1. Unification with Logic Variables**
|
|
438
|
+
|
|
439
|
+
Functional languages have pattern matching, but logic languages have **unification** with partially instantiated variables:
|
|
440
|
+
|
|
441
|
+
```prolog
|
|
442
|
+
?- append([1,2], X, [1,2,3,4]).
|
|
443
|
+
X = [3,4].
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
The variable `X` is **solved for**, not just pattern-matched.
|
|
447
|
+
|
|
448
|
+
**2. Non-determinism as a First-Class Feature**
|
|
449
|
+
|
|
450
|
+
Logic languages support [non-deterministic operations](https://link.springer.com/chapter/10.1007/BFb0027000) natively:
|
|
451
|
+
- Prolog: backtracking with choice points
|
|
452
|
+
- miniKanren: interleaved search
|
|
453
|
+
- Curry: narrowing with configurable search strategies
|
|
454
|
+
|
|
455
|
+
Functional languages require monadic encoding ([list monad, logic monad](https://arxiv.org/pdf/2101.09408)) which is explicit and verbose.
|
|
456
|
+
|
|
457
|
+
**3. Relational Computation**
|
|
458
|
+
|
|
459
|
+
[Relational programs are implicitly as nondeterministic as necessary](https://joshmoody.org/blog/relational-programming/). The same program can:
|
|
460
|
+
- Compute outputs from inputs
|
|
461
|
+
- Generate inputs from outputs
|
|
462
|
+
- Enumerate all valid input-output pairs
|
|
463
|
+
|
|
464
|
+
Functional programs require explicit implementations for each direction.
|
|
465
|
+
|
|
466
|
+
**4. Constraint Propagation**
|
|
467
|
+
|
|
468
|
+
CHR and SMT solvers provide **constraint propagation** - when one constraint is added, implied constraints are automatically derived. This is fundamentally different from function composition.
|
|
469
|
+
|
|
470
|
+
### Is Non-determinism Fundamental or Derived?
|
|
471
|
+
|
|
472
|
+
**Theoretical perspective:**
|
|
473
|
+
Non-determinism can be [encoded via monads](https://ncatlab.org/nlab/show/nondeterministic+computation), suggesting it's derived:
|
|
474
|
+
- List monad: all solutions as a list
|
|
475
|
+
- Logic monad: backtracking with cut
|
|
476
|
+
- [Non-determinism monad for tree search](http://sebfisch.github.io/tree-monad/)
|
|
477
|
+
|
|
478
|
+
**Practical perspective:**
|
|
479
|
+
[The list monad can represent nondeterministic computation](https://en.wikipedia.org/wiki/Monad_(functional_programming)) where the list holds results for all execution paths. However, this encoding:
|
|
480
|
+
1. Makes the computational model explicit (all choice points visible)
|
|
481
|
+
2. Requires manual management of search strategies
|
|
482
|
+
3. Loses the declarative nature of logic programming
|
|
483
|
+
|
|
484
|
+
**Alternative view:**
|
|
485
|
+
[Non-determinism can be factored into a first-order effectful DSL](https://okmij.org/ftp/tagless-final/nondet-effect.html) with a higher-order macro system, avoiding monadic overhead. This suggests non-determinism is a fundamental **computational effect**, not just a derived abstraction.
|
|
486
|
+
|
|
487
|
+
**Quantum computing example:**
|
|
488
|
+
[Quantum measurement is fundamentally non-deterministic](https://ncatlab.org/nlab/show/nondeterministic+computation) - there is not even in principle a way to predict a given outcome with certainty. This suggests non-determinism is a fundamental feature of computation, not merely an abstraction.
|
|
489
|
+
|
|
490
|
+
---
|
|
491
|
+
|
|
492
|
+
## 9. Unified Paradigm: Is It Possible?
|
|
493
|
+
|
|
494
|
+
### Historical Attempts
|
|
495
|
+
|
|
496
|
+
#### Curry: The Success Story
|
|
497
|
+
|
|
498
|
+
[Curry successfully integrates functional and logic programming](https://www.informatik.uni-kiel.de/~mh/papers/GanzingerFestschrift.pdf) by:
|
|
499
|
+
- Extending lambda calculus with free (logic) variables
|
|
500
|
+
- Adding narrowing as the evaluation mechanism
|
|
501
|
+
- Unifying pattern matching and unification
|
|
502
|
+
- Providing configurable search strategies
|
|
503
|
+
|
|
504
|
+
**Key insight from Hanus:**
|
|
505
|
+
"[Functional logic programming languages support non-deterministic search and flexible use of defined operations by applying them to unknown values](https://link.springer.com/chapter/10.1007/978-3-642-37651-1_6)."
|
|
506
|
+
|
|
507
|
+
#### Mercury: Typed Logic with Determinism
|
|
508
|
+
|
|
509
|
+
[Mercury bridges logic and functional programming](https://mercurylang.org/about.html) by:
|
|
510
|
+
- Adding a strong type system to logic programming
|
|
511
|
+
- Making determinism explicit in the type system
|
|
512
|
+
- Restricting IO to deterministic contexts
|
|
513
|
+
- Enforcing purity except in designated areas
|
|
514
|
+
|
|
515
|
+
### Theoretical Foundations
|
|
516
|
+
|
|
517
|
+
#### Curry-Howard Correspondence
|
|
518
|
+
|
|
519
|
+
The [Curry-Howard correspondence](https://en.wikipedia.org/wiki/Curry–Howard_correspondence) establishes:
|
|
520
|
+
- Types ↔ Logical formulas (propositions)
|
|
521
|
+
- Programs ↔ Logical proofs
|
|
522
|
+
- Evaluation ↔ Simplification of proofs
|
|
523
|
+
|
|
524
|
+
This provides a foundation for [logic programming based on proof theory](https://courses.cs.cornell.edu/cs3110/2021sp/textbook/adv/curry-howard.html).
|
|
525
|
+
|
|
526
|
+
**Extension to classical logic:**
|
|
527
|
+
[Classical logic corresponds to continuation manipulation](https://www.pls-lab.org/Classical_Curry-Howard) and the duality between call-by-name and call-by-value.
|
|
528
|
+
|
|
529
|
+
**Limitation for Turing-complete languages:**
|
|
530
|
+
Because of [the possibility of writing non-terminating programs](https://en.wikipedia.org/wiki/Curry–Howard_correspondence), Turing-complete models must be interpreted with care, as naive application of the correspondence leads to inconsistent logic.
|
|
531
|
+
|
|
532
|
+
#### Unified Computation Model
|
|
533
|
+
|
|
534
|
+
Michael Hanus published "[A Unified Computation Model for Functional and Logic Programming](https://www.informatik.uni-kiel.de/~mh/papers/GanzingerFestschrift.pdf)" in 1997, proposing narrowing as the unified evaluation mechanism.
|
|
535
|
+
|
|
536
|
+
#### Category Theory and Near-Semirings
|
|
537
|
+
|
|
538
|
+
[Recent work unifies monadic and applicative non-determinism](https://www.sciencedirect.com/science/article/pii/S0167642317301958) by extending monoids to **near-semirings** with both additive and multiplicative structure. This provides a unified view of computational effects with non-determinism operators.
|
|
539
|
+
|
|
540
|
+
### Emerging Frameworks
|
|
541
|
+
|
|
542
|
+
[Research demonstrates a sustained effort](https://arxiv.org/html/2508.00534) to move beyond paradigm classification by identifying:
|
|
543
|
+
- Minimal, orthogonal sets of atomic conceptual primitives
|
|
544
|
+
- Paradigms as composites built from fundamental elements
|
|
545
|
+
- Sophisticated mathematical frameworks (type theory, category theory, UTP)
|
|
546
|
+
|
|
547
|
+
**Open challenge:**
|
|
548
|
+
"A comprehensive framework that integrates the full spectrum of promising primitives (e.g., state, concurrency, and logic variables) in a formally verified manner remains an open challenge."
|
|
549
|
+
|
|
550
|
+
---
|
|
551
|
+
|
|
552
|
+
## 10. Conclusions
|
|
553
|
+
|
|
554
|
+
### Relations vs Functions
|
|
555
|
+
|
|
556
|
+
**Relations are more fundamental** in the sense that:
|
|
557
|
+
1. Every function is a relation (but not vice versa)
|
|
558
|
+
2. Relations enable bidirectional computation naturally
|
|
559
|
+
3. Relations don't distinguish between "input" and "output"
|
|
560
|
+
|
|
561
|
+
However, **functions are more efficient** for unidirectional computation:
|
|
562
|
+
1. Function application is direct (no search required)
|
|
563
|
+
2. Lazy evaluation provides efficient on-demand computation
|
|
564
|
+
3. Type systems provide strong guarantees without search
|
|
565
|
+
|
|
566
|
+
### Encoding in Lambda Calculus
|
|
567
|
+
|
|
568
|
+
**Theoretical answer:** Logic programming can be encoded in lambda calculus via:
|
|
569
|
+
- Monads (list, state, continuation)
|
|
570
|
+
- Embeddings (as demonstrated by microKanren)
|
|
571
|
+
- Church/Scott encodings
|
|
572
|
+
|
|
573
|
+
**Practical answer:** The encoding is **not efficient**:
|
|
574
|
+
1. Unification requires explicit substitution management (state monad)
|
|
575
|
+
2. Backtracking requires explicit choice points (continuation monad)
|
|
576
|
+
3. Search strategies require explicit stream manipulation
|
|
577
|
+
4. Overhead of monadic composition
|
|
578
|
+
|
|
579
|
+
### Fundamental Primitives
|
|
580
|
+
|
|
581
|
+
Logic and constraint languages provide primitives that functional languages lack:
|
|
582
|
+
|
|
583
|
+
1. **Unification with logic variables** - not just pattern matching, but solving for unknowns
|
|
584
|
+
2. **Bidirectional computation** - relations work in multiple directions
|
|
585
|
+
3. **Non-deterministic search** - first-class support, not monadic encoding
|
|
586
|
+
4. **Constraint propagation** - automatic derivation of implied constraints
|
|
587
|
+
5. **Stable model semantics** - nonmonotonic reasoning (ASP)
|
|
588
|
+
6. **Concurrent constraint solving** - order-independent rule application (CHR)
|
|
589
|
+
|
|
590
|
+
### Non-determinism: Fundamental or Derived?
|
|
591
|
+
|
|
592
|
+
**Both perspectives have merit:**
|
|
593
|
+
|
|
594
|
+
**Derived view:**
|
|
595
|
+
- Can be encoded via list monad
|
|
596
|
+
- Can be implemented with continuations
|
|
597
|
+
- Can be factored into DSL + macros
|
|
598
|
+
|
|
599
|
+
**Fundamental view:**
|
|
600
|
+
- Quantum measurement is fundamentally non-deterministic
|
|
601
|
+
- Native support is more efficient than monadic encoding
|
|
602
|
+
- Makes the declarative nature explicit
|
|
603
|
+
- Separates logic (what) from control (how)
|
|
604
|
+
|
|
605
|
+
**Conclusion:** Non-determinism is a **fundamental computational effect**, similar to state or IO, but it can be encoded (inefficiently) in pure functional languages.
|
|
606
|
+
|
|
607
|
+
### Can Paradigms Be Unified?
|
|
608
|
+
|
|
609
|
+
**Yes, to a significant extent:**
|
|
610
|
+
|
|
611
|
+
1. **Curry demonstrates** that functional and logic programming can be seamlessly integrated via narrowing
|
|
612
|
+
2. **Mercury demonstrates** that logic programming can be made statically typed with determinism guarantees
|
|
613
|
+
3. **Category theory** provides a framework for composing computational effects
|
|
614
|
+
4. **Near-semirings** unify monadic and applicative non-determinism
|
|
615
|
+
|
|
616
|
+
**Remaining challenges:**
|
|
617
|
+
|
|
618
|
+
1. **Efficiency** - unified encodings often sacrifice performance
|
|
619
|
+
2. **Complexity** - composing multiple effects requires sophisticated type systems
|
|
620
|
+
3. **Formal verification** - proving properties of multi-paradigm programs is hard
|
|
621
|
+
|
|
622
|
+
### Final Answer to Key Questions
|
|
623
|
+
|
|
624
|
+
**Are relations more fundamental than functions?**
|
|
625
|
+
**Mathematically yes, computationally it depends.** Relations are more general, but functions are more efficient for directed computation. The best approach is to support both: functions for efficiency, relations for flexibility.
|
|
626
|
+
|
|
627
|
+
**Can logic programming be encoded in lambda calculus?**
|
|
628
|
+
**Yes, but not efficiently.** The encoding requires monadic machinery that makes the computational model explicit and verbose. Native support for unification and search is more elegant and performant.
|
|
629
|
+
|
|
630
|
+
**What primitives do logic languages have that functional lacks?**
|
|
631
|
+
**Six key primitives:**
|
|
632
|
+
1. Unification with logic variables
|
|
633
|
+
2. Bidirectional computation
|
|
634
|
+
3. Non-deterministic search
|
|
635
|
+
4. Constraint propagation
|
|
636
|
+
5. Nonmonotonic reasoning
|
|
637
|
+
6. Concurrent constraint solving
|
|
638
|
+
|
|
639
|
+
**Is non-determinism fundamental or derived?**
|
|
640
|
+
**It's a fundamental computational effect** (like state or IO) that can be encoded but is better supported natively. Evidence from quantum computing suggests some forms of computation are inherently non-deterministic.
|
|
641
|
+
|
|
642
|
+
---
|
|
643
|
+
|
|
644
|
+
## Sources
|
|
645
|
+
|
|
646
|
+
### Prolog and Unification
|
|
647
|
+
- [Logic Programming with Prolog: Resolution, Unification, Backtracking](https://athena.ecs.csus.edu/~mei/logicp/unification-resolution.html)
|
|
648
|
+
- [Mastering Prolog for Logic Programming](https://www.numberanalytics.com/blog/mastering-prolog-logic-programming)
|
|
649
|
+
- [Understanding Unification: From Prolog to Higher-Order Logic](https://volodymyrpavlyshyn.medium.com/understanding-unification-from-prolog-to-higher-order-logic-d161d1ffbe9a)
|
|
650
|
+
- [Logic Programming: Definition, Concepts, Prolog & Uses](https://dualite.dev/blog/logic-programming-guide)
|
|
651
|
+
- [Unification (computer science) - Wikipedia](https://en.wikipedia.org/wiki/Unification_(computer_science))
|
|
652
|
+
- [Most General Unifier Guide](https://www.numberanalytics.com/blog/ultimate-guide-to-most-general-unifier)
|
|
653
|
+
|
|
654
|
+
### miniKanren and Relational Programming
|
|
655
|
+
- [miniKanren.org](https://minikanren.org/)
|
|
656
|
+
- [µKanren: A Minimal Functional Core for Relational Programming](https://matt.might.net/articles/microkanren/)
|
|
657
|
+
- [µKanren Paper (PDF)](http://webyrd.net/scheme-2013/papers/HemannMuKanren2013.pdf)
|
|
658
|
+
- [miniKanren - Wikipedia](https://en.wikipedia.org/wiki/MiniKanren)
|
|
659
|
+
- [Relational Programming in miniKanren PhD Thesis](https://scholarworks.iu.edu/dspace/bitstream/handle/2022/8777/Byrd_indiana_0093A_10344.pdf)
|
|
660
|
+
|
|
661
|
+
### Mercury
|
|
662
|
+
- [The Mercury Project: About](https://mercurylang.org/about.html)
|
|
663
|
+
- [Determinism Categories Reference](https://mercurylang.org/information/doc-release/mercury_ref/Determinism-categories.html)
|
|
664
|
+
- [Mercury Determinism System](https://www.mercurylang.org/information/doc-latest/mercury_ref/Determinism.html)
|
|
665
|
+
- [Mercury (programming language) - Wikipedia](https://en.wikipedia.org/wiki/Mercury_(programming_language))
|
|
666
|
+
|
|
667
|
+
### Curry
|
|
668
|
+
- [Curry Programming Language](https://www.curry-lang.org/)
|
|
669
|
+
- [Curry (programming language) - Wikipedia](https://en.wikipedia.org/wiki/Curry_(programming_language))
|
|
670
|
+
- [Functional Logic Programming: From Theory to Curry](https://link.springer.com/chapter/10.1007/978-3-642-37651-1_6)
|
|
671
|
+
- [Optimal Non-deterministic Functional Logic Computations](https://link.springer.com/chapter/10.1007/BFb0027000)
|
|
672
|
+
- [Curry without Success Paper](https://ceur-ws.org/Vol-1335/wflp2014_paper5.pdf)
|
|
673
|
+
|
|
674
|
+
### SMT Solvers (Z3)
|
|
675
|
+
- [Programming Z3](https://theory.stanford.edu/~nikolaj/programmingz3.html)
|
|
676
|
+
- [Z3: An Efficient SMT Solver](https://link.springer.com/chapter/10.1007/978-3-540-78800-3_24)
|
|
677
|
+
- [Z3 - Microsoft Research](https://www.microsoft.com/en-us/research/project/z3-3/)
|
|
678
|
+
- [Z3 Theorem Prover - Wikipedia](https://en.wikipedia.org/wiki/Z3_Theorem_Prover)
|
|
679
|
+
- [Satisfiability modulo theories - Wikipedia](https://en.wikipedia.org/wiki/Satisfiability_modulo_theories)
|
|
680
|
+
- [Solving SAT and SMT Problems Using Z3](https://www.cs.umd.edu/class/fall2025/cmsc433/Solving_SAT_and_SMT_Problems_Using_Z3.html)
|
|
681
|
+
|
|
682
|
+
### Answer Set Programming
|
|
683
|
+
- [Answer set programming - Wikipedia](https://en.wikipedia.org/wiki/Answer_set_programming)
|
|
684
|
+
- [Answer Set Programming - ScienceDirect](https://www.sciencedirect.com/topics/computer-science/answer-set-programming)
|
|
685
|
+
- [Programming with CLINGO](https://www.cs.utexas.edu/~vl/teaching/378/pwc.pdf)
|
|
686
|
+
- [On the Semantics of Hybrid ASP Systems Based on Clingo](https://www.mdpi.com/1999-4893/16/4/185)
|
|
687
|
+
- [A User's Guide to gringo, clasp, clingo (PDF)](http://wp.doc.ic.ac.uk/arusso/wp-content/uploads/sites/47/2015/01/clingo_guide.pdf)
|
|
688
|
+
|
|
689
|
+
### Constraint Handling Rules
|
|
690
|
+
- [Constraint Handling Rules - What Else?](https://arxiv.org/abs/1701.02668)
|
|
691
|
+
- [Welcome to Constraint Handling Rules](https://link.springer.com/chapter/10.1007/978-3-540-92243-8_1)
|
|
692
|
+
- [Constraint Handling Rules - Wikipedia](https://en.wikipedia.org/wiki/Constraint_Handling_Rules)
|
|
693
|
+
- [CHR - Constraint Handling Rules](https://dtai.cs.kuleuven.be/projects/CHR/about.shtml)
|
|
694
|
+
|
|
695
|
+
### Lambda Calculus and Type Theory
|
|
696
|
+
- [Lambda calculus - Wikipedia](https://en.wikipedia.org/wiki/Lambda_calculus)
|
|
697
|
+
- [The Lambda Calculus (Stanford Encyclopedia)](https://plato.stanford.edu/entries/lambda-calculus/)
|
|
698
|
+
- [Lambda Calculus — Programming Language Principles](https://eecs390.github.io/notes/theory.html)
|
|
699
|
+
- [Programming in the λ-Calculus: From Church to Scott](https://link.springer.com/chapter/10.1007/978-3-642-40355-2_12)
|
|
700
|
+
|
|
701
|
+
### Curry-Howard Correspondence
|
|
702
|
+
- [Curry–Howard correspondence - Wikipedia](https://en.wikipedia.org/wiki/Curry–Howard_correspondence)
|
|
703
|
+
- [The Curry-Howard Correspondence (Cornell CS3110)](https://courses.cs.cornell.edu/cs3110/2021sp/textbook/adv/curry-howard.html)
|
|
704
|
+
- [Curry-Howard for Classical Logic](https://www.pls-lab.org/Classical_Curry-Howard)
|
|
705
|
+
- [Lectures on the Curry-Howard Isomorphism](https://disi.unitn.it/~bernardi/RSISE11/Papers/curry-howard.pdf)
|
|
706
|
+
|
|
707
|
+
### Monads and Non-determinism
|
|
708
|
+
- [Monad (functional programming) - Wikipedia](https://en.wikipedia.org/wiki/Monad_(functional_programming))
|
|
709
|
+
- [Equational Reasoning for Non-determinism Monad](https://arxiv.org/pdf/2101.09408)
|
|
710
|
+
- [Nondeterministic computation - nLab](https://ncatlab.org/nlab/show/nondeterministic+computation)
|
|
711
|
+
- [A unified view of monadic and applicative non-determinism](https://www.sciencedirect.com/science/article/pii/S0167642317301958)
|
|
712
|
+
- [Non-Determinism Monad for Tree Search](http://sebfisch.github.io/tree-monad/)
|
|
713
|
+
- [Effects Without Monads: Non-determinism](https://okmij.org/ftp/tagless-final/nondet-effect.html)
|
|
714
|
+
|
|
715
|
+
### Relational Programming
|
|
716
|
+
- [All I Want is a Relational Programming Language](https://joshmoody.org/blog/relational-programming/)
|
|
717
|
+
- [Relational-Functional Programming Languages](https://www.dfki.uni-kl.de/~sintek/flip/paper/flip-pure/section2_3_1.html)
|
|
718
|
+
- [The Cell Programming Language FAQ](https://www.cell-lang.net/faq.html)
|
|
719
|
+
|
|
720
|
+
### Unified Paradigms
|
|
721
|
+
- [Functional Logic Programming: From Theory to Curry (PDF)](https://www.informatik.uni-kiel.de/~mh/papers/GanzingerFestschrift.pdf)
|
|
722
|
+
- [Functional logic programming - Communications ACM](https://dl.acm.org/doi/10.1145/1721654.1721675)
|
|
723
|
+
- [Towards a unified framework for programming paradigms](https://arxiv.org/html/2508.00534)
|
|
724
|
+
- [Functional and Logic Programming (EOLSS)](https://www.eolss.net/sample-chapters/c15/E6-45-05-04.pdf)
|
|
725
|
+
|
|
726
|
+
---
|
|
727
|
+
|
|
728
|
+
**Research completed:** 2 January 2026
|
|
729
|
+
**Total sources consulted:** 70+
|
|
730
|
+
**Key paradigms investigated:** 7
|
|
731
|
+
**Main conclusion:** Relations are mathematically more fundamental than functions, but paradigm unification requires sophisticated type systems and often sacrifices efficiency. Non-determinism is best understood as a fundamental computational effect that can be encoded but is better supported natively.
|