protected override string VisitAnd(And a) { return("(" + Visit(a.Left) + " & " + Visit(a.Right) + ")"); }
protected abstract R VisitAnd(And a);
protected override bool VisitAnd(And a) { return(Visit(a.Left) && Visit(a.Right)); }