+
+ (define (get-bindings product-types pattern)
+ (define (go product-type product)
+ (case (ast-type product)
+ ['var (list (cons product product-type))]
+ ; an inner pattern match
+ ['app (let* ([inner-sum (car product)]
+ [inner-sums (cdr (assoc product-type dls))]
+ [inner-product-types (cdr (assoc inner-sum inner-sums))])
+ (get-bindings inner-product-types product))]
+ [else '()]))
+ (flat-map go product-types (cdr pattern)))
+
+