2016-12-22 46 views
4

每次我在PLT redex中定義一種語言時,我需要手動定義一個(捕獲避免)替換函數。例如,這種模式還沒有完成,因爲subst沒有定義:plt-redex:捕獲 - 免費替代?

#lang racket/base 
(require redex/reduction-semantics) 

(define-language Λ 
    [V ::= x (λ x M)] 
    [M ::= (M M) V] 
    [C ::= hole (V C) (C M)] 
    [x ::= variable-not-otherwise-mentioned]) 

(define -->β 
    (reduction-relation Λ 
    [--> (in-hole C ((λ x M) V)) 
     (in-hole C (subst M x V))])) 

subst的定義是顯而易見的。 PLT redex可以自動處理替代嗎?

回答

4

是的!只需使用#:binding-forms聲明來描述您的語言的綁定結構。

這裏是通過substitute功能與捕獲避免替換一個類似的模式:(!謝謝Paul Stansifer

#lang racket/base 
(require redex/reduction-semantics) 

(define-language Λ 
    [V ::= x (λ x M)] 
    [M ::= (M M) V] 
    [C ::= hole (V C) (C M)] 
    [x ::= variable-not-otherwise-mentioned] 
    #:binding-forms 
    (λ x M #:refers-to x)) ;; "term M refers to the variable x" 

(define -->β 
    (reduction-relation Λ 
    [--> (in-hole C ((λ x M) V)) 
     (in-hole C (substitute M x V))])) 

(apply-reduction-relation -->β 
    (term ((λ x (λ y x)) y))) 
;; '((λ y«2» y)) 

字母等效免費的午餐也看到alpha-equivalent?

+1

嘿,奔!我和至少一個人(也是一個沒有經驗的殺手)很難分析'指稱'條款。特別是,不清楚的是,可以引用有界變量的術語是最接近'#:指向'左邊的那個術語。在老的lambda中,這並不重要。在'let x = M in M'的情況下它變得相關。也許,爲了子孫後代,注意'(讓x = M in M#:指x)'就像預期的那樣工作。也就是說,'x'只在第二個'M'中被綁定。 –