Introduction to Zeder - a production rules toolkit for Clojure

57

Transcript of Introduction to Zeder - a production rules toolkit for Clojure

Page 1: Introduction to Zeder - a production rules toolkit for Clojure
Page 2: Introduction to Zeder - a production rules toolkit for Clojure

Agenda

● Perspective● Preliminaries● On complecting● Overview of Zeder● Out of the Tar Pit● A Little Further out of the tar pit● Demo● Future

Page 3: Introduction to Zeder - a production rules toolkit for Clojure

Preliminaries

Page 4: Introduction to Zeder - a production rules toolkit for Clojure
Page 5: Introduction to Zeder - a production rules toolkit for Clojure
Page 6: Introduction to Zeder - a production rules toolkit for Clojure
Page 7: Introduction to Zeder - a production rules toolkit for Clojure
Page 8: Introduction to Zeder - a production rules toolkit for Clojure
Page 9: Introduction to Zeder - a production rules toolkit for Clojure
Page 10: Introduction to Zeder - a production rules toolkit for Clojure
Page 11: Introduction to Zeder - a production rules toolkit for Clojure
Page 12: Introduction to Zeder - a production rules toolkit for Clojure

Lens

Page 13: Introduction to Zeder - a production rules toolkit for Clojure
Page 14: Introduction to Zeder - a production rules toolkit for Clojure
Page 15: Introduction to Zeder - a production rules toolkit for Clojure
Page 16: Introduction to Zeder - a production rules toolkit for Clojure
Page 17: Introduction to Zeder - a production rules toolkit for Clojure
Page 18: Introduction to Zeder - a production rules toolkit for Clojure
Page 19: Introduction to Zeder - a production rules toolkit for Clojure

Fogus' 1st Law

In the same way that an apple tree “apples” – so too should your systems “tuple”

Page 20: Introduction to Zeder - a production rules toolkit for Clojure
Page 21: Introduction to Zeder - a production rules toolkit for Clojure
Page 22: Introduction to Zeder - a production rules toolkit for Clojure

[Entity Attribute Value]

Page 23: Introduction to Zeder - a production rules toolkit for Clojure

Decomplecting

Page 24: Introduction to Zeder - a production rules toolkit for Clojure

Take transients...

...please

Page 25: Introduction to Zeder - a production rules toolkit for Clojure

Transients

● Limited mutability● Thread isolated change● Not persistent● Not references● Speed boosts

Page 26: Introduction to Zeder - a production rules toolkit for Clojure

Transients

● Limited mutability● Thread isolated change● Not persistent● Not references● Speed boosts

Change policy

Page 27: Introduction to Zeder - a production rules toolkit for Clojure

Transients

● Limited mutability● Thread isolated change● Not persistent● Not references● Speed boosts

Change policy

Sharing policy

Page 28: Introduction to Zeder - a production rules toolkit for Clojure

Transients

● Limited mutability● Thread isolated change● Not persistent● Not references● Speed boosts

Change policy

Sharing policy

Page 29: Introduction to Zeder - a production rules toolkit for Clojure

Transients

● Limited mutability● Thread isolated change● Not persistent● Not references● Speed boosts

Change policy

Sharing policy

Reference policy

Page 30: Introduction to Zeder - a production rules toolkit for Clojure

Transients

● Limited mutability● Thread isolated change● Not persistent● Not references● Speed boosts

Change policy

Sharing policy

Reference policy

This is what you wanted.

Page 31: Introduction to Zeder - a production rules toolkit for Clojure

RAWG!?

Page 32: Introduction to Zeder - a production rules toolkit for Clojure

Pods decomplect

● Reference policy● Change policy

Page 33: Introduction to Zeder - a production rules toolkit for Clojure

Zeder pods decomplect

● Reference policy● Change policy● Sharing policy (Zeder version anyway)

Page 34: Introduction to Zeder - a production rules toolkit for Clojure

Zeder pods decomplect

● Reference policy– There are themselves references

● Change policy– Transients internally

– Mutable objects

● Sharing policy (Zeder version anyway)

– Single-thread– Multiple threads

Page 35: Introduction to Zeder - a production rules toolkit for Clojure

value

writer

shareable?

transi ent -of

reader

val u

e- of

A pod++

