memory.hoon 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  1. /= common /common/table/memory
  2. /= * /common/zeke
  3. =, mp-to-mega
  4. |%
  5. ++ v ~(v var:tlib variables:static:common)
  6. ++ w ~(v var-pelt:tlib variables:static:common)
  7. ++ w-n ~(v-n var-pelt:tlib variables:static:common)
  8. ++ w-c ~(c var-pelt:tlib variables:static:common)
  9. ++ d ~(d dyn:dyn (make-dyn-mps:dyn terminal-names:static:common))
  10. ++ engine
  11. |%
  12. ++ funcs
  13. ^- verifier-funcs
  14. |%
  15. ++ boundary-constraints
  16. ^- (map term mp-ultra)
  17. =, constraint-util
  18. =/ r ~(r rnd:chal:chal (make-chal-mps:chal chal-names-basic:chal))
  19. =/ z (r %z)
  20. %- ~(gas by *(map term mp-ultra))
  21. ::
  22. %^ tag-mp-pelt %mem-ln-init
  23. (mpsub-pelt (w %ln) z)
  24. ::
  25. %^ tag-mp-pelt %mem-nc-input
  26. (mpsub-pelt (w %nc) (d %memory-nc))
  27. ::
  28. %^ tag-mp-pelt %mem-kvs-input
  29. (mpsub-pelt (w %kvs) (d %memory-kvs))
  30. ::
  31. %^ tag-mp-pelt %mem-decode-starts-at-0
  32. (w %decode-mset)
  33. ::
  34. %^ tag-mp-pelt %mem-op0-mset-starts-at-0
  35. (w %op0-mset)
  36. ~
  37. ::
  38. ++ terminal-constraints
  39. ^- (map term mp-ultra)
  40. =, constraint-util
  41. =/ r ~(r rnd:chal:chal (make-chal-mps:chal chal-names-basic:chal))
  42. =/ bet (r %bet) :: multisets
  43. =/ a (r %a)
  44. =/ b (r %b)
  45. =/ c (r %c)
  46. =/ one (mp-c 1)
  47. %- ~(gas by *(map col-name mp-ultra))
  48. %^ tag-mp-pelt %mem-kvs-empty
  49. (w %kvs)
  50. %^ tag-mp-pelt %mem-decode-mset-output
  51. (mpsub-pelt (w %decode-mset) (d %memory-decode-mset))
  52. %^ tag-mp-pelt %mem-op0-mset-output
  53. (mpsub-pelt (w %op0-mset) (d %memory-op0-mset))
  54. ~
  55. ::
  56. ++ row-constraints
  57. ^- (map term mp-ultra)
  58. ~+
  59. =, constraint-util
  60. =/ r ~(r rnd:chal (make-chal-mps:chal chal-names-all:chal))
  61. =/ [a=mp-pelt b=mp-pelt c=mp-pelt d=mp-pelt e=mp-pelt f=mp-pelt g=mp-pelt]
  62. [(r %a) (r %b) (r %c) (r %d) (r %e) (r %f) (r %g)]
  63. =/ [alf=mp-pelt bet=mp-pelt z=mp-pelt]
  64. [(r %alf) (r %bet) (r %z)]
  65. =/ one (mp-c 1)
  66. =/ invalf (r %inv-alf)
  67. %- ~(gas by *(map term mp-ultra))
  68. ::
  69. :: pad is binary
  70. :- :- %mem-pad-binary
  71. %- lift-to-mega
  72. (mpmul (v %pad) (mpsub one (v %pad)))
  73. ::
  74. :: //cons relations\\
  75. %^ tag-mp-pelt %mem-cons-size
  76. %+ mpscal-pelt (v %pad)
  77. %+ mpsub-pelt (w %parent-size)
  78. (mpmul-pelt (w %lc-size) (w %rc-size))
  79. ::
  80. %^ tag-mp-pelt %mem-cons-dyck
  81. %+ mpscal-pelt (v %pad)
  82. %+ mpsub-pelt (w %parent-dyck)
  83. ;: mpadd-pelt
  84. (w %rc-dyck)
  85. :(mpmul-pelt (w %rc-size) (w %rc-size) invalf invalf)
  86. :(mpmul-pelt (w %lc-dyck) (w %rc-size) (w %rc-size) invalf)
  87. ==
  88. ::
  89. %^ tag-mp-pelt %mem-cons-leaf
  90. %+ mpscal-pelt (v %pad)
  91. %+ mpsub-pelt (w %parent-leaf)
  92. ;: mpadd-pelt
  93. (w %rc-leaf)
  94. (mpmul-pelt (w %lc-leaf) (w %rc-size))
  95. ==
  96. :: \\cons relations//
  97. ::
  98. :: //when lc is an atom\\
  99. %^ tag-mp-pelt %mem-lc-size-when-atom
  100. %+ mpscal-pelt (v %pad)
  101. (mpscal-pelt (mpsub one (v %op-l)) (mpsub-pelt (w %lc-size) alf))
  102. ::
  103. %^ tag-mp-pelt %mem-lc-dyck-when-atom
  104. (mpscal-pelt (mpsub one (v %op-l)) (w %lc-dyck))
  105. ::
  106. %^ tag-mp-pelt %mem-lc-leaf-when-atom
  107. %+ mpscal-pelt (mpsub one (v %op-l))
  108. (mpsub-pelt [(v %leaf-l) (mp-c 0) (mp-c 0)] (w %lc-leaf))
  109. :: \\when lc is an atom//
  110. ::
  111. :: //when rc is an atom\\
  112. %^ tag-mp-pelt %mem-rc-size-when-atom
  113. %+ mpscal-pelt (v %pad)
  114. (mpscal-pelt (mpsub one (v %op-r)) (mpsub-pelt (w %rc-size) alf))
  115. ::
  116. %^ tag-mp-pelt %mem-rc-dyck-when-atom
  117. (mpscal-pelt (mpsub one (v %op-r)) (w %rc-dyck))
  118. ::
  119. %^ tag-mp-pelt %mem-rc-leaf-when-atom
  120. %+ mpscal-pelt (mpsub one (v %op-r))
  121. (mpsub-pelt [(v %leaf-r) (mp-c 0) (mp-c 0)] (w %rc-leaf))
  122. :: \\when rc is an atom//
  123. ::
  124. :: sizes cannot hit one
  125. %^ tag-mp-pelt %mem-sizes-cannot-hit-one
  126. %+ mpsub-pelt (lift-to-mp-pelt one)
  127. ;: mpmul-pelt
  128. (mpsub-pelt (w %parent-size) (lift-to-mp-pelt one))
  129. (mpsub-pelt (w %lc-size) (lift-to-mp-pelt one))
  130. (mpsub-pelt (w %rc-size) (lift-to-mp-pelt one))
  131. (w %inv)
  132. ==
  133. ::
  134. :: //parent and children 0 in padding\\
  135. %^ tag-mp-pelt %mem-parent-size-zero-in-pad
  136. (mpscal-pelt (mpsub one (v %pad)) (w %parent-size))
  137. ::
  138. %^ tag-mp-pelt %mem-parent-dyck-zero-in-pad
  139. (mpscal-pelt (mpsub one (v %pad)) (w %parent-dyck))
  140. ::
  141. %^ tag-mp-pelt %mem-parent-leaf-zero-in-pad
  142. (mpscal-pelt (mpsub one (v %pad)) (w %parent-leaf))
  143. ::
  144. %^ tag-mp-pelt %mem-lc-size-zero-in-pad
  145. (mpscal-pelt (mpsub one (v %pad)) (w %lc-size))
  146. ::
  147. %^ tag-mp-pelt %mem-lc-dyck-zero-in-pad
  148. (mpscal-pelt (mpsub one (v %pad)) (w %lc-dyck))
  149. ::
  150. %^ tag-mp-pelt %mem-lc-leaf-zero-in-pad
  151. (mpscal-pelt (mpsub one (v %pad)) (w %lc-leaf))
  152. ::
  153. %^ tag-mp-pelt %mem-rc-size-zero-in-pad
  154. (mpscal-pelt (mpsub one (v %pad)) (w %rc-size))
  155. ::
  156. %^ tag-mp-pelt %mem-rc-dyck-zero-in-pad
  157. (mpscal-pelt (mpsub one (v %pad)) (w %rc-dyck))
  158. ::
  159. %^ tag-mp-pelt %mem-rc-leaf-zero-in-pad
  160. (mpscal-pelt (mpsub one (v %pad)) (w %rc-leaf))
  161. ::
  162. :: \\parent and children 0 in padding//
  163. ::
  164. :: //axis and inverse system\\
  165. :- :- %mem-axis-and-inverse-0
  166. %- lift-to-mega
  167. (mpmul (v %axis) (mpsub one (v %axis-flag)))
  168. ::
  169. :- :- %mem-axis-and-inverse-1
  170. %- lift-to-mega
  171. (mpmul (v %axis-ioz) (mpsub one (v %axis-flag)))
  172. ::
  173. :- :- %mem-axis-and-inverse-2
  174. %- lift-to-mega
  175. (mpsub (v %axis-flag) (mpmul (v %axis) (v %axis-ioz)))
  176. :: \\axis and inverse system//
  177. ::
  178. :: axis is zero in padding
  179. :- :- %mem-axis-zero-in-pad
  180. %- lift-to-mega
  181. (mpmul (mpsub one (v %pad)) (v %axis))
  182. ::
  183. :: //op-l/r constraints\\
  184. :: left opcode is binary
  185. :- :- %mem-op-l-binary
  186. %- lift-to-mega
  187. (mpmul (v %op-l) (mpsub one (v %op-l)))
  188. ::
  189. :: right opcode is binary
  190. :- :- %mem-op-r-binary
  191. %- lift-to-mega
  192. (mpmul (v %op-r) (mpsub one (v %op-r)))
  193. ::
  194. :: left opcode zero in padding
  195. :- :- %mem-op-l-zero-in-pad
  196. %- lift-to-mega
  197. (mpmul (mpsub one (v %pad)) (v %op-l))
  198. ::
  199. :: right opcode zero in padding
  200. :- :- %mem-op-r-zero-in-pad
  201. %- lift-to-mega
  202. (mpmul (mpsub one (v %pad)) (v %op-r))
  203. :: \\op-l/r constraints//
  204. ::
  205. :: count-inv is count's inverse
  206. :- :- %mem-count-inverse
  207. %- lift-to-mega
  208. (mpsub one (mpmul (v %count) (v %count-inv)))
  209. ::
  210. :: //kvs-ioz constraint system\\
  211. %^ tag-mp-pelt %mem-kvs-ioz-system-0
  212. (mpmul-pelt (w %kvs) (mpsub-pelt (w %kvsf) (lift-to-mp-pelt one)))
  213. ::
  214. %^ tag-mp-pelt %mem-kvs-ioz-system-1
  215. (mpmul-pelt (w %kvs-ioz) (mpsub-pelt (w %kvsf) (lift-to-mp-pelt one)))
  216. ::
  217. %^ tag-mp-pelt %mem-kvs-ioz-system-2
  218. (mpsub-pelt (w %kvsf) (mpmul-pelt (w %kvs) (w %kvs-ioz)))
  219. :: \\kvs-ioz constraint system//
  220. ::
  221. :: kvs empty triggers padding
  222. %^ tag-mp-pelt %mem-pad-kvsf-relation
  223. %+ mpscal-pelt (v %pad)
  224. (mpsub-pelt (lift-to-mp-pelt one) (w %kvsf))
  225. ::
  226. :: dmult 0 when axis isn't labelled 0
  227. :- :- %mem-axis-nonzero-dmult-zero
  228. %- lift-to-mega
  229. (mpmul (v %axis-flag) (v %dmult))
  230. ::
  231. :: dmult can only be 0 or 1
  232. :- :- %mem-dmult-is-binary
  233. %- lift-to-mega
  234. (mpmul (v %dmult) (mpsub one (v %dmult)))
  235. ::
  236. :: dmult 0 in padding
  237. :- :- %mem-axis-nonzero-dmult-zero
  238. %- lift-to-mega
  239. (mpmul (mpsub one (v %pad)) (v %dmult))
  240. ::
  241. :: //formula subnodes (axis=0) don't go in the multiset\\
  242. :- :- %mem-axis-zero-mult-zero
  243. %- lift-to-mega
  244. (mpmul (v %mult) (mpsub one (v %axis-flag)))
  245. ::
  246. :- :- %mem-axis-zero-mult-lc-zero
  247. %- lift-to-mega
  248. (mpmul (v %mult-lc) (mpsub one (v %axis-flag)))
  249. ::
  250. :- :- %mem-axis-zero-mult-rc-zero
  251. %- lift-to-mega
  252. (mpmul (v %mult-rc) (mpsub one (v %axis-flag)))
  253. :: \\formula subnodes (axis=0) don't go in the multiset//
  254. ::
  255. :: //multiplicities zero in padding\\
  256. :- :- %mem-mult-zero-in-pad
  257. %- lift-to-mega
  258. (mpmul (mpsub one (v %pad)) (v %mult))
  259. ::
  260. :- :- %mem-mult-lc-zero-in-pad
  261. %- lift-to-mega
  262. (mpmul (mpsub one (v %pad)) (v %mult-lc))
  263. ::
  264. :- :- %mem-mult-rc-zero-in-pad
  265. %- lift-to-mega
  266. (mpmul (mpsub one (v %pad)) (v %mult-rc))
  267. :: \\multiplicities zero in padding//
  268. ~
  269. ::
  270. ++ transition-constraints
  271. ^- (map term mp-ultra)
  272. ~+
  273. =, constraint-util
  274. =/ r ~(r rnd:chal (make-chal-mps:chal chal-names-all:chal))
  275. =/ [a=mp-pelt b=mp-pelt c=mp-pelt d=mp-pelt e=mp-pelt f=mp-pelt g=mp-pelt]
  276. [(r %a) (r %b) (r %c) (r %d) (r %e) (r %f) (r %g)]
  277. =/ [j=mp-pelt k=mp-pelt l=mp-pelt m=mp-pelt n=mp-pelt o=mp-pelt ww=mp-pelt x=mp-pelt y=mp-pelt]
  278. [(r %j) (r %k) (r %l) (r %m) (r %n) (r %o) (r %w) (r %x) (r %y)]
  279. =/ [alf=mp-pelt bet=mp-pelt gam=mp-pelt z=mp-pelt]
  280. [(r %alf) (r %bet) (r %gam) (r %z)]
  281. =/ ion-chals
  282. :+ [a.a a.b a.c a.alf]
  283. [b.a b.b b.c b.alf]
  284. [c.a c.b c.c c.alf]
  285. ::=/ invalf (mpinv-pelt alf)
  286. =/ one (mp-c 1)
  287. =/ input (r %input)
  288. =/ l-axis (mpmul (mp-c 2) (v %axis))
  289. =/ r-axis (mpadd (mpmul (mp-c 2) (v %axis)) (v %axis-flag))
  290. %- ~(gas by *(map term mp-ultra))
  291. ::
  292. :: padding section stays the padding section
  293. :- :- %mem-pad-stay-pad
  294. %- lift-to-mega
  295. (mpmul (mpsub one (v %pad)) (v %pad-n))
  296. ::
  297. :: count update
  298. :- :- %mem-count-update
  299. %- lift-to-mega
  300. %+ mpsub (v %count-n)
  301. %+ mpadd
  302. (mpmul (v %pad) (mpadd (v %count) one))
  303. (mpmul (mpsub one (v %pad)) (mpsub (v %count) one))
  304. ::
  305. :: ln=line-number evolution
  306. %^ tag-mp-pelt %mem-line-number-update
  307. (mpsub-pelt (w-n %ln) (mpmul-pelt (w %ln) z))
  308. ::
  309. :: nc=node-count evolution
  310. %^ tag-mp-pelt %mem-node-count-update
  311. %+ mpsub-pelt (w-n %nc)
  312. ;: mpadd-pelt
  313. %- mpscal-pelt
  314. :_ (w %nc)
  315. (mpmul (mpsub one (v %op-l)) (mpsub one (v %op-r)))
  316. ::
  317. %+ mpscal-pelt
  318. %+ mpadd (mpmul (v %op-l) (mpsub one (v %op-r)))
  319. (mpmul (v %op-r) (mpsub one (v %op-l)))
  320. (mpmul-pelt (w %nc) z)
  321. ::
  322. %+ mpscal-pelt
  323. (mpmul (v %op-l) (v %op-r))
  324. :(mpmul-pelt (w %nc) z z)
  325. ==
  326. ::
  327. :: kvs update
  328. %^ tag-mp-pelt %mem-kvs-update
  329. %+ mpsub-pelt
  330. %+ mpadd-pelt (w-n %kvs)
  331. %+ mpmul-pelt (w %ln)
  332. %- ~(compress poly-tupler-pelt ~[a b c d])
  333. :~ (w %parent-size)
  334. (w %parent-dyck)
  335. (w %parent-leaf)
  336. [(v %axis) (mp-c 0) (mp-c 0)]
  337. ==
  338. ;: mpadd-pelt
  339. (w %kvs)
  340. ::
  341. %+ mpscal-pelt (v %op-l)
  342. ;: mpmul-pelt
  343. z
  344. (w %nc)
  345. %- ~(compress poly-tupler-pelt ~[a b c d])
  346. :~ (w %lc-size)
  347. (w %lc-dyck)
  348. (w %lc-leaf)
  349. [l-axis (mp-c 0) (mp-c 0)]
  350. ==
  351. ==
  352. ::
  353. %+ mpscal-pelt (mpmul (mpsub one (v %op-l)) (v %op-r))
  354. ;: mpmul-pelt
  355. z
  356. (w %nc)
  357. %- ~(compress poly-tupler-pelt ~[a b c d])
  358. :~ (w %rc-size)
  359. (w %rc-dyck)
  360. (w %rc-leaf)
  361. [r-axis (mp-c 0) (mp-c 0)]
  362. ==
  363. ==
  364. ::
  365. %+ mpscal-pelt (mpmul (v %op-l) (v %op-r))
  366. ;: mpmul-pelt
  367. z z
  368. (w %nc)
  369. %- ~(compress poly-tupler-pelt ~[a b c d])
  370. :~ (w %rc-size)
  371. (w %rc-dyck)
  372. (w %rc-leaf)
  373. [r-axis (mp-c 0) (mp-c 0)]
  374. ==
  375. ==
  376. ==
  377. ::
  378. :: decode mset transition constraint
  379. :- :- %mem-decode-mset-update
  380. =/ trip
  381. %- ~(compress poly-tupler-pelt ~[j k l m n o ww x y])
  382. :~ (w %parent-size)
  383. (w %parent-dyck)
  384. (w %parent-leaf)
  385. (w %lc-size)
  386. (w %lc-dyck)
  387. (w %lc-leaf)
  388. (w %rc-size)
  389. (w %rc-dyck)
  390. (w %rc-leaf)
  391. ==
  392. =/ com
  393. %+ mpsub-pelt
  394. %+ mpmul-pelt
  395. (mpsub-pelt (w-n %decode-mset) (w %decode-mset))
  396. (mpsub-pelt gam [(mp-com 0) (mp-com 1) (mp-com 2)])
  397. %- lift-to-mp-pelt
  398. (mpmul (mpsub one (v %axis-flag)) (v %dmult))
  399. :+ %comp
  400. ~[a.trip b.trip c.trip]
  401. ~[a.com b.com c.com]
  402. ::
  403. :: op0 mset transition constraint
  404. %^ tag-mp-comp %mem-op0-mset-update
  405. =/ mvar
  406. %+ mpadd-pelt
  407. input
  408. %- ~(compress poly-tupler-pelt ~[d e f g])
  409. :~ [(v %axis) (mp-c 0) (mp-c 0)]
  410. (w %parent-size)
  411. (w %parent-dyck)
  412. (w %parent-leaf)
  413. ==
  414. =/ mvar-lc
  415. %+ mpadd-pelt
  416. input
  417. %- ~(compress poly-tupler-pelt ~[d e f g])
  418. :~ [l-axis (mp-c 0) (mp-c 0)]
  419. (w %lc-size)
  420. (w %lc-dyck)
  421. (w %lc-leaf)
  422. ==
  423. =/ mvar-rc
  424. %+ mpadd-pelt
  425. input
  426. %- ~(compress poly-tupler-pelt ~[d e f g])
  427. :~ [r-axis (mp-c 0) (mp-c 0)]
  428. (w %rc-size)
  429. (w %rc-dyck)
  430. (w %rc-leaf)
  431. ==
  432. %+ mpcomp-pelt
  433. :: Dependency
  434. ;: mpmul-pelt
  435. (mpsub-pelt (w-n %op0-mset) (w %op0-mset))
  436. (mpsub-pelt bet mvar)
  437. (mpsub-pelt bet mvar-lc)
  438. ==
  439. :: Computation using dependency
  440. %+ mpsub-pelt
  441. %+ mpmul-pelt
  442. :: Symbolic representation of dependency
  443. [a=(mp-com 0) b=(mp-com 1) c=(mp-com 2)]
  444. (mpsub-pelt bet mvar-rc)
  445. ;: mpadd-pelt
  446. %+ mpscal-pelt (v %mult)
  447. (mpmul-pelt (mpsub-pelt bet mvar-lc) (mpsub-pelt bet mvar-rc))
  448. ::
  449. %+ mpscal-pelt (mpmul (mpsub one (v %op-l)) (v %mult-lc))
  450. (mpmul-pelt (mpsub-pelt bet mvar) (mpsub-pelt bet mvar-rc))
  451. ::
  452. %+ mpscal-pelt (mpmul (mpsub one (v %op-r)) (v %mult-rc))
  453. (mpmul-pelt (mpsub-pelt bet mvar) (mpsub-pelt bet mvar-lc))
  454. ==
  455. ~
  456. --
  457. --
  458. --