if type(x) == type(y) == "list" then {
if not eq(x[i],y[i]) then fail
every count <:= 1 + depth(ltree[2 to *ltree])
procedure ldag(stree,done)
if a := \done[stree] then return a
if a := [tab(upto('('))] then {
while put(a,ldag(tab(bal(',)')),done)) do
local nodes, ndescr, nlist, a, name, i
while ndescr := tab(many(~';')) do {
nodes[tab(upto(':'))] := a
while put(a,tab(many(~','))) do
name[i] := nodes[name[i]]
if a := [tab(upto('('))] then {
while put(a,ltree(tab(bal(',)')))) do
if *ltree = 1 then return ltree[1]
every s ||:= stree(ltree[2 to *ltree]) || ","
every put(a,tcopy(ltree[2 to *ltree]))
if a1[1] ~== a2[1] then fail
if not teq(a1[i],a2[i]) then fail
suspend ltree | visit(ltree[2 to *ltree])