#lang racket (require redex "subst.rkt") ;; ------------------------------------------------------------------ ;; SYNTAX (define-language Lam (e x (λ (x ...) e) (e e ...)) (x variable-not-otherwise-mentioned)) (define-extended-language Lam-cbv Lam (v x (λ (x ...) e)) (E hole (v ... E e ...))) ;; ------------------------------------------------------------------ ;; REDUCTION : Call by Value (define ->v (reduction-relation Lam-cbv #:domain e (--> (in-hole E ((λ (x ..._c) e_body) v ..._c)) (in-hole E (subst-n (x v) ... e_body))))) #;(define ->v (reduction-relation Lam-cbv #:domain e (--> (in-hole E ((λ (x x_r ...) e_body) v v_r ...)) (in-hole E (subst-n (x v) ((λ (x_r ...) e_body) v_r ...)))) (--> (in-hole E ((λ () e_body))) (in-hole E e_body)))) #;(define ->v (reduction-relation Lam-cbv #:domain e (r ((λ (x ..._c) e_body) v ..._c) (subst-n (x v) ... e_body)) with [(--> (in-hole E e_1) (in-hole E e_2)) (r e_1 e_2)])) ;; ------------------------------------------------------------------ ;; TESTS (module+ test (test-equal (apply-reduction-relation* ->v (term ((λ (x) w) z))) (list (term w))) (test-equal (apply-reduction-relation* ->v (term (((λ (x) (λ (y) x)) w) z))) (list (term w))) (define example (term (((λ (x) (λ (y) (x y))) (λ (z) y)) w))) (test-equal (apply-reduction-relation* ->v example) (list (term y))) (define omega (term ((λ (x) (x x)) (λ (x) (x x))))) ;(apply-reduction-relation* ->v example) ;(traces ->v omega) (define strange (term ((λ (x) x) a b))) (apply-reduction-relation* ->v strange) )