clojure und core logic
play

Clojure und core.logic ...hello to the world of logic programming - PowerPoint PPT Presentation

Clojure und core.logic ...hello to the world of logic programming christian.meichsner@xelog.com 25. Februar 2014 Visual Index Clojure and me Dark is life, dark is death What is logic programming LISP & Clojure Primer Logic programming


  1. Clojure und core.logic ...hello to the world of logic programming christian.meichsner@xelog.com 25. Februar 2014

  2. Visual Index Clojure and me Dark is life, dark is death What is logic programming LISP & Clojure Primer Logic programming using Clojure Hello World: model food chains and core.logic Sudoku in 30 LoC Logic programming - mission critical

  3. Clojure and me Swiss public transportion service - Contractual network & pricing models ◮ network design & graph search algorithms ◮ pricing models & impact analysis for transport service providers

  4. Clojure and me Goods flow analysis tool ◮ visualizing goods flows ◮ optimizing transportation capacities in warehouses (stackers, lifts) ◮ genetic algorithms apply core.logic

  5. Clojure and me Are computer languages improving? 1 1 Gilles Dubochet (2009): Computer Code as Medium for Human Communication: Are Computer Languages Improving

  6. Imperative Programming (or ...) Dark is life, dark is death (Imperative) Velocireptor (The replaceable) you

  7. Imperative Programming Dark is life, dark is death - How is that?

  8. Imperative Programming The three keys needed... logic key functional key imperative key

  9. Imperative Programming The three keys needed... logic key functional key imperative key ◮ constraints ◮ axioms ◮ facts ◮ relations ◮ conjuction ◮ disjunction ◮ (finite) domains ◮ algebra of sets

  10. Imperative Programming The three keys needed... logic key functional key imperative key ◮ (partial) functions ◮ constraints ◮ generic ◮ axioms datastructures ◮ facts ◮ generic sequence handling ◮ relations ◮ recursion ◮ conjuction ◮ identity ◮ disjunction ◮ state ◮ (finite) domains ◮ pattern matching ◮ algebra of sets ◮ high-level concurreny

  11. Imperative Programming The three keys needed... logic key functional key imperative key ◮ ◮ ◮ ◮ constraints (partial) functions classes enums ◮ ◮ ◮ axioms functions introspection ◮ generic ◮ datastructures ◮ ◮ facts instances generics ◮ generic sequence ◮ ◮ ◮ relations for(i in I) type erasure handling ◮ ◮ conjuction ◮ thread if then (else) ◮ recursion ◮ ◮ disjunction timer ◮ switch ◮ identity ◮ ◮ (finite) domains timertask ◮ @Annotations ◮ state ◮ ◮ future algebra of sets ◮ immutable ◮ pattern matching datastructures ◮ threadpool ◮ high-level ◮ mutable ◮ fork-join concurreny datastructures ◮ a++ ◮ setter / getter ◮ ++a ◮ mutexes / ◮ operator semaphores precendence ◮ monitor ◮ operator ◮ Big Decimal vs. associativity Long

  12. Logic Programming Just one key is needed... Magic logic key

  13. What is logic programming? query logic programmer knowledge deduction base logic interpreter aka solver satisfying assignment

  14. What is logic programming? semantic elements induction unification backtracking satisfying deduction assignment depth-first search logic programming constraints logic knowledge finite query variable base domains free proposition term grounded predicate

  15. What is logic programming? abstract ... concrete satisfying deduction assignment logic programming age ∈ N , 0 ≤ age ≤ 120 year ∈ N , 1978 ≤ age ≤ 2098 knowledge In which year was julia twice as old query julia was born 2 years before clodette clodette? base julia was born in 1978

  16. LISP & Clojure Primer LISP Primer #1 ◮ LIS T P rocessing, invented by John McCarthy in 1958 at MIT ◮ fully parenthesized prefix notation ◮ syntax elements countable with two hands 1 ( . . . ) ; ; l i s t ’ . . . ; ; quote 2 3 : age ; ; keyword 4 ” . . . ” ; ; s t r i n g l i t e r a l 5 3 3.1 1/3 ; ; numeric l i t e r a l s [ . . . ] ; ; v e c t o r 6 7 # { 1 2 } ; ; s e t 8 { : age 1 } ; ; map 9 @my − future ; ; d e r e f e r e n c i n g i d e n t i t i e s and f u t u r e s

  17. LISP & Clojure Primer LISP Primer #2 ◮ everything is a list 1 ( i n c (+ 1 2 ( ∗ 2 2) ) ) 3 ◮ homoiconic language (code-is-data) 1 user= > ( c l a s s ’(+ 1 2 3 4 5) ) 2 c l o j u r e . lang . P e r s i s t e n t L i s t 3 user= > ◮ programmable programming language - hygenic macros 1 ( defmacro dyn − for [ xs ] 2 ‘( l e t [ sym − index# ( zipmap ( r e p e a t e d l y ( fn [ ] ( gensym ) ) ) ˜ xs ) 3 k e y v a l s# ( reduce #(conj % ( f i r s t %2) ( second %2)) [ ] sym − index#) 4 fd# ( l i s t ‘ f o r k e y v a l s# ( vec ( r e v e r s e (map f i r s t sym − index#)) ) ) ] 5 ( e v a l fd#)) )

  18. LISP & Clojure Primer Clojure rocks! 6. from 7. state threads to vs identity concurrency 8. path to 5. R ead E val enlight- P rint L oop ment :) Clojure 4. abstrac- 1. targets tion over Java Virtual imple- Machine mentation 2. immutable 3. strict & persistent evaluation data but lazy data structure structures

  19. Logic programming using Clojure and core.logic structure of a logic programm Starts the logical interpreter logic variable 1 ( run ∗ [ q ] goal 1 ( membero q [1 2 3 ] ) 2 goal 2 ( membero q [3 4 5 ] ) ) 3 ◮ run* returns all satisfying assignments ◮ a logic variable can take several values, but just one at a time ◮ goals express the knowledgebase. a goal succeeds, or does not. all goals must succeed in order to provide a satisfying assignment to the query.

  20. Logic programming using Clojure and core.logic run* 1 ( run ∗ [ q r s ] ( membero q [1 2 3 ] ) 2 ( membero r [2 3 4 ] ) 3 ( membero s [3 4 5 ] ) ) 4 ◮ run* can refer to more than one lvar ◮ if so, a list of vectors is returned

  21. Logic programming using Clojure and core.logic == 1 ( run ∗ [ q ] (== q 1) 2 ◮ == is the most elementary logic operation, called unification ◮ (== q 1) succeeds iff q can be associated to 1 ... and associates q to 1 :)

  22. Logic programming using Clojure and core.logic conde 1 ( run ∗ [ q ] ( conde 2 [(== q 1) ] 3 [(== q ” zwei ” ) ] ) ) 4 ◮ conde is like OR ◮ (conde g1 ... gn) succeeds, iff one of the goals g1 ... gn succeeds

  23. Logic programming using Clojure and core.logic != 1 ( run ∗ [ q ] ( conde 2 [(== q 1) ] 3 [(== q 2) ] ) 4 (!= q 2) ) 5 ◮ != is called disunification ◮ (!= q a) succeeds and ensures that q is never associated to a

  24. Logic programming using Clojure and core.logic membero 1 ( run ∗ [ s p o ] ( membero s [ : mother : c h i l d ] ) 2 ( membero o [ : mother : c h i l d ] ) 3 ( membero p [ : l o v e s : has ] ) 4 (!= s o ) ) 5 ◮ ( membero x l) constraints x to be an element of l

  25. Logic programming using Clojure and core.logic distincto 1 ( run ∗ [ s p o ] ( membero s [ : mother : c h i l d ] ) 2 ( membero o [ : mother : c h i l d ] ) 3 ( membero p [ : l o v e s : has ] ) 4 ( d i s t i n c t o [ s o ] ) ) 5 ◮ ( distincto [x1 ... xn]) constraints x1 ... xn to be disjunct

  26. Logic programming using Clojure and core.logic everyg 1 ( run ∗ [ s p o ] ( everyg #(membero % [ : mother : c h i l d ] 2 [ s o ] ) ) 3 ( membero p [ : l o v e s : has ] ) 4 ( d i s t i n c t o [ s o ] ) ) 5 ◮ ( everyg f [x1 ... xn]) succeeds, iff goals f(x1) ... f(xn) succeed

  27. Logic programming using Clojure and core.logic fresh 1 ( run ∗ [ languages ] ( f r e s h [ a b c d ] 2 (== a ”romansh” ) 3 (== b ” i t a l i a n ” ) 4 (== c ” f r e n c h ” ) 5 (== d ”german” ) 6 (== languages [ a b c d ] ) ) ) 7 8 9 ( run ∗ [ q ] (== q 1) 10 ( f r e s h [ q ] 11 (== q 2) ) ) 12 ◮ ( fresh [q1 ... qn] g1 ... gn) creates a new lexical scope and fresh lvars q1 ... qn and succeeds, iff goals g1 ... gn succeed

  28. Logic programming using Clojure and core.logic Constraint logic programming over finite domains CLP(FD) 1 ( run ∗ [ q ] ( fd / i n q ( fd / i n t e r v a l 0 9) ) ) 2 ◮ fd/interval defines a finite domain over positive integers ◮ ( fd/in q1 ... qn d) constraints lvar q1 ... qn to be in finite domain d

  29. Logic programming using Clojure and core.logic Constraint logic programming over finite domains CLP(FD) 1 ( run ∗ [ q ] ( f r e s h [ a b ] 2 ( fd / i n a b ( fd / i n t e r v a l 0 9) ) 3 ( fd/+ a b 10) 4 (== q [ a b ] ) ) ) 5 ◮ namespace clojure.core.logic.fd (here fd) offers operators to check simple arithmetic constraints

  30. Logic programming using Clojure and core.logic Modeling food chains using relational programming

  31. Logic programming using Clojure and core.logic Modeling food chains using relational programming 1 ( f a c t s / db − rel e a t s c r e a t u r e 1 c r e a t u r e 2 ) 2 3 ( def f a c t b a s e 4 ( f a c t s /db 5 [ e a t s : shark : s e a l ] 6 [ e a t s : s e a l : tuna ] 7 [ e a t s : tuna : h e r r i n g ] 8 [ e a t s : human : s e a l ] 9 [ e a t s : human : tuna ] 10 [ e a t s : human : calamar ] 11 [ e a t s : shark : human ] 12 [ e a t s : s e a l : calamar ] 13 [ e a t s : calamar : prawn ] ) ) 14 15 ( f a c t s /with − db 16 f a c t b a s e 17 ( run ∗ [ q ] 18 ( f r e s h [ x y z ] 19 ( e a t s : shark x ) 20 ( e a t s x y ) 21 ( e a t s y z ) 22 (== q [ : shark x y z ] ) ) ) ) ◮ returns all food chains of length 4 with the shark being the top-notch

  32. Sudoku in 30 LoC 2 2 http://www.nzz.ch/lebensart/spiele/sudoku/

Recommend


More recommend