Systems for symbolic event recognition accept as input a stream of time-stamped events from sensors and other computational devices, and seek to identify high-level composite events, collections of events that satisfy some pattern. RTEC is an Event Calculus dialect with novel implementation and windowing techniques that allow for efficient event recognition, scalable to large data streams. RTEC supports the expression of rather complex events, such as two people are fighting, using simple primitives. It can operate in the absence of filtering modules, as it is only slightly affected by data that are irrelevant to the events we want to recognise. Furthermore, RTEC can deal with applications where event data arrive with a (variable) delay from, and are revised by, the underlying sources. RTEC can update already recognised events and recognise new events when data arrive with a delay or following data revision. We evaluate RTEC both theoretically, presenting a complexity analysis, and experimentally, using two real-world applications. The evaluation shows that RTEC can support real-time event recognition and is capable of meeting the performance requirements identified in a survey of event processing use cases.