// datalog \e 1 \l unify read:{program@0::[".d"~-2#x;x;x,".d"]} program:{(clause . parts blanks uncomment@)'x} query:{:[#x;clause[();x]1;x]} split:{1_'(&x=y)_ x:y,x} dlb:{((x=" ")?0)_ x} dtb:|dlb@|: deb:{x@&~0&':x=" "} db:deb dlb dtb@ blanks:{_ssr/[x;"\t\n\r";" "]} uncomment:{(x?"%")#x} parts:{2#split[x;":"],,()} clause:{(*forms x;forms y)} forms:{:[#x;value'split[x;","];x]} value:{:["!"=*x;0#`;atom x nest x]} atom:{:[~4:x;_f'x _dv" ";@x;`$x;`$split[db x;" "]]} nest:{*{y . x}/[(();,0;0) ({(x;@[-1_ y;-2+#y;+;1];z+1)} {(.[x;-1_ y;,;z];@[y;-1+#y;+;1];z+1)} {(.[x;-1_ y;,;,!0];y,0;z+1)})1+-':0,depth x]} depth:-/+\'"[]"=\: eval:{[p;q]step[p;q;()]} step:{[p;q;u]:[#i:&~@:'v:p[;0]unify\:*q;?,/next[p]'[p[i;1],\:1_ q;v[i],\:u];u]} next:{[p;q;u]:[#q;step[p;apply/[q;u];u];,u]} if[#_i;p:read _i 0] eval[p;query"p X Y Z"]