Guest User

Untitled

a guest
Jun 24th, 2018
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 2.71 KB | None | 0 0
  1. #lang racket
  2. (require redex)
  3.  
  4. ;; syntax
  5. (define-language Lambda0
  6.   (e x
  7.      n
  8.      (lambda (x τ) e)
  9.      (e e)
  10.      (op e e)
  11.      (fix e))
  12.   (n integer)
  13.   (τ Int
  14.      (τ -> τ))
  15.   (op + - *)
  16.   (x variable-not-otherwise-mentioned)
  17.   ; not surface syntax -- just used for type checking
  18.   (Γ (γ ...))
  19.   (γ (x τ)))
  20.  
  21. ;; type checking
  22. (define-judgment-form Lambda0
  23.   #:mode (type I I O)
  24.   #:contract (type Γ e τ)
  25.   [(type Γ n Int)]
  26.   [(type ( (x_0 τ_0) ... (x τ) (x_1 τ_1) ... ) x τ)]
  27.   [(type Γ e_1 Int) (type Γ e_2 Int)
  28.    ---
  29.    (type Γ (op e_1 e_2) Int)]
  30.   [(type (ext-type-env Γ (x τ_1)) e τ_2)
  31.    ----
  32.    (type Γ (lambda (x τ_1) e) (τ_1 -> τ_2))]
  33.   [(type Γ e_1 (τ_1 -> τ_2)) (type Γ e_2 τ_1)
  34.    ---
  35.    (type Γ (e_1 e_2) τ_2)]
  36.   [(type Γ e (τ -> τ))
  37.    ----
  38.    (type Γ (fix e) τ)])
  39.  
  40.  
  41.  
  42. ;; extend given type enviroment with new type binding
  43. (define-metafunction Lambda0
  44.   ext-type-env : Γ γ -> Γ
  45.   [(ext-type-env ((x_old τ_old) ...) (x_new τ_new)) ((x_old τ_old) ... (x_new τ_new))])
  46.  
  47.  
  48. ;; capture-avoiding substitution (from mf)
  49. (define-metafunction Lambda0
  50.   subst-n : (x any) ... any -> any
  51.   [(subst-n (x_1 any_1) (x_2 any_2) ... any_3)
  52.    (subst x_1 any_1 (subst-n (x_2 any_2) ... any_3))]
  53.   [(subst-n any_3) any_3])
  54.  
  55. (define-metafunction Lambda0
  56.   subst : x any any -> any
  57.   ;; 1. x_1 bound, so don't continue in lambda body
  58.   [(subst x_1 any_1 (lambda (x_1 τ) any_2))
  59.    (lambda (x_1 τ) any_2)
  60.    #;(side-condition (not (member (term x_1)
  61.                                 (term (x_2 ...)))))]
  62.   ;; 2. general purpose capture avoiding case
  63.   [(subst x_1 any_1 (lambda (x_2 τ) any_2))
  64.    (lambda (x_new τ)
  65.      (subst x_1 any_1
  66.             (subst-vars (x_2 x_new)
  67.                         any_2)))
  68.    (where x_new
  69.           ,(variables-not-in
  70.             (term (x_1 any_1 any_2))
  71.             (term (x_2))))]
  72.   ;; 3. replace x_1 with e_1
  73.   [(subst x_1 any_1 x_1) any_1]
  74.   ;; 4. x_1 and x_2 are different, so don't replace
  75.   [(subst x_1 any_1 x_2) x_2]
  76.   ;; the last cases cover all other expressions
  77.   [(subst x_1 any_1 (any_2 ...))
  78.    ((subst x_1 any_1 any_2) ...)]
  79.   [(subst x_1 any_1 (op any_2 ...))
  80.    (op (subst x_1 any_1 any_2) ...)]
  81.   [(subst x_1 any_1 (fix any_2 ...))
  82.    (fix (subst x_1 any_1 any_2) ...)]
  83.   [(subst x_1 any_1 any_2) any_2])
  84.  
  85. (define-metafunction Lambda0
  86.   subst-vars : (x any) ... any -> any
  87.   [(subst-vars (x_1 any_1) x_1) any_1]
  88.   [(subst-vars (x_1 any_1) (any_2 ...))
  89.    ((subst-vars (x_1 any_1) any_2) ...)]
  90.   [(subst-vars (x_1 any_1) any_2) any_2]
  91.   [(subst-vars (x_1 any_1) (x_2 any_2) ... any_3)
  92.    (subst-vars (x_1 any_1)
  93.                (subst-vars (x_2 any_2) ... any_3))]
  94.   [(subst-vars any) any])
Add Comment
Please, Sign In to add comment