Upgrade to Pro — share decks privately, control downloads, hide ads and more …

interdisciplinary computing (domcode)

Igor Wiedler
November 14, 2015

interdisciplinary computing (domcode)

Igor Wiedler

November 14, 2015
Tweet

More Decks by Igor Wiedler

Other Decks in Programming

Transcript

  1. interdisciplinary
    computing
    ~
    theory and practice

    View Slide

  2. @igorwhilefalse

    View Slide

  3. #HackTheStigma

    View Slide

  4. interdisciplinary
    thinking

    View Slide

  5. knitting
    ~
    theorem proving

    View Slide

  6. grammars
    ~
    linguistics

    View Slide

  7. finance
    ~
    information theory

    View Slide

  8. information theory
    ~
    statistics

    View Slide

  9. algorithms
    ~
    feminism

    View Slide

  10. code complexity
    ~
    applied psychology

    View Slide

  11. computation
    ~
    formal logic

    View Slide

  12. formal logic
    ~
    electronics

    View Slide

  13. electronics
    ~
    physics

    View Slide

  14. physics
    ~
    information theory

    View Slide

  15. computation
    ~
    cosmic rays

    View Slide

  16. Chapter I

    Theory

    View Slide

  17. weaving programs

    View Slide

  18. View Slide

  19. @sydneypadua

    View Slide

  20. View Slide

  21. View Slide

  22. View Slide

  23. from maths to logic

    View Slide

  24. View Slide

  25. View Slide

  26. View Slide

  27. from logic to
    electronics

    View Slide

  28. View Slide

  29. View Slide

  30. View Slide

  31. • 1600: leibniz devises binary numbers
    • 1800: boole + de morgan supply the laws
    • 1937: 1-bit binary adder
    • 1947: transistors
    • 1947: error correcting codes
    • 1948: information theory
    • 1965: cosmic radiowave background
    • 1969: unix
    • 1972: c programming language

    View Slide

  32. • 1600: leibniz devises binary numbers
    • 1800: boole + de morgan supply the laws
    • 1937: 1-bit binary adder
    • 1947: transistors
    • 1947: error correcting codes
    • 1948: information theory
    • 1965: cosmic radiowave background
    • 1969: unix
    • 1972: c programming language

    View Slide

  33. • 1600: leibniz devises binary numbers
    • 1800: boole + de morgan supply the laws
    • 1937: 1-bit binary adder
    • 1947: transistors
    • 1947: error correcting codes
    • 1948: information theory
    • 1965: cosmic radiowave background
    • 1969: unix
    • 1972: c programming language

    View Slide

  34. self-reference and
    something something
    quines

    View Slide

  35. View Slide

  36. View Slide

  37. data = %q{
    program = "data = %q{#{data}}" + data
    puts program
    }
    program = "data = %q{#{data}}" + data
    puts program

    View Slide

  38. View Slide

  39. View Slide

  40. artsnfood.blogspot.com

    View Slide

  41. Chapter II

    Practice

    View Slide

  42. logic programming

    View Slide

  43. miniKanren

    View Slide

  44. µKanren
    (define (var c) (vector c))
    (define (var? x) (vector? x))
    (define (var=? x1 x2) (= (vector-ref x1 0) (vector-ref x2 0)))
    (define (walk u s)
    (let ((pr (and (var? u) (assp (lambda (v) (var=? u v)) s))))
    (if pr (walk (cdr pr) s) u)))
    (define (ext-s x v s) `((,x . ,v) . ,s))
    (define (== u v)
    (lambda (s/c)
    (let ((s (unify u v (car s/c))))
    (if s (unit `(,s . ,(cdr s/c))) mzero))))
    (define (unit s/c) (cons s/c mzero))
    (define mzero '())
    (define (unify u v s)
    (let ((u (walk u s)) (v (walk v s)))
    (cond
    ((and (var? u) (var? v) (var=? u v)) s)
    ((var? u) (ext-s u v s))
    ((var? v) (ext-s v u s))
    ((and (pair? u) (pair? v))
    (let ((s (unify (car u) (car v) s)))
    (and s (unify (cdr u) (cdr v) s))))
    (else (and (eqv? u v) s)))))
    (define (call/fresh f)
    (lambda (s/c)
    (let ((c (cdr s/c)))
    ((f (var c)) `(,(car s/c) . ,(+ c 1))))))
    (define (disj g1 g2) (lambda (s/c) (mplus (g1 s/c) (g2 s/c))))
    (define (conj g1 g2) (lambda (s/c) (bind (g1 s/c) g2)))
    (define (mplus $1 $2)
    (cond
    ((null? $1) $2)
    ((procedure? $1) (lambda () (mplus $2 ($1))))
    (else (cons (car $1) (mplus (cdr $1) $2)))))
    (define (bind $ g)
    (cond
    ((null? $) mzero)
    ((procedure? $) (lambda () (bind ($) g)))
    (else (mplus (g (car $)) (bind (cdr $) g)))))

    View Slide

  45. • ∧ conjunction
    • ∨ disjunction
    • = unification
    • ∃ variables

    View Slide

  46. (run 1 (q) (== q 'hello))
    ;=> (hello)

    View Slide

  47. (run 1 (q) (== #t #f))
    ;=> ()

    View Slide

  48. (run 1 (q)
    (== q 'doughnut)
    (== q 'bagel))
    ;=> ()

    View Slide

  49. (run* (q)
    (conde
    [(== q 'doughnut)]
    [(== q 'bagel)]))
    ;=> (doughnut bagel)

    View Slide

  50. theorem proving

    View Slide

  51. (run* (q)
    (conde
    [(== q 'doughnut)]
    [(== q 'bagel)]))
    ∃q(doughnut(q) ∨ bagel(q))

    View Slide

  52. ∃q(doughnut(q) ∨ bagel(q))
    doughnut(q) ∨ bagel(q)
    -------------------
    doughnut(q)
    ∨&e1

    View Slide

  53. ∃q(doughnut(q) ∨ bagel(q))
    doughnut(q) ∨ bagel(q)
    -------------------
    bagel(q)
    ∨&e2

    View Slide

  54. the never ending
    search for answers

    View Slide

  55. (define nevero
    (conde
    [(== #t #f)]
    [nevero]))
    (run 1 (q) nevero)

    View Slide

  56. run
    (run 1 (q) nevero)

    View Slide

  57. run
    nevero
    (run 1 (q) nevero)

    View Slide

  58. run
    nevero
    (define nevero
    (conde
    [(== #t #f)]
    [nevero]))

    View Slide

  59. run
    nevero
    (== #t #f)
    (define nevero
    (conde
    [(== #t #f)]
    [nevero]))

    View Slide

  60. run
    nevero
    (== #t #f)
    X
    (define nevero
    (conde
    [(== #t #f)]
    [nevero]))

    View Slide

  61. run
    nevero
    (== #t #f)
    X
    nevero
    (define nevero
    (conde
    [(== #t #f)]
    [nevero]))

    View Slide

  62. run
    nevero
    (== #t #f)
    X
    nevero
    (define nevero
    (conde
    [(== #t #f)]
    [nevero]))

    View Slide

  63. (== #t #f)
    run
    nevero
    (== #t #f)
    X
    nevero
    (define nevero
    (conde
    [(== #t #f)]
    [nevero]))

    View Slide

  64. (== #t #f)
    run
    nevero
    (== #t #f)
    X
    nevero
    X
    (define nevero
    (conde
    [(== #t #f)]
    [nevero]))

    View Slide

  65. (== #t #f)
    run
    nevero
    (== #t #f)
    X
    nevero
    X
    ...
    (define nevero
    (conde
    [(== #t #f)]
    [nevero]))

    View Slide

  66. entscheidungsproblem

    View Slide

  67. simulating concrete
    machines

    View Slide

  68. View Slide

  69. AND
    OR

    View Slide

  70. AND
    OR
    NOR

    View Slide

  71. XNOR
    NAND

    View Slide

  72. XOR
    XOR
    AND OR
    NOR

    View Slide

  73. View Slide

  74. (define bit-xoro
    (lambda (x y r)
    (conde
    ((== 0 x) (== 0 y) (== 0 r))
    ((== 1 x) (== 0 y) (== 1 r))
    ((== 0 x) (== 1 y) (== 1 r))
    ((== 1 x) (== 1 y) (== 0 r)))))
    (define bit-ando
    (lambda (x y r)
    (conde
    ((== 0 x) (== 0 y) (== 0 r))
    ((== 1 x) (== 0 y) (== 0 r))
    ((== 0 x) (== 1 y) (== 0 r))
    ((== 1 x) (== 1 y) (== 1 r)))))

    View Slide

  75. (define half-addero
    (lambda (x y r c)
    (all
    (bit-xoro x y r)
    (bit-ando x y c))))

    View Slide

  76. (define full-addero
    (lambda (b x y r c)
    (fresh (w xy wz)
    (half-addero x y w xy)
    (half-addero w b r wz)
    (bit-xoro xy wz c))))

    View Slide

  77. (define +o
    (lambda (n m k)
    (addero 0 n m k)))
    (define -o
    (lambda (n m k)
    (+o m k n)))

    View Slide

  78. (run* (x y)
    (+o x y '(1 0 1)))
    ;=> (((1 0 1) ())
    ; (() (1 0 1))
    ; ((1) (0 0 1))
    ; ((0 0 1) (1))
    ; ((1 1) (0 1))
    ; ((0 1) (1 1)))

    View Slide

  79. parsing grammars?!

    View Slide

  80. flickr.com/photos/strangeloop2015/21793631118

    View Slide

  81. View Slide

  82. exp := var | abs | app
    abs := "λ" var "." exp
    app := "(" exp " " exp ")"

    View Slide

  83. exp := var | abs | app
    abs := "λ" var "." exp
    app := "(" exp " " exp ")"
    x
    λx.x
    λx.x x
    (λx.x) (λx.x)
    ...

    View Slide

  84. (define exp
    (lambda (e)
    (conde
    [(symbolo e)]
    [(fresh (v e2)
    (symbolo v)
    (exp e2)
    (== e `(λ ,v . ,e2)))]
    [(fresh (e1 e2)
    (exp e1)
    (exp e2)
    (== e `(,e1 ,e2)))])))

    View Slide

  85. (run 10 (q) (exp q))
    ;=> (x
    ; (λ x . x)
    ; (x x)
    ; ...)

    View Slide

  86. society6.com/product/binary-search-tree--comp-sci-series_print

    View Slide

  87. flickr.com/photos/drjason/280369547

    View Slide

  88. quines

    View Slide

  89. making use of the
    church-turing thesis

    View Slide

  90. View Slide

  91. (define eval-expo
    (lambda (exp env val)
    (conde
    ((fresh (v)
    (== `(quote ,v) exp)
    (not-in-envo 'quote env)
    (noo 'closure v)
    (== v val)))
    ((fresh (a*)
    (== `(list . ,a*) exp)
    (not-in-envo 'list env)
    (noo 'closure a*)
    (proper-listo a* env val)))
    ((symbolo exp) (lookupo exp env val))
    ((fresh (rator rand x body env^ a)
    (== `(,rator ,rand) exp)
    (eval-expo rator env `(closure ,x ,body ,env^))
    (eval-expo rand env a)
    (eval-expo body `((,x . ,a) . ,env^) val)))
    ((fresh (x body)
    (== `(lambda (,x) ,body) exp)
    (symbolo x)
    (not-in-envo 'lambda env)
    (== `(closure ,x ,body ,env) val))))))
    (define not-in-envo
    (lambda (x env)
    (conde
    ((fresh (y v rest)
    (== `((,y . ,v) . ,rest) env)
    (=/= y x)
    (not-in-envo x rest)))
    ((== '() env)))))
    (define proper-listo
    (lambda (exp env val)
    (conde
    ((== '() exp)
    (== '() val))
    ((fresh (a d t-a t-d)
    (== `(,a . ,d) exp)
    (== `(,t-a . ,t-d) val)
    (eval-expo a env t-a)
    (proper-listo d env t-d))))))
    (define lookupo
    (lambda (x env t)
    (fresh (rest y v)
    (== `((,y . ,v) . ,rest) env)
    (conde
    ((== y x) (== v t))
    ((=/= y x) (lookupo x rest t))))))
    github.com/webyrd/quines

    View Slide

  92. (run 1 (q)
    (eval-expo '((lambda (x) x) 'me!) '() q))
    ;=> (me!)

    View Slide

  93. (run 3 (q)
    (eval-expo q '() 'me!))
    ;=> ('me!
    ; ((lambda (_.0) 'me!) '_.1)
    ; ((lambda (_.0) _.0) 'me!))

    View Slide

  94. (run 1 (q)
    (eval-expo q '() q))
    ;=> ((lambda (_.0) (list _.0 (list 'quote _.0)))
    ; '(lambda (_.0) (list _.0 (list 'quote _.0))))

    View Slide

  95. View Slide

  96. conclusion

    View Slide

  97. • ∧ conjunction (implicit)
    • ∨ disjunction (conde)
    • = unification (==)
    • ∃ variables (fresh)

    View Slide

  98. artsnfood.blogspot.com

    View Slide

  99. (21) The Reasoned Schemer

    Daniel Friedman, William Byrd, Oleg Kiselyov
    (22) Quine Generation via Relational Interpreters

    William Byrd, Eric Holk, Daniel Friedman
    (23) µKanren

    Jason Hemann, Daniel Friedman
    (4) How to Replace Failure by a List of Successes

    Philip Wadler
    (7) Unspeakable Things

    Laurie Penny

    View Slide

  100. Thanks! Questions?

    •minikanren.org
    •gif.industries
    •@igorwhilefalse

    View Slide

  101. References

    View Slide

  102. (1) Knitting for Fun: A Recursive Sweater

    Anna Bernasconi, Chiara Bodei, Linda Pagli
    (2) Weaving and Programming: More Related
    Than You (Probably) Realize!

    Allie Jones
    (3) From Text to Textiles!

    Lea Albaugh
    (4) How to Replace Failure by a List of
    Successes

    Philip Wadler
    (5) A Mathematical Theory of Communication

    Claude Shannon

    View Slide

  103. (6) Harassed by Algorithms

    Joanne McNeil
    (7) Unspeakable Things

    Laurie Penny
    (8) Cognitive Psychology and Programming
    Language Design

    Ben Shneiderman
    (9) Gödel, Escher, Bach

    Douglas Hofstadter
    (10) The Annotated Turing

    Charles Petzold

    View Slide

  104. (11) Clause and Effect

    William Clocksin
    (12) Code

    Charles Petzold
    (13) Bitsquatting

    Artem Dinaburg
    (14) Redis Crashes - a small rant about software
    reliability

    Salvatore Sanfilippo
    (15) The Thrilling Adventures of Lovelace and
    Babbage

    Sydney Padua

    View Slide

  105. (16) Logicomix: An Epic Search for Truth

    Apostolos Doxiadis, Christos Papadimitriou
    (17) Pioneer Programmer

    Jean Jennings Bartik
    (18) The C Programming Language

    Brian Kernighan, Dennis Ritchie
    (19) Understanding Computation

    Tom Stuart
    (20) Quantum Electrodynamics

    Richard Feynman

    View Slide

  106. (21) The Reasoned Schemer

    Daniel Friedman, William Byrd, Oleg Kiselyov
    (22) Quine Generation via Relational
    Interpreters

    William Byrd, Eric Holk, Daniel Friedman
    (23) µKanren

    Jason Hemann, Daniel Friedman
    (24) Propositions as Types

    Philip Wadler
    (25) Unflattening

    Nick Sousanis

    View Slide