@Empty[xs]: xs = End; @Element[x, xs]: ?xs_: (xs = Node[x, xs_] | (?x_: (xs = Node[x_, xs_] & @Element[x, xs_]))); @Subset[xs, ys]: xs = End | (?x_: ?xs_: (xs = Node[x_, xs_] & @Element[x_, ys] & @Subset[xs_, ys])); @Join[xs, ys, zs]: (xs = End & ys = zs) | (?h: ?xs_: ?zs_: (xs = Node[h, xs_] & zs = Node[h, zs_] & @Join[xs_, ys, zs_]));