Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update...

47
Logic Programming in Clojure

Transcript of Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update...

Page 1: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Logic Programmingin Clojure

Page 2: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

8 “things”

Page 3: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

8 “named things”

song

doe me ti

sew larae

fa

Page 4: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

8 “connected things”

song

doe me ti

sew larae

fa

Page 5: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Dependency Graph

song

doe me ti

sew larae

fa

Page 6: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Dependency Graph Nodes

(def doe(ref {:name “doe”

:last-update (Date.):deps [rae fa sew]}))

(def rae(ref {:name “rae”

:last-update (Date.):deps [fa]}))

Page 7: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Dependency Graph

What is the root?

How long are the paths from the root to each leaf?

What are the leaves?

Page 8: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Dependency Graph

song

doe me ti

sew larae

fa

Page 9: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Logic Programming is aboutsearching graphs

Page 10: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Logic Programming is aboutsearching graphs

* Social Media * Web search * Turn-by-turn navigation * Recommendation engines * Dependency relationships * Variable type analysis * Natural language parsing * Protein folding * Business rules engines

Page 11: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Mini-Kanren (in Clojure)

Subset of Kanren

Described in “The Reasoned Schemer”

Page 12: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Mini-Kanren (in Clojure)

run:Logic functions cannot be executed like 'normal' Clojure functions.

'run' queries a logic function forresults.

May return none, one or manyresults.

Page 13: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Mini-Kanren (in Clojure)

(run q ; some logic functions )

'q' is a logic variable

Page 14: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Mini-Kanren (in Clojure)

Binding:Logic variables are not like normal,mutable variables.

Logic variables are 'bound' to valuesor other logic variables with the logic function '&'.

Page 15: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Mini-Kanren (in Clojure)

(run q (& 7 q))

(run q (& q 7))

Both return (7) as a result.

Page 16: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Mini-Kanren (in Clojure)

(run q (& 9 7))

(run q (& 9 q) (& q 7))

Both return the empty list () as the result.

Page 17: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Mini-Kanren (in Clojure)

Alternatives:When a variable needs to be boundto more than one value, use 'cond-e'

(run q (cond-e [(& q 4)] [(& q “not”)]))

Returns the list (4 “not”) as the result.

Page 18: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Mini-Kanren (in Clojure)

New logic variables:

(run q(exist [a b c]

(& q b)(& a 9)(& b “string”)))

Returns a result of (“string”)

Page 19: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Zebra

9. Milk is drunk in the middle house.

(& [ _ _ [ _ _ :milk _ _ ] _ _ ] h)

Page 20: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Zebra

10. The Norwegian lives in the firsthouse on the left.

(& h [[:norwegian _ _ _ _ ] | _ ])

Page 21: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Zebra

15. The Norwegian lives next to theblue house.

(next-to [ _ _ _ _ :blue] [:norwegian _ _ _ _ ] h)

Page 22: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Zebra

2.The Englishman lives in the red house.

(member-o [:englishman _ _ _ :red] h)

Page 23: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Dependency Graph

song

doe me ti

sew larae

fa

Page 24: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Dependency Graph

(def rae(ref {:name “rae”

:last-update (Date.):deps [fa]}))

(defn dependency [a b](cond-e

[(& a rae) (& b fa)]))

Page 25: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Dependency Graph

(defn dependency [a b](cond-e

[(& a rae) (& b fa)][(& a doe) (& b fa)][(& a doe) (& b rae)][(& a doe) (& b sew)][(& a me) (& b sew)][(& a me) (& b la)][(& a ti) (& b la)][(& a song) (& b doe)][(& a song) (& b me)][(& a song) (& b ti)]))

Page 26: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Dependency Graph Nodes

(def doe(ref {:name “doe”

:last-update (Date.)}))

(def rae(ref {:name “rae”

:last-update (Date.)}))

Page 27: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Dependency Graph

(defn dependency [a b](cond-e

[(& a rae) (& b fa)][(& a doe) (& b fa)][(& a doe) (& b rae)][(& a doe) (& b sew)][(& a me) (& b sew)][(& a me) (& b la)][(& a ti) (& b la)][(& a song) (& b doe)][(& a song) (& b me)][(& a song) (& b ti)]))

Page 28: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Dependency Graph

(run q(dependency doe q))

Page 29: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Dependency Graph

(run q(dependency doe q))

Result: (fa rae sew)

Page 30: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Dependency Graph

(defn dependency [a b](cond-e

[(& a rae) (& b fa)][(& a doe) (& b fa)][(& a doe) (& b rae)][(& a doe) (& b sew)][(& a me) (& b sew)][(& a me) (& b la)][(& a ti) (& b la)][(& a song) (& b doe)][(& a song) (& b me)][(& a song) (& b ti)]))

Page 31: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Dependency Graph

(run q(dependency q doe))

Page 32: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Dependency Graph

(run q(dependency q doe))

Result: (song)

Page 33: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Dependency Graph

(defn dependency [a b](cond-e

[(& a rae) (& b fa)][(& a doe) (& b fa)][(& a doe) (& b rae)][(& a doe) (& b sew)][(& a me) (& b sew)][(& a me) (& b la)][(& a ti) (& b la)][(& a song) (& b doe)][(& a song) (& b me)][(& a song) (& b ti)]))

Page 34: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Dependency Graph

(run q(dependency q _))

Page 35: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Dependency Graph

(run q(dependency q _))

Result: (rae doe doe doe me me tisong song song)

Page 36: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Dependency Graph

(defn dependency [a b](cond-e

[(& a rae) (& b fa)][(& a doe) (& b fa)][(& a doe) (& b rae)][(& a doe) (& b sew)][(& a me) (& b sew)][(& a me) (& b la)][(& a ti) (& b la)][(& a song) (& b doe)][(& a song) (& b me)][(& a song) (& b ti)]))

Page 37: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Dependency Graph

(set(run q

(dependency q _)))

Result: #{rae doe me ti song}

Page 38: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Dependency Graph

song

doe me ti

sew larae

fa

Page 39: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Dependency Graph

(defn make [a q](exist [ dep ]

(cond-e[(dependency a dep) (make dep q)]

[(dependency a dep) (newer-than dep a) (& a q)])))

Page 40: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Dependency Graph

(def nodes(run q

(make song q)))

(map update nodes)

Page 41: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Dependency Graph

song

doe me ti

sew larae

fa

Page 42: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Dependency Graph

(defn make [a q](exist [ dep ]

(cond-e[(dependency a dep) (make dep q)]

[(dependency a dep) (newer-than dep a) (& a q)])))

Page 43: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Dependency Graph

song

doe me ti

sew larae

fa

Page 44: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Dependency Graph

song

doe me ti

sew larae

fa

Page 45: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Dependency Graph

(defn make [a q](exist [ dep ]

(cond-e[(dependency a dep) (make dep q)]

[(dependency a dep) (newer-than dep a) (& a q)])))

Page 46: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Logic Programming

Hides the complexity of graph searches.

Page 47: Logic Programming in ClojureDependency Graph Nodes (def doe (ref {:name “doe”:last-update (Date.):deps [rae fa sew]})) (def rae (ref {:name “rae”:last-update (Date.):deps [fa]}))

Logic Programming

Hides the complexity of graph searches.

Leaving you to focus on the problem you'retrying to solve.