Selen - CSP Solver
A Constraint Satisfaction Problem (CSP) solver library written in Rust with zero external dependencies.
Overview
This library provides efficient algorithms and data structures for solving constraint satisfaction problems. CSPs are mathematical problems defined as a set of objects whose state must satisfy a number of constraints or limitations.
Variable Types: int, float, mixed constraints
Constraint Categories:
- Mathematical:
+,-,*,/,%,abs(),min(),max(),sum() - Comparison:
==,!=,<,<=,>,>=(natural syntax) - Boolean Logic:
and(),or(),not()with array syntaxand([a,b,c])and variadic syntaxand(a,b,c,d) - Global:
alldiff(),allequal(), elementx[y] = z,count(vars, value, count),table(vars, tuples) - Ordering:
a <= b <= c,a < b < c,a >= b >= c,a > b > c(naturalbetweenconstraints) - Cardinality:
at_least(vars, value, count),at_most(vars, value, count),exactly(vars, value, count) - Conditional:
if_then(condition, constraint),if_then_else(condition, then_constraint, else_constraint)
Programmatic version of constraints
m.new(x.lt(y)); // x < y
m.new(y.le(z)); // y <= z
m.new(z.gt(5)); // z > 5
m.new(x.add(y).le(z)); // x + y <= z
m.new(y.sub(x).ge(0)); // y - x >= 0
m.new(x.mul(y).eq(12)); // x * y == 12
m.new(z.div(y).ne(0)); // z / y != 0
Mathematical syntax with post! macro
post!(m, x < y); // x < y
post!(m, y <= z); // y <= z
post!(m, z > int(5)); // z > 5
post!(m, x + y <= z); // x + y <= z
post!(m, y - x >= int(0)); // y - x >= 0
post!(m, x * y == int(12)); // x * y == 12
post!(m, z / y != int(0)); // z / y != 0
Installation
Add this to your Cargo.toml:
[]
= "0.8.5"
๐งฉ Solving Platinum Blonde puzzle:
๐ Puzzle stats: 17 clues given, 64 empty cells
Puzzle: Solution:
โโโโโโโโโฌโโโโโโโโฌโโโโโโโโ โโโโโโโโโฌโโโโโโโโฌโโโโโโโโ
โ ยท ยท ยท โ ยท ยท ยท โ ยท ยท ยท โ โ 9 8 7 โ 6 5 4 โ 3 2 1 โ
โ ยท ยท ยท โ ยท ยท 3 โ ยท 8 5 โ โ 2 4 6 โ 1 7 3 โ 9 8 5 โ
โ ยท ยท 1 โ ยท 2 ยท โ ยท ยท ยท โ โ 3 5 1 โ 9 2 8 โ 7 4 6 โ
โโโโโโโโโผโโโโโโโโผโโโโโโโโค โโโโโโโโโผโโโโโโโโผโโโโโโโโค
โ ยท ยท ยท โ 5 ยท 7 โ ยท ยท ยท โ โ 1 2 8 โ 5 3 7 โ 6 9 4 โ
โ ยท ยท 4 โ ยท ยท ยท โ 1 ยท ยท โ โ 6 3 4 โ 8 9 2 โ 1 5 7 โ
โ ยท 9 ยท โ ยท ยท ยท โ ยท ยท ยท โ โ 7 9 5 โ 4 6 1 โ 8 3 2 โ
โโโโโโโโโผโโโโโโโโผโโโโโโโโค โโโโโโโโโผโโโโโโโโผโโโโโโโโค
โ 5 ยท ยท โ ยท ยท ยท โ ยท 7 3 โ โ 5 1 9 โ 2 8 6 โ 4 7 3 โ
โ ยท ยท 2 โ ยท 1 ยท โ ยท ยท ยท โ โ 4 7 2 โ 3 1 9 โ 5 6 8 โ
โ ยท ยท ยท โ ยท 4 ยท โ ยท ยท 9 โ โ 8 6 3 โ 7 4 5 โ 2 1 9 โ
โโโโโโโโโดโโโโโโโโดโโโโโโโโ โโโโโโโโโดโโโโโโโโดโโโโโโโโ
โ
Solution found in 2289.885ms!
๐ Statistics: 538 propagations, 25 nodes explored
๐ Efficiency: 21.5 propagations/node
Examples
Core Problems
Constraint Types
Advanced Features
Real Applications
Basic Usage
use *;
Programmatic API Example
For developers who prefer a more explicit, programmatic approach, the same constraints can be built using the runtime API:
use *;
License
This project is licensed under the MIT License - see the LICENSE file for details.