                                           complement-candidate-lexemes))))
                
         bolt-child-synsem (get-in bolt (concat path [:synsem]))
-        lexical-complements (shuffle
+        lexical-complements (lazy-seq
+                             (shuffle
                              (filter (fn [lexeme]
                                        (and (not-fail? (unify (get-in lexeme [:synsem] :top)
                                                               bolt-child-synsem))))
-                                     complement-candidate-lexemes))]
+                                     complement-candidate-lexemes)))]
     (log/debug (str "lexical-complements (post-over):"
                     (string/join ","
                                  (map #((:morph language-model) %)

        ;; total-depth, on the other hand, is the depth all the way to the top of the entire
        ;; expression, which might involve several parent lightning bolts.
        parents
        (let [parents (shuffle (candidate-parents grammar spec))]
          (log/trace (str "lightning-bolts: candidate-parents:" (string/join "," (map :rule parents))))
          parents)]
    ;; TODO: use (defn get-lexemes) rather than this code which duplicates (get-lexemes)'s functionality.

                                  (log/trace (str "trying parent: " (:rule parent) " with lexical head:"
                                                  ((:morph language-model) %)))
                                  (over/overh parent %))
                               (lazy-seq (shuffle subset)))]
                   (if (and (not (empty? subset)) (empty? result)
                            (> (count subset)
                               50))
