(define (alt-graph-match G1 G2 gteq? semantic-feasibility?) (let match-loop ([s (make-set)]) (cond [(set= (set-map cdr s) (graph-vertices G2)) s] [else (lazy-flatten (lazy-seq (let candidate-loop ([c-pairs (candidate-pairs G1 G2 s)] [matchings (lazy-seq '())]) (if (null? c-pairs) matchings (let ([n (caar c-pairs)] [m (cdar c-pairs)]) (if (and (syntactic-feasibility? G1 G2 s n m gteq?) (semantic-feasibility? G1 G2 s n m)) (candidate-loop (cdr c-pairs) (lazy-seq (cons (match-loop (set-union s (set (cons n m)))) matchings))) (candidate-loop (cdr c-pairs) matchings)))))))])))