    matcher key-matches-with-binding-clause-matcher
    binding key-matches-with-binding-clause-binding])
 
-(define-record-type
-  ^{:doc "A clause that matches the value of `key` of a map using `matcher`."}
-  KeyMatchesWithoutBindingClause
-  (make-key-matches-without-binding-clause key matcher)
-  key-matches-without-binding-clause?
-  [key key-matches-without-binding-clause-key
-   matcher key-matches-without-binding-clause-matcher])
+(defn key-matches-without-binding-clause
+  "Returns a clause that matches a `key` with a certain `matcher`."
+  [key matcher]
+  {:pre [(matcher? matcher)]}
+  (make-key-matches-without-binding-clause key matcher))
 
 (defn key-matches-with-binding-clause
   "Returns a clause that matches a `key` with a certain `matcher`, binding the

(defn clause->rhs
  [message bindings clause]
  (cond
    (key-exists-with-binding-clause? clause)
    (conj bindings (key-exists-with-binding-clause->rhs-match message clause))

    (key-exists-without-binding-clause? clause)
    (conj bindings `[])

    (path-exists-with-binding-clause? clause)
    (conj bindings (path-exists-with-binding-clause->rhs-match message clause))

    (path-exists-without-binding-clause? clause)
    (conj bindings `[])

    (key-matches-with-binding-clause? clause)
    (conj bindings (key-matches-with-binding-clause->rhs-match message clause))

    (key-matches-without-binding-clause? clause)
    (conj bindings `[])

    (path-matches-with-binding-clause? clause)
    (conj bindings (path-matches-with-binding-clause->rhs-match message clause))

    (path-matches-without-binding-clause? clause)
    (conj bindings `[])

    (optional-clause? clause)
    (clause->rhs message bindings (optional-clause-clause clause))))

   matcher path-matches-with-binding-clause-matcher
   binding path-matches-with-binding-clause-binding])

(def path? "Is something a valid path?" (some-fn list? vector?))

(defn path-matches-without-binding-clause
  [path matcher]
  {:pre [(and (path? path) (matcher? matcher))]}
  (make-path-matches-without-binding-clause path matcher))

(defn path-matches-with-binding-clause
  [path matcher bind]
  {:pre [(and (path? path) (matcher? matcher))]}
  (make-path-matches-with-binding-clause path matcher bind))

;; 5.
(define-record-type
