compute.hoon 38 KB

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