Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Reasoned PHP (bephpug)
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Igor Wiedler
August 06, 2014
Programming
800
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Reasoned PHP (bephpug)
Igor Wiedler
August 06, 2014
More Decks by Igor Wiedler
See All by Igor Wiedler
Redis Bedtime Stories
igorw
1
380
Wide Event Analytics (LISA19)
igorw
4
960
a day in the life of a request
igorw
0
180
production: an owner's manual
igorw
0
200
The Power of 2
igorw
0
360
LISP 1.5 Programmer's Manual: A Dramatic Reading
igorw
0
500
The Moral Character of Software
igorw
1
330
interdisciplinary computing (domcode)
igorw
0
330
miniKanren (clojure berlin)
igorw
1
340
Other Decks in Programming
See All in Programming
Everything will be SERVERLESS — 信じて運用した10年の経験値 / Everything Will be Serverless — Lessons Learned from 10 Years of Operational Experience
seike460
PRO
1
880
Are APIs Still Relevant in the AI Era?
soyuka
0
440
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
510
AI時代のコードレビューは人に向けるな、仕組みに向けろ
texmeijin
5
3.5k
setup-vp GitLab対応の裏側
naokihaba
0
160
AI が書く Go コードの品質を劇的に向上させる Linter: “declscope”
mpyw
0
480
KiroのSpecで「五目並べ」を作ってみる
satoshi256kbyte
1
360
プロダクトコードからライブラリの境界を見つける
elmetal
PRO
0
110
技術的負債の返済は、AI時代の複利で効く投資 — 経営としての意思決定とその遂行
curekoshimizu
1
2.3k
Simple Storage Service(S3) is not simple
iwatsukayura
0
230
Vue Fes Japan 2026 タイムテーブル徹底解説
448jp
1
640
CodeRabbitの効果検証と過ごしてみた3ヶ月
armondando
0
200
Featured
See All Featured
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
400
Crafting Experiences
bethany
1
380
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
590
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.9k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
510
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.5k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
840
KATA
mclloyd
PRO
35
16k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.9k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
560
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
530
Transcript
Reasoned PHP
@igorwhiletrue
Use logic to run your programs backwards!
Use logic to run your programs backwards!
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
Reasoned PHP
function appendᵒ($l, $s, $out) { return condᵉ([ [≡($l, []), ≡($s,
$out)], [fresh_all(($a, $d, $res) ==> [ consᵒ($a, $d, $l), consᵒ($a, $res, $out), appendᵒ($d, $s, $res), ])], ]); }
run٭($q ==> appendᵒ([1, 2, 3], [4, 5, 6], $q));
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
((lambda (_.0) (list _.0 (list 'quote _.0))) '(lambda (_.0) (list
_.0 (list 'quote _.0)))
None
((lambda (_.0) (list 'quote (list _.0 (list 'quote _.0)))) '(lambda
(_.0) (list 'quote (list _.0 (list 'quote _.0))))) ! ((lambda (_.0) (list 'quote (list _.0 (list 'quote _.0)))) '(lambda (_.0) (list 'quote (list _.0 (list 'quote _.0)))))
µ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)))))
References • Propositions as Types Philip Wadler • How to
Replace Failure by a List of Successes Philip Wadler • µKanren Jason Hemann, Daniel Friedman • Quine Generation via Relational Interpreters William Byrd, Eric Holk, Daniel Friedman
References • The Reasoned Schemer Daniel Friedman, William Byrd, Oleg
Kiselyov • Clause and Effect William Clocksin • The Annotated Turing Charles Petzold • Code Charles Petzold
None
None
Questions? • minikanren.org • github.com/clojure/core.logic • github.com/igorw/reasoned-php • @igorwhiletrue