3 times sudoku - github pages · about core.logic core.logic is a logic programming library for...
TRANSCRIPT
![Page 1: 3 times Sudoku - GitHub Pages · About core.logic core.logic is a logic programming library for Clojure and ClojureScript core.logic is a port of miniKanren, developed first in Scheme](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec604905638540e6d6ee468/html5/thumbnails/1.jpg)
3 times SudokuLogic and Constraints in Clojure
Burkhardt Renz
Institut für SoftwareArchitekturTechnische Hochschule Mittelhessen
:clojureDJanuary 24th, 2015
![Page 2: 3 times Sudoku - GitHub Pages · About core.logic core.logic is a logic programming library for Clojure and ClojureScript core.logic is a port of miniKanren, developed first in Scheme](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec604905638540e6d6ee468/html5/thumbnails/2.jpg)
The Nature of the GameRules and Terminology
31 6 5 7
3 86 7 2 9 1 48 1 7 3 9 6
4 8 9 7
6 9 5 17 5 9 8 4 14
2 4
99 6 8
row
column block
The rule:Each digit appears once in each unit
![Page 3: 3 times Sudoku - GitHub Pages · About core.logic core.logic is a logic programming library for Clojure and ClojureScript core.logic is a port of miniKanren, developed first in Scheme](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec604905638540e6d6ee468/html5/thumbnails/3.jpg)
The Nature of the GameCandidates for the free cells
31 6 5 7
3 86 7 2 9 1 48 1 7 3 9 6
4 8 9 7
6 9 5 17 5 9 8 4 14
2 4
99 6 8 2
51 247
1 247
14
2
22 338
2 3 26
2 38
2 3
247
2 347 8
2 38
2 3 348
26
1 2 35
37
2 35
1 34 58
1 2 34 5 67 8 9
1 24 67
24 6
2 31 26
1 2 35 6
1 35
1 2 35
358
5
5 4 52
15 6
16 5
7155
9
![Page 4: 3 times Sudoku - GitHub Pages · About core.logic core.logic is a logic programming library for Clojure and ClojureScript core.logic is a port of miniKanren, developed first in Scheme](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec604905638540e6d6ee468/html5/thumbnails/4.jpg)
The Nature of the GameThe Solution
31 6 5 7
3 86 7 2 9 1 48 1 7 3 9 6
4 8 9 7
6 9 5 17 5 9 8 4 14
2 4
99 6 8
9
9
1
1
11
22
22
22
2
33
33
3
3
4
44
4
5
5
55
55
6
6
66
7
77
7
8
88
8
![Page 5: 3 times Sudoku - GitHub Pages · About core.logic core.logic is a logic programming library for Clojure and ClojureScript core.logic is a port of miniKanren, developed first in Scheme](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec604905638540e6d6ee468/html5/thumbnails/5.jpg)
The Nature of the GameSolving Sudoku (more or less brute force)
Demo
Project https://github.com/esb-dev/sudoku
File sudoku.clj
![Page 6: 3 times Sudoku - GitHub Pages · About core.logic core.logic is a logic programming library for Clojure and ClojureScript core.logic is a port of miniKanren, developed first in Scheme](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec604905638540e6d6ee468/html5/thumbnails/6.jpg)
The Nature of the GameWhat, not how
This program implements a certain strategy to solve thepuzzleIt says How to solve the puzzleBut we want to do better – we just want to express theproblem, i.e., the rules of Sudoku together with the given cluesWhat, not how – and let a generic engine, a solver figure outhow to solve the problem3 times Sudoku = you will see 3 possibilities to express therules of Sudoku. Each time a solver processes thisspecification and gives us the solution
![Page 7: 3 times Sudoku - GitHub Pages · About core.logic core.logic is a logic programming library for Clojure and ClojureScript core.logic is a port of miniKanren, developed first in Scheme](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec604905638540e6d6ee468/html5/thumbnails/7.jpg)
Logic WorkBench (lwb)About lwb
lwb comprises functions and tools for the propositional andpredicate logicit’s a playground for a course in logic and formal methodswork in progress, we published just some functions for thepropositional logichttps://github.com/esb-dev/lwb
![Page 8: 3 times Sudoku - GitHub Pages · About core.logic core.logic is a logic programming library for Clojure and ClojureScript core.logic is a port of miniKanren, developed first in Scheme](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec604905638540e6d6ee468/html5/thumbnails/8.jpg)
Logic WorkBench (lwb)Representation of propositions in lwb
An atomic proposition (short: an atom) can have one of thetruth values true or false.It is represented in lwb as a Clojure symbol, e.g. p, q. . .
A proposition is build from atoms and logical operators likenot, and, or, impl, ite. . .It is represented in lwb as a Clojure list – also Clojure codethat way, e.g., (or (not p) (not q)).
![Page 9: 3 times Sudoku - GitHub Pages · About core.logic core.logic is a logic programming library for Clojure and ClojureScript core.logic is a port of miniKanren, developed first in Scheme](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec604905638540e6d6ee468/html5/thumbnails/9.jpg)
Logic WorkBench (lwb)Interesting questions in propositional logic
Given a proposition like (or (not p) (not q)) there are twotypes of questions:
1 Given a valuation for the atoms, i.e. an assignment of truthvalues for the atoms:What is the truth value of the proposition?Example: Given p true, q false, the truth value of theproposition above is true.
2 Given a proposition:Is it satisfiable?, i.e. is there a valuation (a “world”) such thatthe proposition is trueThe proposition (or (not p) (not q)) is satisfiable.
![Page 10: 3 times Sudoku - GitHub Pages · About core.logic core.logic is a logic programming library for Clojure and ClojureScript core.logic is a port of miniKanren, developed first in Scheme](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec604905638540e6d6ee468/html5/thumbnails/10.jpg)
Logic WorkBench (lwb)Encoding Sudoku as a proposition
31 6 5 7
3 86 7 2 9 1 48 1 7 3 9 6
4 8 9 7
6 9 5 17 5 9 8 4 14
2 4
99 6 8
c281? ... c285? ... c289?
![Page 11: 3 times Sudoku - GitHub Pages · About core.logic core.logic is a logic programming library for Clojure and ClojureScript core.logic is a port of miniKanren, developed first in Scheme](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec604905638540e6d6ee468/html5/thumbnails/11.jpg)
Logic WorkBench (lwb)Encoding Sudoku as a proposition
For each cell and each possible digit we introduce an atomcxyd, where x is the row, y the column, and d the digit in thecell.For all x and y exactly one of the cxyd is true.For all units and all d at most one cyxd is trueFinally the givens, e.g., c122 in our example is true
![Page 12: 3 times Sudoku - GitHub Pages · About core.logic core.logic is a logic programming library for Clojure and ClojureScript core.logic is a port of miniKanren, developed first in Scheme](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec604905638540e6d6ee468/html5/thumbnails/12.jpg)
Logic WorkBench (lwb)Cardinality constraints in propositional logic
Given atoms p, q, r, we want to express:1 at least one of the atoms is true
(or p q r)
2 at most one of the atoms is true(or (not p) (not q))
(or (not p) (not r))
(or (not q) (not r))
3 lwb has functions that generate such formulae:(min-kof k syms)
(max-kof k syms)
(oneof syms)
e.g. (oneof ’[p q r]) gives a seq of the clauses above
![Page 13: 3 times Sudoku - GitHub Pages · About core.logic core.logic is a logic programming library for Clojure and ClojureScript core.logic is a port of miniKanren, developed first in Scheme](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec604905638540e6d6ee468/html5/thumbnails/13.jpg)
Logic WorkBench (lwb)Solving Sudoku with lwb
Demo
Project https://github.com/esb-dev/lwb
File lwb/prop/examples/sudoku.clj
![Page 14: 3 times Sudoku - GitHub Pages · About core.logic core.logic is a logic programming library for Clojure and ClojureScript core.logic is a port of miniKanren, developed first in Scheme](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec604905638540e6d6ee468/html5/thumbnails/14.jpg)
Logic WorkBench (lwb)How does it work?
propositionin cnf
satisfyingvaluation
propositionin dimacs
SAT4J
31 6 5 7
3 86 7 2 9 1 48 1 7 3 9 6
4 8 9 7
6 9 5 17 5 9 8 4 14
2 4
99 6 8 3
1 6 5 7
3 86 7 2 9 1 48 1 7 3 9 6
4 8 9 7
6 9 5 17 5 9 8 4 14
2 4
99 6 8
9
9
1
1
11
22
22
22
2
33
33
3
3
4
44
4
5
5
55
55
6
6
66
7
77
7
8
88
8
www.sat4j.org
![Page 15: 3 times Sudoku - GitHub Pages · About core.logic core.logic is a logic programming library for Clojure and ClojureScript core.logic is a port of miniKanren, developed first in Scheme](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec604905638540e6d6ee468/html5/thumbnails/15.jpg)
Kodkod in Clojure (kic)About Kodkod and kic
Leopardus guigna, Chilean cat, known to befastE�cient constraint solver for first order,relational logic – a finite model finder
developed by Emina Torlak, former MIT,now University of Washington, Seattlesee http://alloy.mit.edu/kodkod/
Kodkod in Clojure is an ultrathin wrapper forKodkod, seehttps://github.com/esb-dev/kic
![Page 16: 3 times Sudoku - GitHub Pages · About core.logic core.logic is a logic programming library for Clojure and ClojureScript core.logic is a port of miniKanren, developed first in Scheme](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec604905638540e6d6ee468/html5/thumbnails/16.jpg)
Kodkod in Clojure (kic)Ingredients of a Kodkod specification
A finite universe of “things”e.g. [1 2 3 4 5 6 7 8 9]
A structure of potential worlds given by relation variablese.g., a relation variable grid with 3 dimensions: x, y, d
A couple of constraints on the relational variablese.g. @x , y D! d : rx , y , ds P grid
A given partial solution defined by lower and upper bounds forthe relation variablese.g. r1, 2, 2s P grid . . .
A solution, aka instance or model, is a set of relations fulfillingthe constraints on the relational variables
![Page 17: 3 times Sudoku - GitHub Pages · About core.logic core.logic is a logic programming library for Clojure and ClojureScript core.logic is a port of miniKanren, developed first in Scheme](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec604905638540e6d6ee468/html5/thumbnails/17.jpg)
Kodkod in Clojure (kic)Encoding Sudoku in Kodkod
31 6 5 7
3 86 7 2 9 1 48 1 7 3 9 6
4 8 9 7
6 9 5 17 5 9 8 4 14
2 4
99 6 8
...[2 7 1][2 8 1][2 8 2][2 8 3][2 8 4][2 8 5][2 8 6][2 8 7][2 8 8][2 8 9][2 9 4]...
grid
![Page 18: 3 times Sudoku - GitHub Pages · About core.logic core.logic is a logic programming library for Clojure and ClojureScript core.logic is a port of miniKanren, developed first in Scheme](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec604905638540e6d6ee468/html5/thumbnails/18.jpg)
Kodkod in Clojure (kic)Encoding Sudoku in Kodkod
We have to express thateach cell has just one number in itThe value in each cell does not occur in another cell of its rowThe value in each cell does not occur in another cell of itscolumnAll numbers from the universe occur in a block
Kodkod/kic has a lot of operators of the relational algebra toexpress such constraints
![Page 19: 3 times Sudoku - GitHub Pages · About core.logic core.logic is a logic programming library for Clojure and ClojureScript core.logic is a port of miniKanren, developed first in Scheme](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec604905638540e6d6ee468/html5/thumbnails/19.jpg)
Kodkod in Clojure (kic)Solving Sudoku with kic
Demo
Project https://github.com/esb-dev/kic
File kic/examples/sudoku.clj
![Page 20: 3 times Sudoku - GitHub Pages · About core.logic core.logic is a logic programming library for Clojure and ClojureScript core.logic is a port of miniKanren, developed first in Scheme](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec604905638540e6d6ee468/html5/thumbnails/20.jpg)
Kodkod in Clojure (kic)How does it work?
specificationin kodkod
model forthe spec
satisfyingvaluation
propositionin dimacs
SAT Solver
31 6 5 7
3 86 7 2 9 1 48 1 7 3 9 6
4 8 9 7
6 9 5 17 5 9 8 4 14
2 4
99 6 8 3
1 6 5 7
3 86 7 2 9 1 48 1 7 3 9 6
4 8 9 7
6 9 5 17 5 9 8 4 14
2 4
99 6 8
9
9
1
1
11
22
22
22
2
33
33
3
3
4
44
4
5
5
55
55
6
6
66
7
77
7
8
88
8
e.g. SAT4J
![Page 21: 3 times Sudoku - GitHub Pages · About core.logic core.logic is a logic programming library for Clojure and ClojureScript core.logic is a port of miniKanren, developed first in Scheme](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec604905638540e6d6ee468/html5/thumbnails/21.jpg)
core.logicAbout core.logic
core.logic is a logic programming library for Clojure andClojureScriptcore.logic is a port of miniKanren, developed first in Schemeby William E. Byrd, Daniel P. Friedman and otherscore.logic expands Clojure from functional to relationalprogramming and constraint solvingcore.logic supports CLP(FD) – Constraint Logic Programmingover finite domains
![Page 22: 3 times Sudoku - GitHub Pages · About core.logic core.logic is a logic programming library for Clojure and ClojureScript core.logic is a port of miniKanren, developed first in Scheme](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec604905638540e6d6ee468/html5/thumbnails/22.jpg)
core.logicBasic concepts of core.logic
A logic variable aka lvar is a placeholder for a valueGoals are functions that encapsulate a logic programA goal succeeds if it can be made true by substitutingvariables by valuesGoals can be combined by conjunction (and) and disjunction(or)If a goal succeeds, we get as a result a sequence ofsubstitutions of the logic variables, i.e. all possible “worlds”that satisfy the constraints of the logic program
![Page 23: 3 times Sudoku - GitHub Pages · About core.logic core.logic is a logic programming library for Clojure and ClojureScript core.logic is a port of miniKanren, developed first in Scheme](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec604905638540e6d6ee468/html5/thumbnails/23.jpg)
core.logicBasic concepts of core.logic – Example
(run* [q]
(fresh [x y]
(== x 1)
(conde [(== y 1)]
[(== y 2)]
[(== y 3) (== x 2)])
(== q [x y])))
; => ([1 1] [1 2])
logic variable q aka querylocal fresh (unbound)logic variables x and y== means unify x with 1multiple goals connectedby and
conde is or (conditionalevery line)run* runs the solver andgives all possible solutions
![Page 24: 3 times Sudoku - GitHub Pages · About core.logic core.logic is a logic programming library for Clojure and ClojureScript core.logic is a port of miniKanren, developed first in Scheme](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec604905638540e6d6ee468/html5/thumbnails/24.jpg)
core.logicUnification – example
(run* [q](fresh [x y]
(== x 1)
(conde [(== y 1)]
[(== y 2)][(== y 3) (== x 2)])
(== q [x y])))
;=> ([1 1] [1 2])
x � 1
x � 2
q�[1 2]q�[1 1]
y � 1 y � 2 y � 3
![Page 25: 3 times Sudoku - GitHub Pages · About core.logic core.logic is a logic programming library for Clojure and ClojureScript core.logic is a port of miniKanren, developed first in Scheme](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec604905638540e6d6ee468/html5/thumbnails/25.jpg)
core.logicSolving Sudoku in core.logic
Demo
Project https://github.com/esb-dev/sudoku
File sudoku-cl.clj
![Page 26: 3 times Sudoku - GitHub Pages · About core.logic core.logic is a logic programming library for Clojure and ClojureScript core.logic is a port of miniKanren, developed first in Scheme](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec604905638540e6d6ee468/html5/thumbnails/26.jpg)
Play with logic in Clojure!
It’s fun – and useful, too
![Page 27: 3 times Sudoku - GitHub Pages · About core.logic core.logic is a logic programming library for Clojure and ClojureScript core.logic is a port of miniKanren, developed first in Scheme](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec604905638540e6d6ee468/html5/thumbnails/27.jpg)
AppendixBenchmarks
easy50 top95 hardest relative
python (P. Norvig) 4.0 14.6 5.3 1.0brute force 53.4 5838.2 213.6 340.0
lwb 136.7 141.0 137.5 13.2kic 14.2 13.7 10.9 1.3
core.logic 22.2 5317.31 258.13 308.9(times in msecs)
1A strange result. There are some puzzles in top95.txt where core.logicneeds 25 secs, others are solved in about 1 sec. I don’t know the reason forsuch a huge di�erence.
![Page 28: 3 times Sudoku - GitHub Pages · About core.logic core.logic is a logic programming library for Clojure and ClojureScript core.logic is a port of miniKanren, developed first in Scheme](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec604905638540e6d6ee468/html5/thumbnails/28.jpg)
AppendixInteresting Facts about Sudoku
1 The number of complete Sudoku grids is
9! ˆ 722 ˆ 27 ˆ 27, 704, 267, 971 « 6.7 ˆ 1021
(Bertram Felgenhauer and Frazer Jarvis, 2005)2 The minimal number of givens necessary to build proper
puzzles is 17.(Gary McGuire, Bastian Tugemann and Gilles Civario, 2012)
3 The general problem of solving a Sudoku for order n has beenshown to be NP-complete.(Takayugi Yato, 2003)
![Page 29: 3 times Sudoku - GitHub Pages · About core.logic core.logic is a logic programming library for Clojure and ClojureScript core.logic is a port of miniKanren, developed first in Scheme](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec604905638540e6d6ee468/html5/thumbnails/29.jpg)
AppendixUsages of SAT solvers
static code analysisvariability model of (software) product linesanalysis of component-based systemsanalysis of genetic networks in bioinformatics. . .
![Page 30: 3 times Sudoku - GitHub Pages · About core.logic core.logic is a logic programming library for Clojure and ClojureScript core.logic is a port of miniKanren, developed first in Scheme](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec604905638540e6d6ee468/html5/thumbnails/30.jpg)
AppendixUsages of Kodkod
Alloy a lightweight formal method is buildupon KodkodAnalysis of specifications, code, designs . . .Alloy finds small sized models orcounterexamples for a given Alloyspecificationsmall scope hypothesis
awesome to develop Alloy specs interactivelyin the Alloy AnalyzerIntroduction to Alloy and the Alloy Analyzer(in german) on my web site: https://
homepages.thm.de/~hg11260/lfm.html
![Page 31: 3 times Sudoku - GitHub Pages · About core.logic core.logic is a logic programming library for Clojure and ClojureScript core.logic is a port of miniKanren, developed first in Scheme](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec604905638540e6d6ee468/html5/thumbnails/31.jpg)
AppendixUsages of core.logic
kibit, a static code analyzer for Clojuredamp.ekeko, an Eclipse plugin for inspection and manipulationof files in a workspaceFunny QT, a model querying and transformation librarynatural-deduction, a proof system for the propositional andfirst order logic, developed at the THMhttps://github.com/Kuerschten/natural-deduction
![Page 32: 3 times Sudoku - GitHub Pages · About core.logic core.logic is a logic programming library for Clojure and ClojureScript core.logic is a port of miniKanren, developed first in Scheme](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec604905638540e6d6ee468/html5/thumbnails/32.jpg)
core.logic – How to get started
David Nolen et al.A Core.logic Primerhttps://github.com/clojure/core.logic/wiki/
A-Core.logic-Primer
Russell MullmicroLogichttp://mullr.github.io/micrologic/literate.html
Bruce A. Tate et al.Seven More Languages in Seven Weeks, Chap. 6The Pragmatic BookShelf, 2014