Page 36: Introduction to Zeder - a production rules toolkit for Clojure
Page 37: Introduction to Zeder - a production rules toolkit for Clojure

Fogus' 10th Rule

Any sufficiently complicated Clojure program contains an ad hoc, informally-specified, bug-ridden, slow implementation of half of OPS5.

Page 38: Introduction to Zeder - a production rules toolkit for Clojure

OPS5

● Invented in the late 1970s● Charles Forgy● Rete algorithm● Incredibly efficient● Used to develop expert systems (XCON)

Page 39: Introduction to Zeder - a production rules toolkit for Clojure

OPS5

Page 40: Introduction to Zeder - a production rules toolkit for Clojure

OPS5

{:db/ident :user/username … }{:db/ident :user/salt … }

(defn store-user-info [uname] @(transact connection [{:user/username uname :user/salt (gen-salt)}]))

;; something triggers a call;; to store-user-info

Page 41: Introduction to Zeder - a production rules toolkit for Clojure

OPS5

(literalize user username salt)

(p new-user (user ^username <name> ^salt nil))--> (modify 1 ^salt “Bad salt”))

(make user ^username fogus ^salt nil)

{:db/ident :user/username … }{:db/ident :user/salt … }

(defn store-user-info [uname] @(transact connection [{:user/username uname :user/salt (gen-salt)}]))

;; something triggers a call;; to store-user-info

Page 42: Introduction to Zeder - a production rules toolkit for Clojure

OPS5

(literalize user username salt)

(p new-user (user ^username <name> ^salt nil))--> (modify 1 ^salt “Bad salt”))

(make user ^username fogus ^salt nil)

{:db/ident :user/username … }{:db/ident :user/salt … }

(defn store-user-info [uname] @(transact connection [{:user/username uname :user/salt (gen-salt)}]))

;; something triggers a call;; to store-user-info

Page 43: Introduction to Zeder - a production rules toolkit for Clojure

OPS5

(literalize user username salt)

(p new-user (user ^username <name> ^salt nil))--> (modify 1 ^salt “Bad salt”))

(make user ^username fogus ^salt nil)

{:db/ident :user/username … }{:db/ident :user/salt … }

(defn store-user-info [uname] @(transact connection [{:user/username uname :user/salt (gen-salt)}]))

;; something triggers a call;; to store-user-info

Page 44: Introduction to Zeder - a production rules toolkit for Clojure

OPS5

(literalize user username salt)

(p new-user (user ^username <name> ^salt nil))--> (modify 1 ^salt “Bad salt”))

(make user ^username fogus ^salt nil)

{:db/ident :user/username … }{:db/ident :user/salt … }

(defn store-user-info [uname] @(transact connection [{:user/username uname :user/salt (gen-salt)}]))

;; something triggers a call;; to store-user-info

??

Page 45: Introduction to Zeder - a production rules toolkit for Clojure

Out of the Tarpit

2006 by Ben Moseley and Peter Marks

Page 46: Introduction to Zeder - a production rules toolkit for Clojure

Decomplecting

Page 47: Introduction to Zeder - a production rules toolkit for Clojure

DecomplectingRe

Page 48: Introduction to Zeder - a production rules toolkit for Clojure
Page 49: Introduction to Zeder - a production rules toolkit for Clojure
Page 50: Introduction to Zeder - a production rules toolkit for Clojure
Page 51: Introduction to Zeder - a production rules toolkit for Clojure
Page 52: Introduction to Zeder - a production rules toolkit for Clojure

Function Data Behavior

Page 53: Introduction to Zeder - a production rules toolkit for Clojure

Function Data Behavior

tactical tacticalstrategic

Page 54: Introduction to Zeder - a production rules toolkit for Clojure
Page 55: Introduction to Zeder - a production rules toolkit for Clojure
Page 56: Introduction to Zeder - a production rules toolkit for Clojure

Driving principles

● Get stuff done● Data rocks● Don't invent anything● Protocols (swappable engines)● Pattern matching● Immutability (or the appearance thereof)● Fast would be nice

Page 57: Introduction to Zeder - a production rules toolkit for Clojure

Things not shown

● Snapshots● Rete implementation details● Pod details● Engine swaps● RHS Actions● LHS (match) predicates