| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626 |
- =<
- :: a memoization for formula analysis, updated/inspected at eval
- :: boundaries (2/9)
- =| memo=(map * (list [sock (unit sock) (unit @tas)]))
- :: A jet dashboard
- ::
- :: The @tas tag is used only for debugging
- =| jute=(map * (list [sock [$-(* *) @tas]]))
- |%
- :: Partial knowledge of a noun
- +$ sock ^sock
- ++ sk .
- ++ lash
- |= [[s=sock f=*] j=$-(* *) n=@tas]
- =. jute
- ?. (~(has by jute) f)
- (~(put by jute) f (limo ~[[s [j n]]]))
- (~(jab by jute) f |=(js=(list [sock [$-(* *) @tas]]) (weld ~[[s [j n]]] js)))
- sk
- ++ entr
- |= [s=sock f=* nam=(unit @tas)]
- ^- (each _memo [r=(unit sock) n=(unit @tas)])
- =/ entry
- =/ e (~(get by memo) f) ?~ e ~ u.e
- |-
- ^- (each _memo [(unit sock) (unit @tas)])
- ?~ entry
- :- %&
- ?: (~(has by memo) f)
- (~(jab by memo) f |=(e=(list [sock (unit sock) (unit @tas)]) (weld (limo ~[[s ~ nam]]) e)))
- (~(put by memo) f (limo ~[[s ~ nam]]))
- ?: (mous -<.entry s)
- [%| ->.entry]
- $(entry +.entry)
- ++ exit
- |= [s=sock f=* r=sock]
- ^- _memo
- ~| "Should not exit where there is no entry"
- %:
- ~(jab by memo)
- f
- |= e=(list [sock (unit sock) (unit @tas)])
- |-
- ^- (list [sock (unit sock) (unit @tas)])
- ?< ?= %~ e
- ?: =(-<.e s)
- [[s `r ->+.e] +.e]
- [-.e $(e +.e)]
- ==
- ++ bord *(map * (list [sock [$-(* *) @tas]]))
- :: test whether a sock nests in another sock
- :: a=sock nests in b=sock if b has the same information as a, or
- :: strictly more information
- ::
- ++ mous
- |= [a=sock b=sock]
- ^- ?
- ?: ?= [%gues ~] a
- %.y
- ?- a
- ::
- [%hint *]
- ?&
- ?= [%hint *] b
- .= s.a s.b
- ?~ d.a
- ?~ d.b
- %.y
- %.n
- ?~ d.b
- %.n
- $(a u.d.a, b u.d.b)
- $(a r.a, b r.b)
- ==
- ::
- [%know *]
- ?|
- ?&
- ?= [%know *] b
- =(k.a k.b)
- ==
- ?&
- ?= [%bets * *] b
- ?= [* *] k.a
- $(a [%know -.k.a], b p.b)
- $(a [%know +.k.a], b q.b)
- ==
- ==
- ::
- [%bets * *]
- ?|
- ?&
- ?= [%know * *] b
- $(a p.a, b [%know -.k.b])
- $(a q.a, b [%know +.k.b])
- ==
- ?&
- ?= [%bets * *] b
- $(a p.a, b p.b)
- $(a q.a, b q.b)
- ==
- ==
- ==
- :: compute what we know of the result of a formula
- ::
- :: We may reimplement this more efficiently later, but this way we
- :: don't have to keep updating our experiments in 2 implementations
- ++ wash
- |= [s=sock f=*]
- ^- [sock _memo]
- =+ (pull s f)
- [(cort -<) ->]
- :: Check for a jet
- ++ juke
- |= [s=sock f=*]
- ^- (unit [$-(* *) @tas])
- =/ jets
- =/ j (~(get by jute) f)
- ^- (list [sock [$-(* *) @tas]])
- ?~ j ~ u.j
- |-
- ^- (unit [$-(* *) @tas])
- ?~ jets
- ~
- ?: (mous -<.jets s)
- `->.jets
- $(jets +.jets)
- :: learn a noun at an address
- ::
- :: darn discards hints if it must descend through them
- ::
- :: TODO: we use +knit everywhere, this is just +knit with [%know *], can
- :: we get rid of it?
- ++ darn
- |= [s=sock b=@ n=*]
- ^- sock
- ?: ?= [%hint *] s
- $(s r.s)
- ?: =(b 1)
- [%know n]
- ?: ?= [%know *] s
- :- %know
- .* [k.s n] [%10 [b [0 3]] [0 2]]
- ?- (cap b)
- ::
- %2
- ?- s
- ::
- [%gues ~]
- [%bets p=$(b (mas b), s [%gues ~]) q=[%gues ~]]
- ::
- [%bets p=* q=*]
- [%bets p=$(b (mas b), s p.s) q=q.s]
- ==
- ::
- %3
- ?- s
- ::
- [%gues ~]
- [%bets p=[%gues ~] q=$(b (mas b), s [%gues ~])]
- ::
- [%bets p=* q=*]
- [%bets p=p.s q=$(b (mas b), s q.s)]
- ==
- ==
- :: axis into a sock
- ::
- :: yarn will return a hint record if it is at an axis
- :: but will discard them as it descends through them
- ++ yarn
- |= [s=sock b=@]
- ^- sock
- ?< =(b 0)
- |-
- ?: =(b 1)
- s
- ?: ?= [%hint *] s
- $(s r.s) :: descend through hint records
- ?- s
- ::
- [%know *]
- :- %know
- .* k.s [0 b]
- ::
- [%gues ~]
- [%gues ~]
- ::
- [%bets p=* q=*]
- ?- (cap b)
- ::
- %2
- $(b (mas b), s p.s)
- ::
- %3
- $(b (mas b), s q.s)
- ::
- ==
- ==
- :: axis into a sock, retrieving a name from a fast hint
- ++ narn
- |= [s=sock b=@]
- ^- [sock (unit @tas)]
- ?< =(b 0)
- =| nam=(unit @tas)
- |-
- ^- [sock (unit @tas)]
- ?: =(b 1)
- ?. ?= [%hint *] s [s nam]
- ?. =(s.s %fast) [s nam]
- ?~ d.s [s nam]
- =/ namsock (yarn u.d.s 2)
- ?. ?= [%know @] namsock [s nam]
- [s `k.namsock]
- ?: ?= [%hint *] s
- ?. =(s.s %fast) $(s r.s)
- ?~ d.s $(s r.s)
- =/ namsock (yarn u.d.s 2)
- ?. ?= [%know @] namsock $(s r.s)
- =. nam `k.namsock
- $(s r.s)
- ?- s
- ::
- [%know *]
- :-
- :- %know
- .* k.s [%0 b]
- nam
- ::
- [%gues ~]
- [[%gues ~] nam]
- ::
- [%bets * *]
- ?- (cap b)
- ::
- %2
- $(b (mas b), s p.s)
- ::
- %3
- $(b (mas b), s q.s)
- ==
- ==
- :: make a new sock from 2 socks (and an axis)
- ++ knit
- |= [s=sock b=@ t=sock]
- ^- sock
- ?: =(b 1)
- t
- ?: ?= [%hint *] s
- [%hint s.s d.s $(s r.s)]
- ?- s
- ::
- [%know @]
- ~| %know-atom !!
- ::
- [%know * *]
- ?- (cap b)
- ::
- %2
- =/ r $(s [%know +<.s], b (mas b))
- ?: ?= [%know k=*] r
- [%know +.r +>.s]
- [%bets r [%know +.k.s]]
- ::
- %3
- =/ r $(s [%know +>.s], b (mas b))
- ?: ?= [%know k=*] r
- [%know +<.s +.r]
- [%bets [%know +<.s] r]
- ==
- ::
- [%bets p=* q=*]
- ?- (cap b)
- ::
- %2
- =/ r $(s p.s, b (mas b))
- ?: ?= [%know k=*] r
- ?: ?= [%know k=*] q.s
- [%know +.r +.q.s]
- [%bets r q.s]
- [%bets r q.s]
- ::
- %3
- =/ r $(s q.s, b (mas b))
- ?: ?= [%know k=*] r
- ?: ?= [%know k=*] p.s
- [%know +.p.s +.r]
- [%bets p.s r]
- [%bets p.s r]
- ==
- ::
- [%gues ~]
- =/ r $(b (mas b))
- ?: ?= [%gues ~] r
- [%gues ~]
- ?- (cap b)
- ::
- %2
- [%bets r [%gues ~]]
- ::
- %3
- [%bets [%gues ~] r]
- ==
- ==
- ++ pear
- |= [a=sock b=sock]
- ^- sock
- ?: ?= [%know *] a
- ?: ?= [%know *] b
- [%know =(a b)]
- [%gues ~]
- [%gues ~]
- :: Description of knowledge at a call site
- ::
- :: Codegen behavior
- :: %dyn means we will generate a full eval: check cache or codegen,
- :: guard on stored sock
- ::
- :: %mis means we will do fresh inline codegen of a formula with a new
- :: label
- ::
- :: %rec and %hit both mean we will generate to jumps to labels
- :: They differ because for %rec the analysis must treat the call as
- :: unknowable, while for %hit we do not re-analyze the call but return
- :: the memoized sock
- ::
- :: %jet corresponds to a jump to a jet
- +$ coot
- $%
- [%dyn =sock] :: we don't know the formula
- [%mis =foot] :: we know the formula, it's not memoized
- [%rec =sock f=*] :: a recursive call, the memo table has a blackhole for this sock/formula pair
- [%hit res=sock] :: a memoized call, the memo table has an entry for this sock/formula pair
- [%jet jet=@tas] :: call would be jetted
- ==
- :: Annotated Nock tree with subject knowledge
- +$ foot
- $:
- $%
- [%1 b=*]
- [%2 b=foot c=foot =coot]
- [%3 b=foot]
- [%4 b=foot]
- [%5 b=foot c=foot]
- [%6 b=foot c=(unit foot) d=(unit foot)]
- [%7 b=foot c=foot]
- [%8 b=foot c=foot]
- [%9 b=@ c=foot =coot]
- [%10 [b=@ c=foot] d=foot]
- [%11 b=@ c=foot]
- [%11 [b=@ c=foot] d=foot]
- [%12 ref=foot path=foot]
- [%cell p=foot q=foot]
- [%0 b=@]
- ==
- $= s sock
- $= r sock
- ==
- ++ cort
- |= =coot
- ^- sock
- ?- coot
- ::
- [%dyn *]
- [%gues ~]
- ::
- [%mis *]
- r.foot.coot
- ::
- [%rec *]
- [%gues ~]
- ::
- [%hit *]
- res.coot
- ::
- [%jet *]
- [%gues ~]
- ==
- ++ pull
- |= [s=sock f=*]
- (pull-eval s [%know f] ~)
- ++ pull-eval
- |= [s=sock f=sock nam=(unit @tas)]
- ^- [coot _memo]
- ?: ?= [%hint *] f $(f r.f)
- ?. ?= [%know *] f
- [[%dyn s] memo]
- =/ jet (juke s k.f)
- ?. ?= ~ jet
- :: found a jet
- ~& "Jet: {<+.u.jet>}"
- [[%jet +.u.jet] memo]
- =/ mem=(each _memo [r=(unit sock) n=(unit @tas)]) (entr s k.f nam)
- ?- mem
- ::
- [%& *]
- =. memo +.mem
- =^ res memo (pull-inner s k.f)
- =. memo (exit s k.f r.res)
- [[%mis res] memo]
- ::
- [%| *]
- ?~ r.p.mem
- :: memo blackhole
- ~& "Recur: sock {<[s]>} formula {<k.f>}"
- [[%rec s k.f] memo]
- :: memo hit
- ~& "Hit: sock {<[s]>} formula {<k.f>} result {<u.r.p.mem>} named {<n.p.mem>}"
- [[%hit u.r.p.mem] memo]
- ==
- ++ pull-inner
- |= [s=sock f=*]
- ^- [foot _memo]
- ?+ f ~| "Unrecognized nock {<f>}" ~| %pull-bonk !!
- ::
- [[* *] *]
- =^ pfoot memo $(f -.f)
- =^ qfoot memo $(f +.f)
- [[[%cell pfoot qfoot] s=s r=(knit [%bets r.pfoot [%gues ~]] 3 r.qfoot)] memo]
- ::
- [%0 b=@]
- [[[%0 b.f] s=s r=(yarn s b.f)] memo]
- ::
- [%1 b=*]
- [[[%1 b.f] s=s r=[%know b.f]] memo]
- ::
- [%2 b=* c=*]
- =^ bfoot memo $(f b.f)
- =^ cfoot memo $(f c.f)
- =/ [r=sock nam=(unit @tas)] (narn r.cfoot 1)
- =^ coot memo (pull-eval r.bfoot r nam)
- [[[%2 bfoot cfoot coot] s (cort coot)] memo]
- ::
- [%3 b=*]
- =^ bfoot memo $(f b.f)
- =/ br r.bfoot
- =/ r
- |-
- ?- br
- ::
- [%hint *]
- $(br r.br)
- ::
- [%know @]
- [%know 1]
- ::
- [%know * *]
- [%know 0]
- ::
- [%bets * *]
- [%know 0]
- ::
- [%gues ~]
- [%gues ~]
- ==
- [[[%3 bfoot] s r] memo]
- ::
- [%4 b=*]
- =^ bfoot memo $(f b.f)
- [[[%4 bfoot] s [%gues ~]] memo]
- ::
- [%5 b=* c=*]
- =^ bfoot memo $(f b.f)
- =^ cfoot memo $(f c.f)
- =/ br r.bfoot
- =/ cr r.cfoot
- =/ r
- |-
- ?: ?= [%hint *] br
- $(br r.br)
- ?: ?= [%hint *] cr
- $(cr r.cr)
- ?: ?= [%know *] r.bfoot
- ?: ?= [%know *] r.cfoot
- [%know =(k.r.bfoot k.r.cfoot)]
- [%gues ~]
- [%gues ~]
- [[[%5 bfoot cfoot] s r] memo]
- ::
- [%6 b=* c=* d=*]
- =^ bfoot memo $(f b.f)
- =/ br r.bfoot
- |-
- ?+ br ~| %pull-nest !!
- ::
- [%hint *]
- $(br r.br)
- ::
- [%know %0]
- =^ cfoot memo ^$(f c.f)
- [[[%6 bfoot `cfoot ~] s r.cfoot] memo]
- ::
- [%know %1]
- =^ dfoot memo ^$(f d.f)
- [[[%6 bfoot ~ `dfoot] s r.dfoot] memo]
- ::
- [%gues ~]
- =^ cfoot memo ^$(f c.f)
- =^ dfoot memo ^$(f d.f)
- [[[%6 bfoot `cfoot `dfoot] s [%gues ~]] memo]
- ==
- ::
- [%7 b=* c=*]
- =^ bfoot memo $(f b.f)
- =^ cfoot memo $(s r.bfoot, f c.f)
- [[[%7 bfoot cfoot] s r.cfoot] memo]
- ::
- [%8 b=* c=*]
- =^ bfoot memo $(f b.f)
- =^ cfoot memo $(s (knit [%bets [%gues ~] s] 2 r.bfoot), f c.f)
- [[[%8 bfoot cfoot] s=s r=r.cfoot] memo]
- ::
- [%9 b=@ c=*]
- =^ cfoot memo $(f c.f)
- =/ [r=sock nam=(unit @tas)] (narn r.cfoot b.f)
- =^ coot memo (pull-eval r.cfoot r nam)
- [[[%9 b.f cfoot coot] s (cort coot)] memo]
- ::
- [%10 [b=@ c=*] d=*]
- =^ cfoot memo $(f c.f)
- =^ dfoot memo $(f d.f)
- [[[%10 [b.f cfoot] dfoot] s (knit r.dfoot b.f [%gues ~])] memo]
- ::
- [%11 b=@ c=*]
- =^ cfoot memo $(f c.f)
- [[[%11 b.f cfoot] s r=[%hint b.f ~ r.cfoot]] memo]
- ::
- [%11 [b=@ c=*] d=*]
- =^ cfoot memo $(f c.f)
- :: implement the %data hint
- :: delete the axes which are looked up in the hint from the subject
- :: knowledge for the hinted computation
- ?: =(b.f %data)
- =/ c c.f
- |-
- ?: ?= [[%0 @] *] c
- =. s (knit s ->.c [%gues ~])
- $(c +.c)
- =^ dfoot memo ^$(f d.f)
- [[[%11 [b.f cfoot] dfoot] s [%hint b.f `r.cfoot r.dfoot]] memo]
- =^ dfoot memo $(f d.f)
- [[[%11 [b.f cfoot] dfoot] s [%hint b.f `r.cfoot r.dfoot]] memo]
- ::
- [%12 ref=* path=*]
- =^ reffoot memo $(f ref.f)
- =^ pathfoot memo $(f path.f)
- [[[%12 reffoot pathfoot] s [%gues ~]] memo]
- ==
- ++ hord
- |= [nam=@tas]
- ^- (list [s=sock f=*])
- =| r=(list [s=sock f=*])
- =/ entries ~(tap by memo)
- |-
- ^- (list [s=sock f=*])
- ?~ entries
- r
- =/ f p.i.entries
- =/ entry q.i.entries
- |-
- ^- (list [s=sock f=*])
- ?~ entry
- ^$(entries t.entries)
- =? r =(+>.i.entry `nam) (weld (limo ~[[-.i.entry f]]) r)
- $(entry t.entry)
- :: example nocks for testing
- ++ nocs
- |%
- ++ dec
- !=
- !.
- =>
- => %ed
- |%
- ++ dec
- ~/ %dec
- |= x=@
- ~> %data.[x ~]
- ^- @
- =| d=@
- |-
- ^- d=@
- ?: =(.+(d) x)
- d
- $(d .+(d))
- --
- (dec 8)
- ++ ad
- !=
- !.
- =>
- => %ed
- |%
- ++ dec
- ~/ %dec
- |= x=@
- ~> %data.[x ~]
- ^- @
- =| d=@
- |-
- ^- d=@
- ?: =(.+(d) x)
- d
- $(d .+(d))
- ++ add
- ~/ %add
- |= [x=@ y=@]
- ~> %data.[x y ~]
- ^- @
- |-
- ^- @
- ?: =(x 0)
- y
- $(x (dec x), y .+(y))
- --
- (add 5 8)
- --
- --
- |%
- +$ sock
- $%
- [%know k=*]
- [%hint s=@ d=(unit sock) r=sock]
- [%bets p=sock q=sock]
- [%gues ~]
- ==
- --
|