(define (make-search-problem low high)

  (define (loop i j k)
    (apply make-node
	   (list i j k)
	   (= (+ (square i) (square j))
	      (square k))
	   (collect (link (+ i 1) j k)
		    (link (- i 1) j k)
		    (link i (+ j 1) k)
		    (link i (- j 1) k)
		    (link i j (+ k 1))
		    (link i j (- k 1)))))

  (define (collect . links)
    (keep-matching-items links (lambda (x) x)))

  (define (link i j k)
    (if (and (<= low i high)
	     (<= low j high)
	     (<= low k high))
	(make-link (lambda () (loop i j k))
		   (- (abs (- (+ (square i)
				 (square j))
			      (square k)))))
	#f))

  (let ((n (quotient (+ low high 1) 2)))
    (loop n n n)))

(define (my-loop-avoidance-filter)
  (let ((table (make-equal-hash-table)))
    (lambda (node)
      (let ((key (node-name node)))
	(if (hash-table/get table key #f)
	    #f
	    (begin
	      (hash-table/put! table key #t)
	      node))))))