    (fail? (unifyc (get-in parent [:head :synsem :subcat :2] :top)
                   (get-in child [:synsem :subcat :2] :top)))))
 
+(def comp-precheck-pairs
+  [{:parent [:comp :synsem :cat]
+    :childc [:synsem :cat]}
+
+   {:parent [:comp :synsem :agr]
+    :childc [:synsem :agr]}
+
+   {:parent [:comp :synsem :case]
+    :childc [:synsem :case]}
+
+   {:parent [:comp :synsem :sem]
+    :childc [:synsem :sem]}
+   
+   {:parent [:comp :synsem :reflexive]
+    :childc [:synsem :reflexive]}
+
+   {:parent [:comp :synsem :pronoun]
+    :childc [:synsem :pronoun]}
+
+   {:parent [:comp :synsem :subcat]
+    :childc [:synsem :subcat]}])
+
 (defn comp-pre-checks [parent child]
   (or
    (fail? (unifyc (get-in parent [:comp :synsem :cat] :top)

;; 2) called with both a child1 and a child2, but child2's supplied value is nil:
;;    should be treated the same as empty list.
(defn over [parents child1 & [child2]]
  (cond (vector? child1)
        (over parents (seq child1) child2)


              (log/debug (str "over: parent: " (get-in parent [:rule]) " with schema symbol: " (get-in parent [:schema-symbol])))
              (if (= (:first parent) :head)
                ;; else, head is left child.
                (do (log/debug "over: left child (head):" (strip-refs child1))
                    (log/debug "over: right child (comp):" (strip-refs child2)))
                ;; else, head is right child.
                (do (log/debug "over: left child (comp):" (strip-refs child1))
                    (log/debug "over: right child (head):" (strip-refs child2))))

              (concat
               ;; if parent is map, do introspection: figure out the schema from the :schema-symbol attribute,
