compute.hoon 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318
  1. /= common /common/table/compute
  2. /= * /common/zeke
  3. =, mp-to-mega
  4. =, constraint-util
  5. |%
  6. ++ one (mp-c 1)
  7. ++ zero (mp-c 0)
  8. ++ one-pelt [(mp-c 1) (mp-c 0) (mp-c 0)]
  9. ++ zero-pelt [(mp-c 0) (mp-c 0) (mp-c 0)]
  10. ++ v ~(v var:tlib variables:static:common)
  11. ++ w ~(v var-pelt:tlib variables:static:common)
  12. ++ w-n ~(v-n var-pelt:tlib variables:static:common)
  13. ++ w-c ~(c var-pelt:tlib variables:static:common)
  14. ++ d ~(d dyn:dyn (make-dyn-mps:dyn terminal-names:static:common))
  15. ::
  16. +$ nounp [size=mp-pelt dyck=mp-pelt leaf=mp-pelt]
  17. ++ make-nounp
  18. |= nam=term
  19. ^- nounp
  20. :+ (w (crip (weld (trip nam) "-size")))
  21. (w (crip (weld (trip nam) "-dyck")))
  22. (w (crip (weld (trip nam) "-leaf")))
  23. ::
  24. ::
  25. ++ zero-during-padding
  26. |= [nam=term tail=(list [term mp-ultra])]
  27. ^- (list [term mp-ultra])
  28. :_ tail
  29. :- (crip (weld (trip nam) "-zero-during-padding"))
  30. %- lift-to-mega
  31. (mpmul (v %pad) (v nam))
  32. ::
  33. ++ zero-during-padding-pelt
  34. |= [nam=term tail=(list [term mp-ultra])]
  35. ^- (list [term mp-ultra])
  36. %^ tag-mp-pelt
  37. (crip (weld (trip nam) "-zero-during-padding"))
  38. (mpscal-pelt (v %pad) (w nam))
  39. tail
  40. ::
  41. ++ make-cons
  42. |= alf-inv=mp-pelt
  43. |= [[nam=term p=term l=term r=term sel=mp-mega] tail=(list [term mp-ultra])]
  44. ^- (list [term mp-ultra])
  45. =/ p (make-nounp p)
  46. =/ l (make-nounp l)
  47. =/ r (make-nounp r)
  48. %^ tag-mp-pelt (crip (weld (trip nam) "-size"))
  49. %+ mpscal-pelt sel
  50. %+ mpsub-pelt size.p
  51. (mpmul-pelt size.l size.r)
  52. ::
  53. %^ tag-mp-pelt (crip (weld (trip nam) "-dyck"))
  54. %+ mpscal-pelt sel
  55. %+ mpsub-pelt dyck.p
  56. ;: mpadd-pelt
  57. dyck.r
  58. :(mpmul-pelt dyck.l size.r size.r alf-inv)
  59. :(mpmul-pelt size.r size.r alf-inv alf-inv)
  60. ==
  61. ::
  62. %^ tag-mp-pelt
  63. (crip (weld (trip nam) "-leaf"))
  64. %+ mpscal-pelt sel
  65. %+ mpsub-pelt leaf.p
  66. %+ mpadd-pelt
  67. (mpmul-pelt leaf.l size.r)
  68. leaf.r
  69. ::
  70. tail
  71. ::
  72. :: Set ions n=m
  73. ++ ion-equal
  74. |= [[nam=term ion-l=term ion-r=term sel=mp-mega] tail=(list [term mp-ultra])]
  75. ^- (list [term mp-ultra])
  76. =/ l (make-nounp ion-l)
  77. =/ r (make-nounp ion-r)
  78. %^ tag-mp-pelt (crip (weld (trip nam) "-size"))
  79. %+ mpscal-pelt sel
  80. (mpsub-pelt size.l size.r)
  81. ::
  82. %^ tag-mp-pelt (crip (weld (trip nam) "-leaf"))
  83. %+ mpscal-pelt sel
  84. (mpsub-pelt leaf.l leaf.r)
  85. ::
  86. %^ tag-mp-pelt (crip (weld (trip nam) "-dyck"))
  87. %+ mpscal-pelt sel
  88. (mpsub-pelt dyck.l dyck.r)
  89. ::
  90. tail
  91. ::
  92. :: set ion to be 0
  93. ++ zero-ion
  94. |= [[nam=term ion=term sel=mp-mega] tail=(list [term mp-ultra])]
  95. ^- (list [term mp-ultra])
  96. %^ tag-mp-pelt (crip (weld (trip nam) "-s-size"))
  97. %+ mpscal-pelt sel
  98. (mpsub-pelt (w (crip (weld (trip ion) "-s-size"))) one-pelt)
  99. ::
  100. %^ tag-mp-pelt (crip (weld (trip nam) "-s-leaf"))
  101. %+ mpscal-pelt sel
  102. (mpsub-pelt (w (crip (weld (trip ion) "-s-leaf"))) zero-pelt)
  103. ::
  104. %^ tag-mp-pelt (crip (weld (trip nam) "-s-dyck"))
  105. %+ mpscal-pelt sel
  106. (mpsub-pelt (w (crip (weld (trip ion) "-s-dyck"))) zero-pelt)
  107. ::
  108. %^ tag-mp-pelt (crip (weld (trip nam) "-f-size"))
  109. %+ mpscal-pelt sel
  110. (mpsub-pelt (w (crip (weld (trip ion) "-f-size"))) one-pelt)
  111. ::
  112. %^ tag-mp-pelt (crip (weld (trip nam) "-f-leaf"))
  113. %+ mpscal-pelt sel
  114. (mpsub-pelt (w (crip (weld (trip ion) "-f-leaf"))) zero-pelt)
  115. ::
  116. %^ tag-mp-pelt (crip (weld (trip nam) "-f-dyck"))
  117. %+ mpscal-pelt sel
  118. (mpsub-pelt (w (crip (weld (trip ion) "-f-dyck"))) zero-pelt)
  119. ::
  120. %^ tag-mp-pelt (crip (weld (trip nam) "-e-size"))
  121. %+ mpscal-pelt sel
  122. (mpsub-pelt (w (crip (weld (trip ion) "-e-size"))) one-pelt)
  123. ::
  124. %^ tag-mp-pelt (crip (weld (trip nam) "-e-leaf"))
  125. %+ mpscal-pelt sel
  126. (mpsub-pelt (w (crip (weld (trip ion) "-e-leaf"))) zero-pelt)
  127. ::
  128. %^ tag-mp-pelt (crip (weld (trip nam) "-e-dyck"))
  129. %+ mpscal-pelt sel
  130. (mpsub-pelt (w (crip (weld (trip ion) "-e-dyck"))) zero-pelt)
  131. ::
  132. tail
  133. ::
  134. ++ engine
  135. |%
  136. ::
  137. ++ funcs
  138. ^- verifier-funcs
  139. |%
  140. ++ boundary-constraints
  141. ^- (map term mp-ultra)
  142. =, constraint-util
  143. =/ r ~(r rnd:chal:chal (make-chal-mps:chal chal-names-all:chal))
  144. =/ z=mp-pelt (r %z)
  145. =/ a=mp-pelt (r %a)
  146. =/ b=mp-pelt (r %b)
  147. =/ c=mp-pelt (r %c)
  148. =/ d-chal=mp-pelt (r %d)
  149. =/ e=mp-pelt (r %e)
  150. =/ f=mp-pelt (r %f)
  151. ::
  152. %- ~(gas by *(map col-name mp-ultra))
  153. ::
  154. :- :- %pad-starts-at-0
  155. (lift-to-mega (v %pad))
  156. ::
  157. %^ tag-mp-pelt %opc-starts-at-z
  158. (mpsub-pelt z (w %opc))
  159. ::
  160. %^ tag-mp-pelt %ln-starts-at-z
  161. (mpsub-pelt z (w %ln))
  162. ::
  163. %^ tag-mp-pelt %op0-decode-starts-at-0
  164. (w %decode-mset)
  165. ::
  166. %^ tag-mp-pelt %op0-mset-starts-at-0
  167. (w %op0-mset)
  168. ::
  169. %^ tag-mp-pelt %kv-store-starts-with-input
  170. %+ mpsub-pelt (w %stack-kv)
  171. %+ mpmul-pelt z
  172. ;: mpadd-pelt
  173. %+ mpmul-pelt d-chal
  174. ;: mpadd-pelt
  175. (mpmul-pelt a (w %s-size))
  176. (mpmul-pelt b (w %s-dyck))
  177. (mpmul-pelt c (w %s-leaf))
  178. ==
  179. ::
  180. %+ mpmul-pelt e
  181. ;: mpadd-pelt
  182. (mpmul-pelt a (w %f-size))
  183. (mpmul-pelt b (w %f-dyck))
  184. (mpmul-pelt c (w %f-leaf))
  185. ==
  186. ::
  187. %+ mpmul-pelt f
  188. ;: mpadd-pelt
  189. (mpmul-pelt a (w %e-size))
  190. (mpmul-pelt b (w %e-dyck))
  191. (mpmul-pelt c (w %e-leaf))
  192. ==
  193. ==
  194. ::
  195. %^ tag-mp-pelt %compute-s-size-input
  196. (mpsub-pelt (w %s-size) (d %compute-s-size))
  197. ::
  198. %^ tag-mp-pelt %compute-s-dyck-input
  199. (mpsub-pelt (w %s-dyck) (d %compute-s-dyck))
  200. ::
  201. %^ tag-mp-pelt %compute-s-leaf-input
  202. (mpsub-pelt (w %s-leaf) (d %compute-s-leaf))
  203. ::
  204. %^ tag-mp-pelt %compute-f-size-input
  205. (mpsub-pelt (w %f-size) (d %compute-f-size))
  206. ::
  207. %^ tag-mp-pelt %compute-f-dyck-input
  208. (mpsub-pelt (w %f-dyck) (d %compute-f-dyck))
  209. ::
  210. %^ tag-mp-pelt %compute-f-leaf-input
  211. (mpsub-pelt (w %f-leaf) (d %compute-f-leaf))
  212. ::
  213. %^ tag-mp-pelt %compute-e-size-input
  214. (mpsub-pelt (w %e-size) (d %compute-e-size))
  215. ::
  216. %^ tag-mp-pelt %compute-e-dyck-input
  217. (mpsub-pelt (w %e-dyck) (d %compute-e-dyck))
  218. ::
  219. %^ tag-mp-pelt %compute-e-leaf-input
  220. (mpsub-pelt (w %e-leaf) (d %compute-e-leaf))
  221. ~
  222. ::
  223. ++ terminal-constraints
  224. ^- (map term mp-ultra)
  225. =, constraint-util
  226. :: stack kv must be 0 at end
  227. %- ~(gas by *(map term mp-ultra))
  228. ::
  229. %^ tag-mp-pelt %stack-kv-end-0
  230. (w %stack-kv)
  231. ::
  232. %^ tag-mp-pelt %compute-decode-mset-output
  233. (mpsub-pelt (w %decode-mset) (d %compute-decode-mset))
  234. ::
  235. %^ tag-mp-pelt %compute-op0-mset-output
  236. (mpsub-pelt (w %op0-mset) (d %compute-op0-mset))
  237. ~
  238. ::
  239. ++ row-constraints
  240. ^- (map term mp-ultra)
  241. =, chal
  242. =, constraint-util
  243. =/ r ~(r rnd:chal:chal (make-chal-mps:chal chal-names-all:chal))
  244. =/ a=mp-pelt (r %a)
  245. =/ b=mp-pelt (r %b)
  246. =/ c=mp-pelt (r %c)
  247. =/ d=mp-pelt (r %d)
  248. =/ e=mp-pelt (r %e)
  249. =/ f=mp-pelt (r %f)
  250. =/ g=mp-pelt (r %g)
  251. =/ alf=mp-pelt (r %alf) :: ion
  252. =/ alf-inv=mp-pelt (r %inv-alf) :: ion
  253. =/ bet=mp-pelt (r %bet) :: multiset
  254. =/ z=mp-pelt (r %z) :: kv store
  255. =/ z2=mp-pelt (mpmul-pelt z z)
  256. =/ z3=mp-pelt (mpmul-pelt z2 z)
  257. =/ make-cons (make-cons alf-inv)
  258. =/ pd zero-during-padding
  259. =/ pd-pelt zero-during-padding-pelt
  260. ::
  261. %- ~(gas by *(map col-name mp-ultra))
  262. ::
  263. :: Indexing & Selector Constraints
  264. ::
  265. :: opcode flags must be binary
  266. :: o0(1-o0)=0 ...
  267. :- :- %op0
  268. %- lift-to-mega
  269. (mpmul (v %op0) (mpsub one (v %op0)))
  270. :- :- %op1
  271. %- lift-to-mega
  272. (mpmul (v %op1) (mpsub one (v %op1)))
  273. :- :- %op2
  274. %- lift-to-mega
  275. (mpmul (v %op2) (mpsub one (v %op2)))
  276. :- :- %op3
  277. %- lift-to-mega
  278. (mpmul (v %op3) (mpsub one (v %op3)))
  279. :- :- %op4
  280. %- lift-to-mega
  281. (mpmul (v %op4) (mpsub one (v %op4)))
  282. :- :- %op5
  283. %- lift-to-mega
  284. (mpmul (v %op5) (mpsub one (v %op5)))
  285. :- :- %op6
  286. %- lift-to-mega
  287. (mpmul (v %op6) (mpsub one (v %op6)))
  288. :- :- %op7
  289. %- lift-to-mega
  290. (mpmul (v %op7) (mpsub one (v %op7)))
  291. :- :- %op8
  292. %- lift-to-mega
  293. (mpmul (v %op8) (mpsub one (v %op8)))
  294. :- :- %op9
  295. %- lift-to-mega
  296. (mpmul (v %op9) (mpsub one (v %op9)))
  297. ::
  298. :: only one opcode flag can be 1 so they must sum to (1 - pad)
  299. :- :- %opflags-add-to-one
  300. %- lift-to-mega
  301. %+ mpsub (mpsub one (v %pad))
  302. ;: mpadd
  303. (v %op0) (v %op1) (v %op2) (v %op3) (v %op4)
  304. (v %op5) (v %op6) (v %op7) (v %op8) (v %op9)
  305. ==
  306. ::
  307. ::
  308. :: Opcode Selector Constraints
  309. ::
  310. :: This constraint needs to ensure that the correct opcode is chosen and agrees
  311. :: with the initial formula decomposition for j ∈ {0, ..., 8}, remaining
  312. :: unconstrained for cons operations (opcode 9).
  313. ::
  314. %^ tag-mp-pelt %f-h-size-opcode
  315. %+ mpsub-pelt
  316. (mpscal-pelt (mpsub one (v %op9)) (w %f-h-size))
  317. %- mpscal-pelt
  318. :_ alf
  319. ;: mpadd
  320. (v %op0) (v %op1) (v %op2) (v %op3) (v %op4)
  321. (v %op5) (v %op6) (v %op7) (v %op8)
  322. ==
  323. ::
  324. %^ tag-mp-pelt %f-h-leaf-opcode
  325. %+ mpsub-pelt
  326. (mpscal-pelt (mpsub one (v %op9)) (w %f-h-leaf))
  327. %- lift-to-mp-pelt
  328. ;: mpadd
  329. (v %op1)
  330. (mpmul (mp-c 2) (v %op2)) (mpmul (mp-c 3) (v %op3)) (mpmul (mp-c 4) (v %op4))
  331. (mpmul (mp-c 5) (v %op5)) (mpmul (mp-c 6) (v %op6)) (mpmul (mp-c 7) (v %op7))
  332. (mpmul (mp-c 8) (v %op8))
  333. ==
  334. ::
  335. %^ tag-mp-pelt %f-h-dyck-opcode
  336. (mpscal-pelt (mpsub one (v %op9)) (w %f-h-dyck))
  337. ::
  338. ::
  339. ::
  340. %^ tag-mp-pelt %fcons-inv
  341. %+ mpsub-pelt
  342. (lift-to-mp-pelt (mpsub one (v %pad)))
  343. ;: mpmul-pelt
  344. (w %f-h-size)
  345. (w %f-th-size)
  346. (w %f-tt-size)
  347. (w %fcons-inv)
  348. ==
  349. ::
  350. %^ tag-mp-pelt %sfcons-inv
  351. %- mpsub-pelt
  352. :_ (lift-to-mp-pelt (mpsub one (mpadd (v %op0) (v %op3))))
  353. ;: mpadd-pelt
  354. %+ mpscal-pelt (v %op8)
  355. ;: mpmul-pelt
  356. (w %s-size)
  357. (w %sf2-e-size)
  358. (w %sfcons-inv)
  359. ==
  360. ::
  361. %+ mpscal-pelt (v %op9)
  362. ;: mpmul-pelt
  363. (w %sf1-e-size)
  364. (w %sf2-e-size)
  365. (w %sfcons-inv)
  366. ==
  367. ::
  368. %+ mpscal-pelt (v %op5)
  369. ;: mpmul-pelt
  370. (w %sfcons-inv)
  371. ;: mpadd-pelt
  372. %+ mpmul-pelt a
  373. (mpsub-pelt (w %sf1-e-size) (w %sf2-e-size))
  374. ::
  375. %+ mpmul-pelt b
  376. (mpsub-pelt (w %sf1-e-dyck) (w %sf2-e-dyck))
  377. ::
  378. %+ mpmul-pelt c
  379. (mpsub-pelt (w %sf1-e-leaf) (w %sf2-e-leaf))
  380. ::
  381. (mpsub-pelt one-pelt (w %e-leaf))
  382. ==
  383. ==
  384. ::
  385. %+ mpscal-pelt (v %pad)
  386. %+ mpmul-pelt (w %sfcons-inv)
  387. (mpsub-pelt z (w %ln))
  388. ::
  389. %- mpscal-pelt
  390. :_ (w %sfcons-inv)
  391. ;: mpadd
  392. (v %op1) (v %op2) (v %op4)
  393. (v %op6) (v %op7)
  394. ==
  395. ==
  396. ::
  397. ::
  398. :: %pad must be binary
  399. :- :- %pad-binary
  400. %- lift-to-mega
  401. (mpmul (v %pad) (mpsub one (v %pad)))
  402. ::
  403. :: Formula decoding constraints
  404. ::
  405. ::
  406. ::
  407. :: f = (cons f_h, f_t)
  408. %+ make-cons
  409. :* %f-fh-ft-cons
  410. %f %f-h %f-t
  411. (mpsub one (v %pad))
  412. ==
  413. ::
  414. :: f-t = (cons f_th, f_tt)
  415. %+ make-cons
  416. :* %ft-fth-ftt-cons
  417. %f-t %f-th %f-tt
  418. :(mpadd (v %op2) (v %op5) (v %op6) (v %op7) (v %op8))
  419. ==
  420. ::
  421. :: f-tt = (cons f-tth, f-ttt)
  422. %+ make-cons
  423. :* %ftt-ftth-fttt-cons
  424. %f-tt %f-tth %f-ttt
  425. (v %op6)
  426. ==
  427. ::
  428. :: decoding columns must be 0 if not used
  429. %^ tag-mp-pelt %f-th-zero-size
  430. %+ mpscal-pelt
  431. (mpsub one (v %pad))
  432. %+ mpscal-pelt
  433. :(mpadd (v %op0) (v %op1) (v %op3) (v %op4) (v %op9))
  434. (mpsub-pelt one-pelt (w %f-th-size))
  435. ::
  436. %^ tag-mp-pelt %f-th-zero-leaf
  437. %+ mpscal-pelt
  438. :(mpadd (v %op0) (v %op1) (v %op3) (v %op4) (v %op9))
  439. (w %f-th-leaf)
  440. ::
  441. %^ tag-mp-pelt %f-th-zero-dyck
  442. %+ mpscal-pelt
  443. :(mpadd (v %op0) (v %op1) (v %op3) (v %op4) (v %op9))
  444. (w %f-th-dyck)
  445. ::
  446. %^ tag-mp-pelt %f-tt-zero-size
  447. %+ mpscal-pelt
  448. (mpsub one (v %pad))
  449. %+ mpscal-pelt
  450. :(mpadd (v %op0) (v %op1) (v %op3) (v %op4) (v %op9))
  451. (mpsub-pelt one-pelt (w %f-tt-size))
  452. ::
  453. %^ tag-mp-pelt %f-tt-zero-leaf
  454. %+ mpscal-pelt
  455. :(mpadd (v %op0) (v %op1) (v %op3) (v %op4) (v %op9))
  456. (w %f-tt-leaf)
  457. ::
  458. %^ tag-mp-pelt %f-tt-zero-dyck
  459. %+ mpscal-pelt
  460. :(mpadd (v %op0) (v %op1) (v %op3) (v %op4) (v %op9))
  461. (w %f-tt-dyck)
  462. ::
  463. %^ tag-mp-pelt %f-tth-zero-size
  464. %+ mpscal-pelt
  465. (mpsub one (v %pad))
  466. %+ mpscal-pelt
  467. (mpsub one (v %op6))
  468. (mpsub-pelt (w %f-tth-size) one-pelt)
  469. ::
  470. %^ tag-mp-pelt %f-tth-zero-leaf
  471. %+ mpscal-pelt
  472. (mpsub one (v %op6))
  473. (w %f-tth-leaf)
  474. ::
  475. %^ tag-mp-pelt %f-tth-zero-dyck
  476. %+ mpscal-pelt
  477. (mpsub one (v %op6))
  478. (w %f-tth-dyck)
  479. ::
  480. %^ tag-mp-pelt %f-ttt-zero-size
  481. %+ mpscal-pelt
  482. (mpsub one (v %pad))
  483. %+ mpscal-pelt
  484. (mpsub one (v %op6))
  485. (mpsub-pelt (w %f-ttt-size) one-pelt)
  486. ::
  487. %^ tag-mp-pelt %f-ttt-zero-leaf
  488. %+ mpscal-pelt
  489. (mpsub one (v %op6))
  490. (w %f-ttt-leaf)
  491. ::
  492. %^ tag-mp-pelt %f-ttt-zero-dyck
  493. %+ mpscal-pelt
  494. (mpsub one (v %op6))
  495. (w %f-ttt-dyck)
  496. ::
  497. ::
  498. :: Evaluation Constraints
  499. ::
  500. ::
  501. :: Constraints to set unused sf's to 0
  502. ::
  503. :: sf1 = 0
  504. :: used by nock 0 and 1
  505. ::
  506. %+ zero-ion
  507. [%sf1-zero %sf1 (mpadd (v %op0) (v %op1))]
  508. ::
  509. :: sf2 = 0
  510. :: used by nock 0, 1, 3, 4
  511. %+ zero-ion
  512. :* %sf2-zero %sf2
  513. ;:(mpadd (v %op0) (v %op1) (v %op3) (v %op4))
  514. ==
  515. ::
  516. ::
  517. :: sf3 = 0
  518. :: used by everything except 2
  519. ::
  520. %+ zero-ion
  521. :* %sf3-zero %sf3
  522. ;: mpadd
  523. (v %op0) (v %op1) (v %op3) (v %op4)
  524. (v %op5) (v %op6) (v %op7) (v %op8)
  525. (v %op9)
  526. ==
  527. ==
  528. ::
  529. :: Opcode 0
  530. ::
  531. :: f-t-size = 1
  532. ::
  533. %^ tag-mp-pelt %op0-f-t-size-1
  534. %+ mpscal-pelt (v %op0)
  535. (mpsub-pelt (w %f-t-size) alf)
  536. ::
  537. :: f-t-dyck = 0
  538. ::
  539. %^ tag-mp-pelt %op0-f-t-dyck-0
  540. %+ mpscal-pelt (v %op0)
  541. (mpsub-pelt (w %f-t-dyck) zero-pelt)
  542. ::
  543. :: if axis=1 just copy s to e
  544. %^ tag-mp-pelt %op0-axis-1-size
  545. %+ mpscal-pelt (v %op0)
  546. %+ mpmul-pelt
  547. (mpsub-pelt (w %s-size) (w %e-size))
  548. %+ mpsub-pelt one-pelt
  549. %+ mpmul-pelt
  550. (mpsub-pelt (w %f-t-leaf) one-pelt)
  551. (w %sfcons-inv)
  552. ::
  553. %^ tag-mp-pelt %op0-axis-1-leaf
  554. %+ mpscal-pelt (v %op0)
  555. %+ mpmul-pelt
  556. (mpsub-pelt (w %s-leaf) (w %e-leaf))
  557. %+ mpsub-pelt one-pelt
  558. %+ mpmul-pelt
  559. (mpsub-pelt (w %f-t-leaf) one-pelt)
  560. (w %sfcons-inv)
  561. ::
  562. %^ tag-mp-pelt %op0-axis-1-dyck
  563. %+ mpscal-pelt (v %op0)
  564. %+ mpmul-pelt
  565. (mpsub-pelt (w %s-dyck) (w %e-dyck))
  566. %+ mpsub-pelt one-pelt
  567. %+ mpmul-pelt
  568. (mpsub-pelt (w %f-t-leaf) one-pelt)
  569. (w %sfcons-inv)
  570. ::
  571. ::
  572. :: Opcode 1
  573. ::
  574. :: e = f_t
  575. %+ ion-equal
  576. [%op1-e-f-t %e %f-t (v %op1)]
  577. ::
  578. :: Opcode 2
  579. ::
  580. :: sf1_s = s
  581. %+ ion-equal
  582. [%op2-sf1-s %sf1-s %s (v %op2)]
  583. ::
  584. :: sf1_f = f_th
  585. %+ ion-equal
  586. [%op2-sf1-f-f-th %sf1-f %f-th (v %op2)]
  587. ::
  588. :: sf2_s = s
  589. ::
  590. %+ ion-equal
  591. [%op2-sf2-s-s %sf2-s %s (v %op2)]
  592. ::
  593. :: sf2_f = f_tt
  594. ::
  595. %+ ion-equal
  596. [%op2-sf2-f-f-tt %sf2-f %f-tt (v %op2)]
  597. ::
  598. :: sf3_s = sf1_e
  599. ::
  600. %+ ion-equal
  601. [%op2-sf3-s-sf1-e %sf3-s %sf1-e (v %op2)]
  602. ::
  603. :: sf3_f = sf2_e
  604. ::
  605. %+ ion-equal
  606. [%op2-sf3-f-sf2-e %sf3-f %sf2-e (v %op2)]
  607. ::
  608. :: e = sf3-e
  609. %+ ion-equal
  610. [%op2-e-sf3-e %e %sf3-e (v %op2)]
  611. ::
  612. ::
  613. :: Opcode 3
  614. ::
  615. :: e.size = alpha
  616. %^ tag-mp-pelt %op3-e-size-1
  617. %+ mpscal-pelt (v %op3)
  618. (mpsub-pelt (w %e-size) alf)
  619. ::
  620. :: e.dyck = 0
  621. %^ tag-mp-pelt %op3-e-dyck-0
  622. %+ mpscal-pelt (v %op3)
  623. (mpsub-pelt (w %e-dyck) zero-pelt)
  624. ::
  625. :: sfcons-inv * (alpha - sf1-e-size) + e-leaf = 1
  626. %^ tag-mp-pelt %op3-e-leaf
  627. %+ mpscal-pelt (v %op3)
  628. %- mpsub-pelt
  629. :_ one-pelt
  630. %+ mpadd-pelt
  631. %+ mpmul-pelt (w %sfcons-inv)
  632. (mpsub-pelt alf (w %sf1-e-size))
  633. (w %e-leaf)
  634. ::
  635. :: sf1_s = s
  636. %+ ion-equal
  637. [%op3-sf1-s-s %sf1-s %s (v %op3)]
  638. ::
  639. :: sf1_f = f_t
  640. %+ ion-equal
  641. [%op3-sf1-f-f-t %sf1-f %f-t (v %op3)]
  642. ::
  643. ::
  644. :: Opcode 4
  645. ::
  646. :: e.size = alpha
  647. %^ tag-mp-pelt %op4-e-size-1
  648. %+ mpscal-pelt (v %op4)
  649. (mpsub-pelt (w %e-size) alf)
  650. ::
  651. :: e.dyck = 0
  652. %^ tag-mp-pelt %op4-e-dyck-0
  653. %+ mpscal-pelt (v %op4)
  654. (w %e-dyck)
  655. ::
  656. :: e.leaf = 1 + sf1.e.leaf
  657. %^ tag-mp-pelt %op4-e-leaf-0
  658. %+ mpscal-pelt (v %op4)
  659. %+ mpsub-pelt (w %e-leaf)
  660. (mpadd-pelt one-pelt (w %sf1-e-leaf))
  661. ::
  662. :: sf1.e.size = alpha
  663. %^ tag-mp-pelt %op4-sf1-e-size-1
  664. %+ mpscal-pelt (v %op4)
  665. (mpsub-pelt (w %sf1-e-size) alf)
  666. ::
  667. :: sf1.e.dyck = 0
  668. %^ tag-mp-pelt %op4-sf1-e-size-1
  669. %+ mpscal-pelt (v %op4)
  670. (w %sf1-e-dyck)
  671. ::
  672. :: sf1_s = s
  673. %+ ion-equal
  674. [%op4-sf1-s-s %sf1-s %s (v %op4)]
  675. ::
  676. :: sf1_f = f_t
  677. %+ ion-equal
  678. [%op4-sf1-f-f-t %sf1-f %f-t (v %op4)]
  679. ::
  680. :: Opcode 5
  681. ::
  682. :: e.size = alpha
  683. %^ tag-mp-pelt %op5-e-size-1
  684. %+ mpscal-pelt (v %op5)
  685. (mpsub-pelt (w %e-size) alf)
  686. ::
  687. :: e.dyck = 0
  688. %^ tag-mp-pelt %op5-e-dyck-0
  689. %+ mpscal-pelt (v %op5)
  690. (w %e-dyck)
  691. ::
  692. :: (1 - e.leaf) * (sf1.e.size - sf2.e.size) = 0
  693. %^ tag-mp-pelt %op5-e-leaf-sf1-size
  694. %+ mpscal-pelt (v %op5)
  695. %+ mpmul-pelt
  696. (mpsub-pelt one-pelt (w %e-leaf))
  697. (mpsub-pelt (w %sf1-e-size) (w %sf2-e-size))
  698. ::
  699. :: (1 - e.leaf) * (sf1.e.dyck - sf2.e.dyck) = 0
  700. %^ tag-mp-pelt %op5-e-leaf-sf1-dyck
  701. %+ mpscal-pelt (v %op5)
  702. %+ mpmul-pelt
  703. (mpsub-pelt one-pelt (w %e-leaf))
  704. (mpsub-pelt (w %sf1-e-dyck) (w %sf2-e-dyck))
  705. ::
  706. :: (1 - e.leaf) * (sf1.e.leaf - sf2.e.leaf) = 0
  707. %^ tag-mp-pelt %op5-e-leaf-sf1-leaf
  708. %+ mpscal-pelt (v %op5)
  709. %+ mpmul-pelt
  710. (mpsub-pelt one-pelt (w %e-leaf))
  711. (mpsub-pelt (w %sf1-e-leaf) (w %sf2-e-leaf))
  712. ::
  713. :: e.leaf * (1 - e.leaf) = 0
  714. %^ tag-mp-pelt %op5-e-leaf-binary
  715. %+ mpscal-pelt (v %op5)
  716. %+ mpmul-pelt (w %e-leaf)
  717. (mpsub-pelt one-pelt (w %e-leaf))
  718. ::
  719. :: sf1_s = s
  720. %+ ion-equal
  721. [%op5-sf1-s-s %sf1-s %s (v %op5)]
  722. ::
  723. :: sf1_f = f-th
  724. %+ ion-equal
  725. [%op5-sf1-f-f-th %sf1-f %f-th (v %op5)]
  726. ::
  727. :: sf2_s = s
  728. %+ ion-equal
  729. [%op5-sf2-s-s %sf2-s %s (v %op5)]
  730. ::
  731. :: sf2_f = f-tt
  732. %+ ion-equal
  733. [%op5-sf2-f-f-tt %sf2-f %f-tt (v %op5)]
  734. ::
  735. ::
  736. :: Opcode 6
  737. ::
  738. :: sf1_s = s
  739. %+ ion-equal
  740. [%op6-sf1-s-s %sf1-s %s (v %op6)]
  741. ::
  742. :: sf1.f = sf2-e.leaf * f-ttt + (1 - sf2-e.leaf) * f-tth
  743. %^ tag-mp-pelt %op6-sf1-f-e-leaf-tth-size
  744. %+ mpscal-pelt (v %op6)
  745. %+ mpsub-pelt
  746. (w %sf1-f-size)
  747. %+ mpadd-pelt
  748. (mpmul-pelt (w %sf2-e-leaf) (w %f-ttt-size))
  749. (mpmul-pelt (mpsub-pelt one-pelt (w %sf2-e-leaf)) (w %f-tth-size))
  750. ::
  751. %^ tag-mp-pelt %op6-sf1-f-e-leaf-tth-leaf
  752. %+ mpscal-pelt (v %op6)
  753. %+ mpsub-pelt
  754. (w %sf1-f-leaf)
  755. %+ mpadd-pelt
  756. (mpmul-pelt (w %sf2-e-leaf) (w %f-ttt-leaf))
  757. (mpmul-pelt (mpsub-pelt one-pelt (w %sf2-e-leaf)) (w %f-tth-leaf))
  758. ::
  759. %^ tag-mp-pelt %op6-sf1-f-e-leaf-tth-dyck
  760. %+ mpscal-pelt (v %op6)
  761. %+ mpsub-pelt
  762. (w %sf1-f-dyck)
  763. %+ mpadd-pelt
  764. (mpmul-pelt (w %sf2-e-leaf) (w %f-ttt-dyck))
  765. (mpmul-pelt (mpsub-pelt one-pelt (w %sf2-e-leaf)) (w %f-tth-dyck))
  766. ::
  767. :: sf1-e = e
  768. %+ ion-equal
  769. [%op6-sf1-e-e %sf1-e %e (v %op6)]
  770. ::
  771. :: sf2-e.size = alpha
  772. %^ tag-mp-pelt %op6-sf2-e-size-1
  773. %+ mpscal-pelt (v %op6)
  774. (mpsub-pelt (w %sf2-e-size) alf)
  775. ::
  776. :: sf2-e.dyck = 0
  777. %^ tag-mp-pelt %op6-sf2-e-dyck-0
  778. %+ mpscal-pelt (v %op6)
  779. (w %sf2-e-dyck)
  780. ::
  781. :: sf2.e.leaf * (1 - sf2.e.leaf) = 0
  782. %^ tag-mp-pelt %op6-sf2-e-leaf-binary
  783. %+ mpscal-pelt (v %op6)
  784. %+ mpmul-pelt (w %sf2-e-leaf)
  785. (mpsub-pelt one-pelt (w %sf2-e-leaf))
  786. ::
  787. :: sf2_s = s
  788. %+ ion-equal
  789. [%op6-sf2-e-s %sf2-s %s (v %op6)]
  790. ::
  791. :: sf2_f = f-th
  792. %+ ion-equal
  793. [%op6-sf2-f-f-th %sf2-f %f-th (v %op6)]
  794. ::
  795. ::
  796. :: Opcode 7
  797. ::
  798. :: sf1-s = sf2-e
  799. %+ ion-equal
  800. [%op7-sf1-s-sf2-e %sf1-s %sf2-e (v %op7)]
  801. ::
  802. :: sf1-f = f-tt
  803. %+ ion-equal
  804. [%op7-sf1-f-f-tt %sf1-f %f-tt (v %op7)]
  805. ::
  806. :: sf1-e = e
  807. %+ ion-equal
  808. [%op7-sf1-e-e %sf1-e %e (v %op7)]
  809. ::
  810. :: sf2-s = s
  811. %+ ion-equal
  812. [%op7-sf2-s-s %sf2-s %s (v %op7)]
  813. ::
  814. :: sf2-f = f-th
  815. %+ ion-equal
  816. [%op7-sf2-f-f-th %sf2-f %f-th (v %op7)]
  817. ::
  818. ::
  819. :: Opcode 8
  820. ::
  821. :: sf1_s = cons(sf2-e, s)
  822. ::
  823. %+ make-cons
  824. :* %op8-cons
  825. %sf1-s %sf2-e %s
  826. (v %op8)
  827. ==
  828. ::
  829. :: sf1-f = f-tt
  830. %+ ion-equal
  831. [%op8-sf1-f-f-tt %sf1-f %f-tt (v %op8)]
  832. ::
  833. :: sf1-e = e
  834. %+ ion-equal
  835. [%op8-sf1-e-e %sf1-e %e (v %op8)]
  836. ::
  837. :: sf2-s = s
  838. %+ ion-equal
  839. [%op8-sf2-s-s %sf2-s %s (v %op8)]
  840. ::
  841. :: sf2-f = f-th
  842. %+ ion-equal
  843. [%op8-sf2-f-f-th %sf2-f %f-th (v %op8)]
  844. ::
  845. ::
  846. :: Opcode 9 (autocons)
  847. :: sf1 s = cons(sf2 e,s)
  848. ::
  849. :: e = cons(sf1-e, sf2-e)
  850. %+ make-cons
  851. :* %op9-cons
  852. %e %sf1-e %sf2-e
  853. (v %op9)
  854. ==
  855. ::
  856. :: sf1-s = s
  857. %+ ion-equal
  858. [%autocons-sf1-s-s %sf1-s %s (v %op9)]
  859. ::
  860. :: sf1-f = f-h
  861. %+ ion-equal
  862. [%autocons-sf1-f-f-h %sf1-f %f-h (v %op9)]
  863. ::
  864. :: sf2-s = s
  865. %+ ion-equal
  866. [%autocons-sf2-s-s %sf2-s %s (v %op9)]
  867. ::
  868. :: sf2-f = f-t
  869. %+ ion-equal
  870. [%autocons-sf2-f-f-t %sf2-f %f-t (v %op9)]
  871. ::
  872. ::
  873. :: for nock 0, %sfcons-inv must be inverse of (f-t-leaf - 1)
  874. %^ tag-mp-pelt %gen-nock-0-1
  875. %+ mpscal-pelt (v %op0)
  876. %+ mpmul-pelt
  877. (w %sfcons-inv)
  878. %- mpsub-pelt
  879. :_ one-pelt
  880. %+ mpmul-pelt
  881. (w %sfcons-inv)
  882. (mpsub-pelt (w %f-t-leaf) one-pelt)
  883. ::
  884. %^ tag-mp-pelt %gen-nock-0-2
  885. %+ mpscal-pelt (v %op0)
  886. %+ mpmul-pelt
  887. (mpsub-pelt (w %f-t-leaf) one-pelt)
  888. %- mpsub-pelt
  889. :_ one-pelt
  890. %+ mpmul-pelt
  891. (w %sfcons-inv)
  892. (mpsub-pelt (w %f-t-leaf) one-pelt)
  893. ::
  894. :: for nock 3, %gen must be inverse of (alpha - sf1-e-size)
  895. ::
  896. %^ tag-mp-pelt %gen-nock-0-1
  897. %+ mpscal-pelt (v %op3)
  898. %+ mpmul-pelt
  899. (w %sfcons-inv)
  900. %- mpsub-pelt
  901. :_ one-pelt
  902. %+ mpmul-pelt
  903. (w %sfcons-inv)
  904. (mpsub-pelt alf (w %sf1-e-size))
  905. ::
  906. %^ tag-mp-pelt %gen-nock-0-2
  907. %+ mpscal-pelt (v %op3)
  908. %+ mpmul-pelt
  909. (mpsub-pelt alf (w %sf1-e-size))
  910. %- mpsub-pelt
  911. :_ one-pelt
  912. %+ mpmul-pelt
  913. (w %sfcons-inv)
  914. (mpsub-pelt alf (w %sf1-e-size))
  915. ::
  916. ::
  917. ::
  918. :: Padding constraints
  919. ::
  920. :: Every column that isn't a multiset or kv store must be 0 during padding
  921. :: (except %pad)
  922. ::
  923. %+ pd %op0
  924. %+ pd %op1
  925. %+ pd %op2
  926. %+ pd %op3
  927. %+ pd %op4
  928. %+ pd %op5
  929. %+ pd %op6
  930. %+ pd %op7
  931. %+ pd %op8
  932. %+ pd %op9
  933. %+ pd-pelt %s-size
  934. %+ pd-pelt %s-leaf
  935. %+ pd-pelt %s-dyck
  936. %+ pd-pelt %f-size
  937. %+ pd-pelt %f-leaf
  938. %+ pd-pelt %f-dyck
  939. %+ pd-pelt %e-size
  940. %+ pd-pelt %e-leaf
  941. %+ pd-pelt %e-dyck
  942. %+ pd-pelt %sf1-s-size
  943. %+ pd-pelt %sf1-s-leaf
  944. %+ pd-pelt %sf1-s-dyck
  945. %+ pd-pelt %sf1-f-size
  946. %+ pd-pelt %sf1-f-leaf
  947. %+ pd-pelt %sf1-f-dyck
  948. %+ pd-pelt %sf1-e-size
  949. %+ pd-pelt %sf1-e-leaf
  950. %+ pd-pelt %sf1-e-dyck
  951. %+ pd-pelt %sf2-s-size
  952. %+ pd-pelt %sf2-s-leaf
  953. %+ pd-pelt %sf2-s-dyck
  954. %+ pd-pelt %sf2-f-size
  955. %+ pd-pelt %sf2-f-leaf
  956. %+ pd-pelt %sf2-f-dyck
  957. %+ pd-pelt %sf2-e-size
  958. %+ pd-pelt %sf2-e-leaf
  959. %+ pd-pelt %sf2-e-dyck
  960. %+ pd-pelt %sf3-s-size
  961. %+ pd-pelt %sf3-s-leaf
  962. %+ pd-pelt %sf3-s-dyck
  963. %+ pd-pelt %sf3-f-size
  964. %+ pd-pelt %sf3-f-leaf
  965. %+ pd-pelt %sf3-f-dyck
  966. %+ pd-pelt %sf3-e-size
  967. %+ pd-pelt %sf3-e-leaf
  968. %+ pd-pelt %sf3-e-dyck
  969. %+ pd-pelt %f-h-size
  970. %+ pd-pelt %f-h-leaf
  971. %+ pd-pelt %f-h-dyck
  972. %+ pd-pelt %f-t-size
  973. %+ pd-pelt %f-t-leaf
  974. %+ pd-pelt %f-t-dyck
  975. %+ pd-pelt %f-th-size
  976. %+ pd-pelt %f-th-leaf
  977. %+ pd-pelt %f-th-dyck
  978. %+ pd-pelt %f-tt-size
  979. %+ pd-pelt %f-tt-leaf
  980. %+ pd-pelt %f-tt-dyck
  981. %+ pd-pelt %f-tth-size
  982. %+ pd-pelt %f-tth-leaf
  983. %+ pd-pelt %f-tth-dyck
  984. %+ pd-pelt %f-ttt-size
  985. %+ pd-pelt %f-ttt-leaf
  986. %+ pd-pelt %f-ttt-dyck
  987. %+ pd-pelt %fcons-inv
  988. ~
  989. ::
  990. ++ transition-constraints
  991. ^- (map term mp-ultra)
  992. :: name challenges
  993. =, chal
  994. =, constraint-util
  995. =/ r ~(r rnd:chal:chal (make-chal-mps:chal chal-names-all:chal))
  996. =/ a=mp-pelt (r %a)
  997. =/ b=mp-pelt (r %b)
  998. =/ c=mp-pelt (r %c)
  999. =/ d=mp-pelt (r %d)
  1000. =/ e=mp-pelt (r %e)
  1001. =/ f=mp-pelt (r %f)
  1002. =/ g=mp-pelt (r %g)
  1003. =/ j=mp-pelt (r %j)
  1004. =/ k=mp-pelt (r %k)
  1005. =/ l=mp-pelt (r %l)
  1006. =/ m=mp-pelt (r %m)
  1007. =/ n=mp-pelt (r %n)
  1008. =/ o=mp-pelt (r %o)
  1009. =/ ww=mp-pelt (r %w) :: ww to avoid name-shadowing
  1010. =/ x=mp-pelt (r %x)
  1011. =/ y=mp-pelt (r %y)
  1012. =/ alf=mp-pelt (r %alf) :: ion
  1013. =/ bet=mp-pelt (r %bet) :: multiset
  1014. =/ gam=mp-pelt (r %gam)
  1015. =/ z=mp-pelt (r %z) :: kv store
  1016. =/ z2=mp-pelt (mpmul-pelt z z)
  1017. =/ z3=mp-pelt (mpmul-pelt z2 z)
  1018. =/ pd zero-during-padding
  1019. ::
  1020. %- ~(gas by *(map col-name mp-ultra))
  1021. ::
  1022. :: Indexing & Selector Constraints
  1023. ::
  1024. :: In order to keep track of the number of observed opcodes and total number of rows,
  1025. :: the transition function between rows i and i + 1 requires the following to always hold:
  1026. ::
  1027. %^ tag-mp-pelt %ln-inc
  1028. %+ mpscal-pelt (mpsub one (v %pad))
  1029. (mpsub-pelt (w-n %ln) (mpmul-pelt (w %ln) z))
  1030. ::
  1031. :: if %pad is 1 then %lnc must count down instead of up
  1032. %^ tag-mp-pelt %ln-dec
  1033. %+ mpscal-pelt (v %pad)
  1034. (mpsub-pelt (w %ln) (mpmul-pelt (w-n %ln) z))
  1035. ::
  1036. :: once %pad is 1 it must stay 1
  1037. :: %pad * (%pad' - %pad) = 0
  1038. :- :- %pad-stay-one
  1039. %- lift-to-mega
  1040. (mpmul (v %pad) (mpsub (v %pad-n) (v %pad)))
  1041. ::
  1042. %^ tag-mp-pelt %opc-counter
  1043. %+ mpscal-pelt (mpsub one (v %pad))
  1044. %+ mpsub-pelt
  1045. (w-n %opc)
  1046. ;: mpadd-pelt
  1047. (mpscal-pelt (mpadd (v %op0) (v %op1)) (w %opc))
  1048. ::
  1049. %+ mpmul-pelt z
  1050. (mpscal-pelt (mpadd (v %op3) (v %op4)) (w %opc))
  1051. ::
  1052. %+ mpmul-pelt z2
  1053. %- mpscal-pelt
  1054. :_ (w %opc)
  1055. ;:(mpadd (v %op5) (v %op6) (v %op7) (v %op8) (v %op9))
  1056. ::
  1057. %+ mpmul-pelt z3
  1058. (mpscal-pelt (v %op2) (w %opc))
  1059. ==
  1060. ::
  1061. ::
  1062. :: KV Update Constraints
  1063. ::
  1064. :: Stack Update
  1065. :- :- %stack-update
  1066. =/ program
  1067. ;: mpadd-pelt
  1068. %+ mpmul-pelt d
  1069. ;: mpadd-pelt
  1070. (mpmul-pelt a (w %s-size))
  1071. (mpmul-pelt b (w %s-dyck))
  1072. (mpmul-pelt c (w %s-leaf))
  1073. ==
  1074. ::
  1075. %+ mpmul-pelt e
  1076. ;: mpadd-pelt
  1077. (mpmul-pelt a (w %f-size))
  1078. (mpmul-pelt b (w %f-dyck))
  1079. (mpmul-pelt c (w %f-leaf))
  1080. ==
  1081. ::
  1082. %+ mpmul-pelt f
  1083. ;: mpadd-pelt
  1084. (mpmul-pelt a (w %e-size))
  1085. (mpmul-pelt b (w %e-dyck))
  1086. (mpmul-pelt c (w %e-leaf))
  1087. ==
  1088. ==
  1089. ::
  1090. =/ sp1
  1091. ;: mpadd-pelt
  1092. %+ mpmul-pelt d
  1093. ;: mpadd-pelt
  1094. (mpmul-pelt a (w %sf1-s-size))
  1095. (mpmul-pelt b (w %sf1-s-dyck))
  1096. (mpmul-pelt c (w %sf1-s-leaf))
  1097. ==
  1098. ::
  1099. %+ mpmul-pelt e
  1100. ;: mpadd-pelt
  1101. (mpmul-pelt a (w %sf1-f-size))
  1102. (mpmul-pelt b (w %sf1-f-dyck))
  1103. (mpmul-pelt c (w %sf1-f-leaf))
  1104. ==
  1105. ::
  1106. %+ mpmul-pelt f
  1107. ;: mpadd-pelt
  1108. (mpmul-pelt a (w %sf1-e-size))
  1109. (mpmul-pelt b (w %sf1-e-dyck))
  1110. (mpmul-pelt c (w %sf1-e-leaf))
  1111. ==
  1112. ==
  1113. ::
  1114. =/ sp2
  1115. ;: mpadd-pelt
  1116. %+ mpmul-pelt d
  1117. ;: mpadd-pelt
  1118. (mpmul-pelt a (w %sf2-s-size))
  1119. (mpmul-pelt b (w %sf2-s-dyck))
  1120. (mpmul-pelt c (w %sf2-s-leaf))
  1121. ==
  1122. ::
  1123. %+ mpmul-pelt e
  1124. ;: mpadd-pelt
  1125. (mpmul-pelt a (w %sf2-f-size))
  1126. (mpmul-pelt b (w %sf2-f-dyck))
  1127. (mpmul-pelt c (w %sf2-f-leaf))
  1128. ==
  1129. ::
  1130. %+ mpmul-pelt f
  1131. ;: mpadd-pelt
  1132. (mpmul-pelt a (w %sf2-e-size))
  1133. (mpmul-pelt b (w %sf2-e-dyck))
  1134. (mpmul-pelt c (w %sf2-e-leaf))
  1135. ==
  1136. ==
  1137. ::
  1138. =/ sp3
  1139. ;: mpadd-pelt
  1140. %+ mpmul-pelt d
  1141. ;: mpadd-pelt
  1142. (mpmul-pelt a (w %sf3-s-size))
  1143. (mpmul-pelt b (w %sf3-s-dyck))
  1144. (mpmul-pelt c (w %sf3-s-leaf))
  1145. ==
  1146. ::
  1147. %+ mpmul-pelt e
  1148. ;: mpadd-pelt
  1149. (mpmul-pelt a (w %sf3-f-size))
  1150. (mpmul-pelt b (w %sf3-f-dyck))
  1151. (mpmul-pelt c (w %sf3-f-leaf))
  1152. ==
  1153. ::
  1154. %+ mpmul-pelt f
  1155. ;: mpadd-pelt
  1156. (mpmul-pelt a (w %sf3-e-size))
  1157. (mpmul-pelt b (w %sf3-e-dyck))
  1158. (mpmul-pelt c (w %sf3-e-leaf))
  1159. ==
  1160. ==
  1161. ::
  1162. =/ com
  1163. %- mpsub-pelt
  1164. :_ (w-n %stack-kv)
  1165. %- mpsub-pelt
  1166. :_ (mpmul-pelt [(mp-com 0) (mp-com 1) (mp-com 2)] (w %ln))
  1167. ;: mpadd-pelt
  1168. (w %stack-kv)
  1169. ::
  1170. %+ mpscal-pelt
  1171. ;: mpadd
  1172. (v %op2) (v %op3) (v %op4) (v %op5)
  1173. (v %op6) (v %op7) (v %op8) (v %op9)
  1174. ==
  1175. ;: mpmul-pelt
  1176. [(mp-com 3) (mp-com 4) (mp-com 5)]
  1177. (w %opc)
  1178. z
  1179. ==
  1180. ::
  1181. %+ mpscal-pelt
  1182. :(mpadd (v %op2) (v %op5) (v %op6) (v %op7) (v %op8) (v %op9))
  1183. ;: mpmul-pelt
  1184. [(mp-com 6) (mp-com 7) (mp-com 8)]
  1185. (w %opc)
  1186. z2
  1187. ==
  1188. ::
  1189. %+ mpscal-pelt (v %op2)
  1190. ;: mpmul-pelt
  1191. [(mp-com 9) (mp-com 10) (mp-com 11)]
  1192. (w %opc)
  1193. z3
  1194. ==
  1195. ==
  1196. ::
  1197. :+ %comp
  1198. :~ a.program b.program c.program
  1199. a.sp1 b.sp1 c.sp1
  1200. a.sp2 b.sp2 c.sp2
  1201. a.sp3 b.sp3 c.sp3
  1202. ==
  1203. ~[a.com b.com c.com]
  1204. ::
  1205. :: decode mset multiset evolution
  1206. :- :- %decode-multiset-update
  1207. =/ make-val
  1208. |= [node=term hed=term tal=term]
  1209. %- ~(compress poly-tupler-pelt ~[j k l m n o ww x y])
  1210. :~ (w (crip (weld (trip node) "-size")))
  1211. (w (crip (weld (trip node) "-dyck")))
  1212. (w (crip (weld (trip node) "-leaf")))
  1213. (w (crip (weld (trip hed) "-size")))
  1214. (w (crip (weld (trip hed) "-dyck")))
  1215. (w (crip (weld (trip hed) "-leaf")))
  1216. (w (crip (weld (trip tal) "-size")))
  1217. (w (crip (weld (trip tal) "-dyck")))
  1218. (w (crip (weld (trip tal) "-leaf")))
  1219. ==
  1220. =/ f-decode-val (mpsub-pelt gam (make-val %f %f-h %f-t))
  1221. =/ f-t-decode-val (mpsub-pelt gam (make-val %f-t %f-th %f-tt))
  1222. =/ f-tt-decode-val (mpsub-pelt gam (make-val %f-tt %f-tth %f-ttt))
  1223. =/ com
  1224. %+ mpsub-pelt
  1225. ;: mpmul-pelt
  1226. (mpsub-pelt (w-n %decode-mset) (w %decode-mset))
  1227. [(mp-com 0) (mp-com 1) (mp-com 2)]
  1228. [(mp-com 3) (mp-com 4) (mp-com 5)]
  1229. [(mp-com 6) (mp-com 7) (mp-com 8)]
  1230. ==
  1231. ;: mpadd-pelt
  1232. %+ mpscal-pelt (mpsub one (v %pad))
  1233. (mpmul-pelt [(mp-com 3) (mp-com 4) (mp-com 5)] [(mp-com 6) (mp-com 7) (mp-com 8)])
  1234. ::
  1235. %+ mpscal-pelt :(mpadd (v %op2) (v %op5) (v %op6) (v %op7) (v %op8))
  1236. (mpmul-pelt [(mp-com 0) (mp-com 1) (mp-com 2)] [(mp-com 6) (mp-com 7) (mp-com 8)])
  1237. ::
  1238. %+ mpscal-pelt (v %op6)
  1239. (mpmul-pelt [(mp-com 0) (mp-com 1) (mp-com 2)] [(mp-com 3) (mp-com 4) (mp-com 5)])
  1240. ==
  1241. :+ %comp
  1242. :~ a.f-decode-val b.f-decode-val c.f-decode-val
  1243. a.f-t-decode-val b.f-t-decode-val c.f-t-decode-val
  1244. a.f-tt-decode-val b.f-tt-decode-val c.f-tt-decode-val
  1245. ==
  1246. ~[a.com b.com c.com]
  1247. ::
  1248. ::
  1249. ::
  1250. ::
  1251. :: op0 mset multiset constraints
  1252. ::
  1253. :: (these are all done in one constraint but broken up here for readability)
  1254. ::
  1255. :: mroot = op0 * (a*s.size + b*s.dyck + c*s.leaf)
  1256. :: maxis = op0 * d * f-t.leaf
  1257. :: mval = op0 * (alf * e.size + bet * e.dyck + gam * e.leaf)
  1258. :: mvar = mroot + maxis + mval
  1259. :: (op0_mset' - op0_mset)(z-mvar) = op0(i)
  1260. ::
  1261. %^ tag-mp-pelt %op0-multiset-update
  1262. =/ mroot
  1263. ;: mpadd-pelt
  1264. (mpmul-pelt a (w %s-size))
  1265. (mpmul-pelt b (w %s-dyck))
  1266. (mpmul-pelt c (w %s-leaf))
  1267. ==
  1268. =/ maxis
  1269. (mpmul-pelt d (w %f-t-leaf))
  1270. =/ mval
  1271. ;: mpadd-pelt
  1272. (mpmul-pelt e (w %e-size))
  1273. (mpmul-pelt f (w %e-dyck))
  1274. (mpmul-pelt g (w %e-leaf))
  1275. ==
  1276. =/ mvar
  1277. :(mpadd-pelt mroot maxis mval)
  1278. ::
  1279. %+ mpscal-pelt (v %op0)
  1280. %+ mpmul-pelt
  1281. (mpsub-pelt one-pelt (w %f-t-leaf))
  1282. %- mpsub-pelt
  1283. :_ one-pelt
  1284. %+ mpmul-pelt
  1285. (mpsub-pelt (w-n %op0-mset) (w %op0-mset))
  1286. (mpsub-pelt bet mvar)
  1287. ::
  1288. %^ tag-mp-pelt %op0-multiset-no-update
  1289. %+ mpmul-pelt
  1290. %+ mpadd-pelt
  1291. (lift-to-mp-pelt (mpsub one (v %op0)))
  1292. %+ mpsub-pelt one-pelt
  1293. %+ mpmul-pelt
  1294. (mpsub-pelt (w %f-t-leaf) one-pelt)
  1295. (w %sfcons-inv)
  1296. (mpsub-pelt (w-n %op0-mset) (w %op0-mset))
  1297. ::
  1298. ::
  1299. :: during padding, all the state stays the same (except for ln which counts down)
  1300. %^ tag-mp-pelt %opc-padding
  1301. %+ mpscal-pelt (v %pad)
  1302. (mpsub-pelt (w %opc) (w-n %opc))
  1303. ::
  1304. %^ tag-mp-pelt %stack-kv-padding
  1305. %+ mpscal-pelt (v %pad)
  1306. (mpsub-pelt (w %stack-kv) (w-n %stack-kv))
  1307. ::
  1308. %^ tag-mp-pelt %decode-mset-padding
  1309. %+ mpscal-pelt (v %pad)
  1310. (mpsub-pelt (w %decode-mset) (w-n %decode-mset))
  1311. ::
  1312. %^ tag-mp-pelt %op0-mset-padding
  1313. %+ mpscal-pelt (v %pad)
  1314. (mpsub-pelt (w %op0-mset) (w-n %op0-mset))
  1315. ~
  1316. --
  1317. --
  1318. --