static Set philosophyBot_allPartsOfLHS(PhilosophyBot1.LogicRule rule) { new Set out; philosophyBot_allPartsOfLHS_collect(rule, out); ret out; } svoid philosophyBot_allPartsOfLHS_collect(O o, Set out) { if (!out.add(o)) ret; if (o cast PhilosophyBot1.LogicRule) { philosophyBot_allPartsOfLHS_collect(o.lhs, out); O rhs = o.rhs; if (rhs cast PhilosophyBot1.LogicRule) philosophyBot_allPartsOfLHS_collect(rhs, out); } if (o cast PhilosophyBot1.And) { philosophyBot_allPartsOfLHS_collect(o.a, out); philosophyBot_allPartsOfLHS_collect(o.b, out); } }