procedure eq(x,y)
   local i
   if x === y then return y	# succeed if identical
   if type(x) == type(y) == "list" then {
      if *x ~= *y then fail	# check sizes
      every i := 1 to *x do	# check subtrees
         if not eq(x[i],y[i]) then fail
      return y
     }
end
