examples/combinators.ss
;"one point basis"
;"formal aspects of computing"

(module combinators mzscheme
  (require "../reduction-semantics.ss"
           "../gui.ss")
  
  (initial-font-size 12)
  (reduction-steps-cutoff 100)
  (initial-char-width 80)
  
  (define lang
    (language 
     (e (e e)
        comb
        abs1
        abs2
        abs3)
     (e-ctxt (e e-ctxt)
             (e-ctxt e)
             hole)
     (comb i
           j
           b
           c
           c*
           w)))
  
  (define ij-reductions
    (list
     (reduction/context lang
                        e-ctxt
                        (i e_1)
                        (term e_1))
     (reduction/context lang
                        e-ctxt
                        ((((j e_a) e_b) e_c) e_d)
                        (term ((e_a e_b) ((e_a e_d) e_c))))))
  
  (define reductions
    (append
     ij-reductions
     (list
      (reduction/context lang
                         e-ctxt
                         (((b e_m) e_n) e_l)
                         (term (e_m (e_n e_l))))
      (reduction/context lang
                         e-ctxt
                         (((c e_m) e_n) e_l)
                         (term ((e_m e_l) e_n)))
      (reduction/context lang
                         e-ctxt
                         ((c* e_a) e_b)
                         (term (e_b e_a)))
      (reduction/context lang
                         e-ctxt
                         ((w e_a) e_b)
                         (term ((e_a e_b) e_b))))))

  
  (define c* `((j i) i))
  (define (make-c c*) `(((j ,c*) (j ,c*)) (j ,c*)))
  (define (make-b c) `((,c ((j i) ,c)) (j i)))
  (define (make-w b c c*) `(,c ((,c ((,b ,c) ((,c ((,b j) ,c*)) ,c*))) ,c*)))
  (define (make-s b c w) `((,b ((,b (,b ,w)) ,c)) (,b ,b)))

  (traces/multiple lang
                reductions
                (list 
                 `((,c* abs1) abs2)
                 `(((,(make-c 'c*) abs1) abs2) abs3)
                 `(((,(make-b 'c) abs1) abs2) abs3)
                 `((,(make-w 'b 'c 'c*) abs1) abs2)
                 `(((,(make-s 'b 'c 'w) abs1) abs2) abs3)))
  
  ;; s in terms of i and j ( > 18,000 reductions and probably still long way to go)
  '(traces lang ij-reductions
       (make-s (make-b (make-c c*))
               (make-c c*)
               (make-w (make-b (make-c c*))
                       (make-c c*)
                       c*))))