record perseq(pre, rep) procedure repeater(seq, ratio, limit) #: find repeat in sequence local init, i, prefix, results, segment, span /ratio := 2 /limit := 0.75 results := copy(seq) prefix := [] repeat { span := *results / ratio every i := 1 to span do { segment := results[1+:i] | next if lequiv(lextend(segment, *results), results) then return perseq(prefix, segment) } put(prefix, get(results)) | # first term to prefix return perseq(prefix, results) if *prefix > limit * *seq then return perseq(seq, []) } end