| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702 |
- /- *sock
- !:
- |%
- ++ trip
- |= toob=$<(%boom boot)
- ^- (unit *)
- ?- -.toob
- %safe (stub sure.toob)
- %risk (stub hope.toob)
- ==
- ++ stub
- |= =sock
- ^- (unit *)
- ?: ?=(%know -.sock)
- `know.sock
- ~
- :: Split an axis into a sock into safe and unsafe components
- ++ punt
- |= [axe=@ =sock]
- ^- [@ @ ^sock]
- ?: =(0 axe)
- [0 0 %toss ~]
- =/ saf 1
- |-
- ?: =(axe 1)
- [saf 1 sock]
- ?+ sock [0 0 %toss ~]
- [%know * *]
- ?- (cap axe)
- %2 $(axe (mas axe), sock [%know -.know.sock], saf (peg saf 2))
- %3 $(axe (mas axe), sock [%know +.know.sock], saf (peg saf 3))
- ==
- ::
- [%bets *]
- ?- (cap axe)
- %2 $(axe (mas axe), sock hed.sock, saf (peg saf 2))
- %3 $(axe (mas axe), sock tal.sock, saf (peg saf 3))
- ==
- ::
- [%toss ~]
- [saf axe %toss ~]
- ==
- :: Get an axis from a sock
- ++ pull
- |= arg=[@ sock]
- ^- boot
- =+ [saf rik ken]=(punt arg)
- ?: =(0 saf) [%boom ~]
- ?: =(1 rik) [%safe ken]
- [%risk ken]
- ++ yank
- |= [axe=@ =boot]
- ?- boot
- [%safe *] (pull axe sure.boot)
- [%risk *] (dare (pull axe hope.boot))
- [%boom ~] [%boom ~]
- ==
- :: Test if sock is atom or cell, or unknown
- ++ fits
- |= =sock
- ^- ^sock
- ?- sock
- ::
- [%know @]
- [%know 1]
- ::
- [%know * *]
- [%know 0]
- ::
- [%bets *]
- [%know 0]
- ::
- [%dice ~]
- [%know 1]
- ::
- [%flip ~]
- [%know 1]
- ::
- [%toss ~]
- [%flip ~]
- ==
- :: Test if we can know two socks are equal
- ++ pear
- |= [a=sock b=sock]
- ^- sock
- ?: ?&(?=([%know *] a) ?=([%know *] b))
- ?: =(know.a know.b)
- [%know 0]
- [%know 1]
- [%flip ~]
- :: Test if we can know two boots are equal
- ++ bopp
- |= [a=boot b=boot]
- ^- boot
- ?: ?= [%boom ~] a
- [%boom ~]
- ?: ?= [%boom ~] b
- [%boom ~]
- ?- a
- ::
- [%safe *]
- ?- b
- ::
- [%safe *]
- [%safe (pear sure.a sure.b)]
- ::
- [%risk *]
- [%risk (pear sure.a hope.b)]
- ==
- ::
- [%risk *]
- ?- b
- ::
- [%safe *]
- [%risk (pear hope.a sure.b)]
- ::
- [%risk *]
- [%risk (pear hope.a hope.b)]
- ==
- ==
- :: combine two socks into a sock of a cell
- ++ knit
- |= [a=sock b=sock]
- ^- sock
- ?. ?= [%know *] a
- [%bets a b]
- ?. ?= [%know *] b
- [%bets a b]
- [%know [know.a know.b]]
- :: combine two boots into a boot of a cell
- ++ cobb
- |= [hed=boot tal=boot]
- ^- boot
- ?: ?= [%boom ~] hed
- [%boom ~]
- ?: ?= [%boom ~] tal
- [%boom ~]
- ?- hed
- ::
- [%safe *]
- ?- tal
- ::
- [%safe *]
- [%safe (knit sure.hed sure.tal)]
- ::
- [%risk *]
- [%risk (knit sure.hed hope.tal)]
- ==
- ::
- [%risk *]
- ?- tal
- ::
- [%safe *]
- [%risk (knit hope.hed sure.tal)]
- ::
- [%risk *]
- [%risk (knit hope.hed hope.tal)]
- ==
- ==
- :: patch a sock
- ++ darn
- |= [axe=@ pat=sock =sock]
- ^- boot
- ?: .= 0 axe
- [%boom ~]
- |-
- ^- boot
- ?: =(axe 1)
- [%safe pat]
- ?: ?= [%dice ~] sock
- [%boom ~]
- ?: ?= [%flip ~] sock
- [%boom ~]
- ?: ?= [%know @] sock
- [%boom ~]
- ?- (cap axe)
- ::
- %2
- ?- sock
- ::
- [%know * *]
- (cobb $(axe (mas axe), sock [%know -.know.sock]) [%safe %know +.know.sock])
- ::
- [%bets * *]
- (cobb $(axe (mas axe), sock hed.sock) [%safe tal.sock])
- ::
- [%toss ~]
- (cobb $(axe (mas axe)) [%risk %toss ~])
- ==
- ::
- %3
- ?- sock
- ::
- [%know * *]
- (cobb [%safe %know -.know.sock] $(axe (mas axe), sock [%know +.know.sock]))
- ::
- [%bets * *]
- (cobb [%safe hed.sock] $(axe (mas axe), sock tal.sock))
- ::
- [%toss ~]
- (cobb [%risk %toss ~] $(axe (mas axe)))
- ==
- ==
- :: Stitch a boot into another boot
- ++ welt
- |= [axe=@ pach=boot wole=boot]
- ^- boot
- ?: ?= [%boom ~] pach
- [%boom ~]
- ?: ?= [%boom ~] wole
- [%boom ~]
- =/ poch
- ?- pach
- ::
- [%safe *]
- sure.pach
- ::
- [%risk *]
- hope.pach
- ==
- =/ wool
- ?- wole
- ::
- [%safe *]
- sure.wole
- ::
- [%risk *]
- hope.wole
- ==
- ?: ?& ?= [%safe *] wole ?= [%safe *] pach ==
- (darn axe poch wool)
- (dare (darn axe poch wool))
- :: Pessimize a boot by making it %risk even if it's %safe
- ++ dare
- |= =boot
- ?- boot
- ::
- [%boom ~]
- [%boom ~]
- ::
- [%risk *]
- [%risk hope.boot]
- ::
- [%safe *]
- [%risk sure.boot]
- ==
- :: Weaken a %know
- ++ fray
- |= a=*
- ^- sock
- ?: ?= @ a
- [%dice ~]
- [%bets [%know -.a] [%know +.a]]
- :: Produce the intersection of two socks
- ++ mous
- |= [a=sock b=sock]
- ?: ?&(?=([%know *] a) ?=([%know *] b))
- ?: =(know.a know.b)
- a
- $(a (fray know.a), b (fray know.b))
- ?: ?=([%know *] a)
- $(a (fray know.a))
- ?: ?=([%know *] b)
- $(b (fray know.b))
- ?: ?&(?=([%bets *] a) ?=([%bets *] b))
- [%bets $(a hed.a, b hed.b) $(a tal.a, b tal.b)]
- ?: ?&(?=([%dice ~] a) ?|(?=([%dice ~] b) ?=([%flip ~] b)))
- [%dice ~]
- ?: ?&(?=([%dice ~] b) ?=([%flip ~] a))
- [%dice ~]
- ?: ?&(?=([%flip ~] a) ?=([%flip ~] b))
- [%flip ~]
- [%toss ~]
- :: Produce the intersection of two boots
- ::
- :: Note that the intersection of a safe or risk
- :: boot and a boom boot is a risk boot, since
- :: in a branch between a possibly non-crashing computation
- :: and a crashing computation, we might crash and we might not.
- ::
- :: In particular, we have to handle assertions and
- :: error cases where it is intended that one branch of a conditional
- :: will crash
- ++ gnaw
- |= [a=boot b=boot]
- ?: ?= [%safe *] a
- ?: ?= [%safe *] b
- [%safe (mous sure.a sure.b)]
- ?: ?= [%risk *] b
- [%risk (mous sure.a hope.b)]
- [%risk sure.a]
- ?: ?= [%risk *] a
- ?: ?= [%safe *] b
- [%risk (mous hope.a sure.b)]
- ?: ?= [%risk *] b
- [%risk (mous hope.a hope.b)]
- [%risk hope.a]
- ?: ?= [%safe *] b
- [%risk sure.b]
- ?: ?= [%risk *] b
- [%risk hope.b]
- [%boom ~]
- :: Produce a boot of whether a given boot is a cell or atom
- ++ ques
- |= non=boot
- ^- boot
- ?: ?=([%boom ~] non)
- [%boom ~]
- ?- non
- ::
- [%safe %know @]
- [%safe %know 1]
- ::
- [%safe %know * *]
- [%safe %know 0]
- ::
- [%safe %bets *]
- [%safe %know 0]
- ::
- [%safe %dice ~]
- [%safe %know 1]
- ::
- [%safe %flip ~]
- [%safe %know 1]
- ::
- [%safe %toss ~]
- [%safe %flip ~]
- ::
- [%risk %know @]
- [%risk %know 1]
- ::
- [%risk %know * *]
- [%risk %know 0]
- ::
- [%risk %bets *]
- [%risk %know 0]
- ::
- [%risk %dice ~]
- [%risk %know 1]
- ::
- [%risk %flip ~]
- [%risk %know 1]
- ::
- [%risk %toss ~]
- [%risk %flip ~]
- ==
- ++ pile
- |= tom=boot
- ^- boot
- ?+ tom [%boom ~]
- ::
- [%safe %know @]
- [%safe %dice ~]
- ::
- [%safe %dice ~]
- [%safe %dice ~]
- ::
- [%safe %flip ~]
- [%safe %dice ~]
- ::
- [%safe %toss ~]
- [%risk %dice ~]
- ::
- [%risk %know @]
- [%risk %dice ~]
- ::
- [%risk %dice ~]
- [%risk %dice ~]
- ::
- [%risk %flip ~]
- [%risk %dice ~]
- ::
- [%risk %toss ~]
- [%risk %dice ~]
- ==
- :: Produce knowledge of the result given knowledge of the subject
- ++ wash
- |= [subj=sock form=*]
- ^- boot
- =| bare=[ward=(map [sock *] boot) dir=@ ind=@]
- =. ward.bare (~(put by ward.bare) [subj form] [%risk %toss ~])
- |^
- =+ swab
- ~& "direct calls: {<dir>}"
- ~& "indirect calls: {<ind>}"
- -<
- ++ swab
- |-
- ^- [boot _bare]
- ?> ?=(^ form)
- ?+ form [[%boom ~] bare]
- ::
- [[* *] *]
- =^ l bare $(form -.form)
- =^ r bare $(form +.form)
- :_ bare
- (cobb l r)
- ::
- [%0 @]
- :_ bare
- (pull +.form subj)
- ::
- [%1 *]
- :_ bare
- [%safe %know +.form]
- ::
- [%2 * *]
- =^ subn bare $(form +<.form)
- ?: ?=([%boom ~] subn)
- [[%boom ~] bare]
- =^ forn bare $(form +>.form)
- ?: ?=([%boom ~] forn)
- [[%boom ~] bare]
- ?: ?= [%safe %dice ~] forn
- [[%boom ~] bare]
- ?: ?= [%safe %flip ~] forn
- [[%boom ~] bare]
- ?: ?= [%risk %dice ~] forn
- [[%boom ~] bare]
- ?: ?= [%risk %flip ~] forn
- [[%boom ~] bare]
- ?+ forn [[%risk %toss ~] bare(ind .+(ind.bare))]
- ::
- [%safe %know *]
- =. dir.bare .+(dir.bare)
- ?- subn
- ::
- [%safe *]
- =/ nubs sure.subn
- =/ norm know.sure.forn
- =/ mem (~(get by ward.bare) [nubs norm])
- ?. ?=(~ mem) [u.mem bare]
- =. ward.bare (~(put by ward.bare) [nubs norm] [%risk %toss ~])
- =^ r bare $(subj nubs, form norm)
- [r bare(ward (~(put by ward.bare) [nubs norm] r))]
- ::
- [%risk *]
- =/ nubs hope.subn
- =/ norm know.sure.forn
- =/ mem (~(get by ward.bare) [nubs norm])
- ?. ?=(~ mem) [u.mem bare]
- =. ward.bare (~(put by ward.bare) [nubs norm] [%risk %toss ~])
- =^ r bare $(subj nubs, form norm)
- [(dare r) bare(ward (~(put by ward.bare) [nubs norm] (dare r)))] :: XX fix up ward modifications
- ==
- ::
- [%risk %know *]
- =. dir.bare .+(dir.bare)
- ?- subn
- ::
- [%safe *]
- =/ nubs sure.subn
- =/ norm know.hope.forn
- =/ mem (~(get by ward.bare) [nubs norm])
- ?. ?=(~ mem) [u.mem bare]
- =. ward.bare (~(put by ward.bare) [nubs norm] [%risk %toss ~])
- =^ r bare $(subj nubs, form norm)
- [(dare r) bare(ward (~(put by ward.bare) [nubs norm] (dare r)))]
- ::
- [%risk *]
- =/ nubs hope.subn
- =/ norm know.hope.forn
- =/ mem (~(get by ward.bare) [nubs norm])
- ?. ?=(~ mem) [u.mem bare]
- =. ward.bare (~(put by ward.bare) [nubs norm] [%risk %toss ~])
- =^ r bare $(subj nubs, form norm)
- [(dare r) bare(ward (~(put by ward.bare) [nubs norm] (dare r)))]
- ==
- ==
- ::
- [%3 *]
- =^ s bare $(form +.form)
- :_ bare
- (ques s)
- ::
- [%4 *]
- =^ s bare $(form +.form)
- :_ bare
- (pile s)
- ::
- [%5 * *]
- =^ l bare $(form +<.form)
- =^ r bare $(form +>.form)
- :_ bare
- (bopp l r)
- ::
- [%6 * * *]
- =^ cond bare $(form +<.form)
- ?+ cond [[%boom ~] bare]
- ::
- [%safe *]
- ?+ sure.cond [[%boom ~] bare]
- ::
- [%know %0]
- $(form +>-.form)
- ::
- [%know %1]
- $(form +>+.form)
- ::
- [%flip ~]
- =^ t bare $(form +>-.form)
- =^ f bare $(form +>+.form)
- :_ bare
- (gnaw t f)
- ::
- [%dice ~]
- =^ t bare $(form +>-.form)
- =^ f bare $(form +>+.form)
- :_ bare
- (dare (gnaw t f))
- ::
- [%toss ~]
- =^ t bare $(form +>-.form)
- =^ f bare $(form +>+.form)
- :_ bare
- (dare (gnaw t f))
- ==
- ::
- [%risk *]
- ?+ hope.cond [[%boom ~] bare]
- ::
- [%know %0]
- =^ t bare $(form +>-.form)
- :_ bare
- (dare t)
- ::
- [%know %1]
- =^ f bare $(form +>+.form)
- :_ bare
- (dare f)
- ::
- [%flip ~]
- =^ t bare $(form +>-.form)
- =^ f bare $(form +>+.form)
- :_ bare
- (dare (gnaw t f))
- ::
- [%dice ~]
- =^ t bare $(form +>-.form)
- =^ f bare $(form +>+.form)
- :_ bare
- (dare (gnaw t f))
- ::
- [%toss ~]
- =^ t bare $(form +>-.form)
- =^ f bare $(form +>+.form)
- :_ bare
- (dare (gnaw t f))
- ==
- ==
- ::
- [%7 * *]
- =^ news bare $(form +<.form)
- ?+ news [[%boom ~] bare]
- ::
- [%safe *]
- $(subj sure.news, form +>.form)
- ::
- [%risk *]
- =^ r bare $(subj hope.news, form +>.form)
- :_ bare
- (dare r)
- ==
- ::
- [%8 * *]
- =^ news bare $(form +<.form)
- ?+ news [[%boom ~] bare]
- ::
- [%safe *]
- $(subj (knit sure.news subj), form +>.form)
- ::
- [%risk *]
- =^ r bare $(subj (knit hope.news subj), form +>.form)
- :_ bare
- (dare r)
- ==
- ::
- [%9 @ *]
- =^ news bare $(form +>.form)
- ?+ news [[%boom ~] bare]
- ::
- [%safe *]
- =/ newf (pull +<.form sure.news)
- ?+ newf [[%boom ~] bare]
- ::
- [%safe %know *]
- =. dir.bare .+(dir.bare)
- =/ nubs sure.news
- =/ norm know.sure.newf
- =/ mem (~(get by ward.bare) [nubs norm])
- ?. ?=(~ mem) [u.mem bare]
- =. ward.bare (~(put by ward.bare) [nubs norm] [%risk %toss ~])
- =^ r bare $(subj nubs, form norm)
- :_ bare(ward (~(put by ward.bare) [nubs norm] r))
- r
- ::
- [%risk %know *]
- =. dir.bare .+(dir.bare)
- =/ nubs sure.news
- =/ norm know.hope.newf
- =/ mem (~(get by ward.bare) [nubs norm])
- ?. ?=(~ mem) [u.mem bare]
- =. ward.bare (~(put by ward.bare) [nubs norm] [%risk %toss ~])
- =^ r bare $(subj nubs, form norm)
- :_ bare(ward (~(put by ward.bare) [nubs norm] (dare r)))
- (dare r)
- ::
- [%safe *]
- =. ind.bare .+(ind.bare)
- [[%risk %toss ~] bare]
- ::
- [%risk *]
- =. ind.bare .+(ind.bare)
- [[%risk %toss ~] bare]
- ==
- ::
- [%risk *]
- =/ newf (pull +<.form hope.news)
- ?+ newf [[%boom ~] bare]
- ::
- [%safe %know *]
- =. dir.bare .+(dir.bare)
- =/ nubs hope.news
- =/ norm know.sure.newf
- =/ mem (~(get by ward.bare) [nubs norm])
- ?. ?=(~ mem) [u.mem bare]
- =. ward.bare (~(put by ward.bare) [nubs norm] [%risk %toss ~])
- =^ r bare $(subj nubs, form norm)
- :_ bare(ward (~(put by ward.bare) [nubs norm] (dare r)))
- (dare r)
- ::
- [%risk %know *]
- =. dir.bare .+(dir.bare)
- =/ nubs hope.news
- =/ norm know.hope.newf
- =/ mem (~(get by ward.bare) [nubs norm])
- ?. ?=(~ mem) [u.mem bare]
- =. ward.bare (~(put by ward.bare) [nubs norm] [%risk %toss ~])
- =^ r bare $(subj nubs, form norm)
- :_ bare(ward (~(put by ward.bare) [nubs norm] (dare r)))
- (dare r)
- ::
- [%safe *]
- =. ind.bare .+(ind.bare)
- [[%risk %toss ~] bare]
- ::
- [%risk *]
- =. ind.bare .+(ind.bare)
- [[%risk %toss ~] bare]
- ==
- ==
- ::
- [%10 [@ *] *]
- =^ p bare $(form +<+.form)
- =^ w bare $(form +>.form)
- :_ bare
- (welt +<-.form p w)
- ::
- [%11 @ *]
- $(form +>.form)
- ::
- [%11 [* *] *]
- =^ hint bare $(form +<+.form)
- ?+ hint [[%boom ~] bare]
- ::
- [%safe *]
- $(form +>.form)
- ::
- [%risk *]
- =^ r bare $(form +<.form)
- :_ bare
- (dare r)
- ==
- ::
- [%12 *]
- [[%risk %toss ~] bare]
- ==
- --
- ++ cuff
- |= =sock
- =/ axe 1
- |-
- ^- (list @)
- ?- sock
- ::
- [%know *]
- (limo [axe ~])
- ::
- [%bets *]
- (weld $(axe (add axe axe), sock hed.sock) $(axe (add (add axe axe) 1), sock tal.sock))
- ::
- [%dice ~]
- (limo [axe ~])
- ::
- [%flip ~]
- (limo [axe ~])
- ::
- [%toss ~]
- (limo [axe ~])
- ==
- --
|